Nginx+Apache

1、配置EPEL YUM源
rpm -ivh http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm

2、检查是否安装成功
ll /etc/yum.repos.d/
3、安装nginx并配置

yum -y install nginx

检查:whereis nginx

说明:配置文件在/etc/nginx目录下,主配置文件是/etc/nginx/nginx.conf
(配置前先备份)
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

vi /etc/nginx/nginx.conf
修改如下内容(参考nginx配置文件详解)
worker_processes 4;
tcp_nopush on;
server_tokens off;

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/test.conf
说明:/etc/nginx/conf.d/中conf文件结尾的都会自动加载的

vi /etc/nginx/conf.d/test.conf

#具体说明参考(nginx虚拟主机配置)
server {
listen 80;
server_name 192.168.1.187;
root /var/www/html;
location ~ .*\.(php)$ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /\.ht {
deny all;
}
}
}

#具体说明参考(nginx虚拟主机配置)
vi /etc/nginx/conf.d/proxy.conf

proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding ”;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
client_body_temp_path /tmp;#第一次上传文件总是出错,结果发现是这里的问题!
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 32 4k;
proxy_busy_buffers_size 64k;

#具体说明参考(nginx虚拟主机配置)
gzip on;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_proxied any;
gzip_vary on;
gzip_buffers 4 16k;
gzip_min_length 1100;
gzip_types text/plain text/css application/xml application/xhtml+xml application/rss+xml application/atom_xml application/javascript application/x-javascript;

4、安装apache并配置
#如果已经安装apache请跳过安装
yum -y install httpd
(修改配置前请备份文件)
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak

vi /etc/httpd/conf/httpd.conf

Listen 80改成Listen 8080

DocumentRoot “/var/www/html”修改成你网站根目录(建议建立虚拟主机)

ServerSignature On改成ServerSignature Off
AllowOverride None改成 AllowOverride All
ServerTokens OS改为ServerTokens Prod
#NameVirtualHost *:80修改为NameVirtualHost *:8080(注意去掉#)
Include conf.d/*.conf#注意这里是加载conf.d目录配置文件
5、建立虚拟主机(这里为了统一管理也建立在test.conf中)

vi /etc/httpd/conf.d/test.conf

<VirtualHost *:8080>
DocumentRoot /var/www/html
ServerName 192.168.1.187
ErrorLog logs/test-error_log
CustomLog logs/test-access_log common
</VirtualHost>

6、检查配置文件
httpd -t

httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain for ServerName

这样的警告解决办法是:vi /etc/httpd/conf/httpd.conf
ServerName localhost

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

httpd -t
Syntax OK

7、这里就省去PHP和Mysql的安装了,直接进入测试
查看防火墙是否关闭 iptables -L(如果没有关闭使用service iptables stop)
启动nginx和apache
service nginx start
service httpd start

vi /var/www/html/index.php内容为

<?php
$i = 20;
echo $i;

8、框架是否能用呢?(这里测试zend Framework框架)

Fatal error: Uncaught exception ‘Zend_Db_Adapter_Exception’ with message ‘The PDO extension is required for this adapter but the extension is not loaded’ in /var/www/library/Zend/Db/Adapter/Pdo/Abstract.php:342 Stack trace: #0 /var/www/library/Zend/Db/Adapter/Abstract.php(247): Zend_Db_Adapter_Pdo_Abstract->setFetchMode(2) #1 /var/www/library/Zend/Db.php(270): Zend_Db_Adapter_Abstract->__construct(Array) #2 /var/www/library/Zend/Application/Resource/Db.php(142): Zend_Db::factory(‘PDO_MYSQL’, Array) #3 /var/www/library/Zend/Application/Resource/Db.php(154): Zend_Application_Resource_Db->getDbAdapter() #4 /var/www/library/Zend/Application/Bootstrap/BootstrapAbstract.php(683): Zend_Application_Resource_Db->init() #5 /var/www/library/Zend/Application/Bootstrap/BootstrapAbstract.php(626): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource(‘db’) #6 /var/www/library/Zend/Application/Bootstrap/BootstrapAbstract.php(586): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #7 /var/www/library/Zend/Applicatio in /var/www/library/Zend/Db/Adapter/Pdo/Abstract.php on line 342
这样的错误提示是因为木有pdo扩展,安装即可

 

PHP模拟GET和POST提交数据

 /*
     *@param String  $url是请求地址 
     *@param Array $getData 是GET数据
     *@param Array $postData
     */
    public function Http($url, $getData, $postData)
    {
        if (!is_string($url) || (!is_array($getData)) || (!is_array($postData))) {
        	return '';
        }
        //读取url后面参数
        $parse_url = parse_url($url);
        $urldata = $parse_url['query'];
        parse_str($urldata, $get);
        //整合两部分get数据
        $getData = array_merge($getData, $get);
        $param = "?".http_build_query($getData);//注意这里http_build_query已经将参数urlencode处理
        $url_with_get = $url.$param;
        if (function_exists('curl_init')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url_with_get);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $result = curl_exec($ch);
            curl_close($ch);
            return $result;
        } else {
            $content = http_build_query($postData);
            $content_length = strlen($content);
            $context = array(
                    'http' =>
                    array(
                            'method' => 'POST',
                            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
                            'header' => 'Content-Type: ' . 'text/html' . "\r\n" .
                            'Content-Length: ' . $content_length,
                            'content' => $content
                    )
            );
            $context_id = stream_context_create($context);
            $sock = fopen($url_with_get, 'r', false, $context_id);
            $result = '';
            if ($sock) {
                while (!feof($sock)){
                    $result .= fgets($sock, 4096);
                }
                fclose($sock);
            }
            return $result;
        }
    }

使用方法:(很简单的一个例子)

        $url = 'http://192.168.1.180/index/get.php?name=中文&b=host';
        //POST数据
        $post = array('sign' => md5('Joyous'));
        //GET数据
        $get = array('host' => 'blog.phpfs.com','name' => '中文ss');
        echo Http($url, $get, $post);

测试结果:(get.php代码如下)

        var_dump($_GET);
        var_dump($_POST);

array (size=2)
‘name’ => string ‘中文’ (length=6)
‘b’ => string ‘host’ (length=4)
array (size=1)
‘sign’ => string ‘2b561e261cf789b507a222faea3e69f3’ (length=32)

Zend_Http之Zend_Http_Response

有人就问了这个文章中只是负责发送http://blog.phpfs.com/archives/1628.html,我想知道发送结果和处理内容?于是乎就有了Zend_Http_Response的介绍和使用

对于由Zend_Http_Client – 介绍返回的应答(Response)信息,Zend_Http_Response 可以提供简单的访问方式。 它提供一组友好的方法来获得从请求返回的应答信息:

isError(): 如果收到HTTP出错状态的代码,返回TRUE, 否则返回FALSE.

isSuccessful(): 如果得到HTTP请求成功的状态代码,返回TRUE, 否则返回FALSE.

isRedirect(): 如果得到HTTP重定向的状态代码,返回TRUE, 否则返回FALSE.

getStatus(): 返回HTTP请求的状态代码.

getHeaders(): 以数组的形式返回HTTP请求头部信息的字符串.

getBody(): 返回HTTP正文内容(字符串).

例子:(参考模拟GET和POST操作)
//处理返回结果
$response = $client->request();
if ($response->isSuccessful()) {
echo $response->getBody();
}
/index/get方法中内容如下:
var_dump($_GET);
var_dump($_POST);
输出内容:
array (size=4)
‘host’ => string ‘blog.phpfs.com’ (length=14)
‘first_name’ => string ‘blog’ (length=4)
‘middle_name’ => string ‘phpfs’ (length=5)
‘made_in’ => string ‘com’ (length=3)
array (size=3)
‘language’ => string ‘ch’ (length=2)
‘country’ => string ‘zh’ (length=2)
‘selection’ => string ‘123’ (length=3)

Zend_Http之Zend_Http_Client

$client = new Zend_Http_Client(‘http://192.168.1.180/index/get’, array(
‘maxredirects’ => 0,
‘timeout’ => 30));
// 上述代码和下面的代码是两种不同的写法
$client = new Zend_Http_Client();
$client->setUri(‘http://192.168.1.180/index/get’);
$client->setConfig(array(
‘maxredirects’ => 0,
‘timeout’ => 30));
//参数说明
maxredirects 随后的重定向的最大值 (0 = none) 整数 默认为0
strict 是否执行头部名称的确认,当设置为 False 时,将忽略确认,通常情况下不应改变这个参数的值。 布尔值 默认为 true
strictredirects 重定向时是否严格遵守 RFC 布尔值 默认为 false
useragent 用户代理的识别字符串(含在请求的头部信息内) 字符串 默认’Zend_Http_Client’
timeout 连接超时 (单位是秒) 整数 默认10
httpversion HTTP 协议版本 (通常是 ‘1.1’ 或 ‘1.0’) 字符串 默认1.1
adapter 连接适配器类时使用 多种类型 默认Zend_Http_Client_Adapter_Socket
keepalive 是否允许与服务器之间的 keep-alive 连接。如果在同一台服务器上 执行几个互相关联的请求时,keep-alive 连接是有用的而且有可能提高性能。 布尔值 默认 false
storeresponse 是否保存上次的响应结果,以备今后使用getLastResponse()重新获取。如果设置为 false,getLastResponse() 将返回空 布尔值 true

Continue reading

XML转成Json,数组转成Json,Json转成数组

1、数据交互经常用到XML或者Json,其中Json数据居多(优点不多说)

2、ZendFrameWork中如何将XML转换成Json以及数组和Json转换

直接上例子:
$arr = array(‘status’ => 1, ‘info’ => ‘json测试’, ‘data’ => array(‘name’ => ‘用户名’, ‘password’ => ‘blog.phpfs.com’));
//数组转Json
$json = Zend_Json::encode($arr);//$json = json_encode($arr);
echo $json;
//json转数组
$arr = Zend_Json::decode($json);//$json = json_decode($json);
var_dump($arr);
//xml数据转json
$xmlStr = file_get_contents(‘test.xml’);
$jsonContents = Zend_Json::fromXml($xmlStr, true);
echo $jsonContents;
注意:(ZendFrameWork官方提示)
Zend_Json::fromXml() 函数执行 XML 格式的字符串输入和返回等同的 JSON 格式字符串的输出的转换,
如果有任何 XML 输入格式错误或者转换逻辑错误,它将抛出一个异常。转换逻辑也使用递归技术来遍历 XML 树,
它支持 25 级递归,如果递归超过这个深度,它将抛出一个 Zend_Json_Exception

附:test.xml



    
        Xml转Json
        JoyousPHPer
        blog.phpfs.com
    
    
        安卓应用开发
        androidgoogle
        Joyous
    

 

相关推荐:PHP操作XMLhttp://blog.phpfs.com/archives/888.html

安卓开发之dip,dp,px,sp

1、dip device independent pixels(设备独立像素).
不同设备不同的显示效果,这个和设备硬件有关,
一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)

2、dp 等同于dip一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。

3、px pixels(像素) 屏幕上的点,不同设备不同的显示屏显示效果相同,这是绝对像素,是多少就永远是多少不会改变。

4、sp scaled pixels — best for text size (放大像素)(与刻度无关的像素):主要处理字体的大小。
与dp类似,但是可以根据用户的字体大小首选项进行缩放

根据google的推荐,像素统一使用dip,字体统一使用sp
附:网络推荐
1、px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}

安卓开发遇到的奇葩问题

第一个问题:R cannot be resolved to a variable

来自网络:

Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用。。。

1. 检查Android 的SDK是否丢失需要重新下载,检查build path
2.确保class没有import Android.R;
3,错误class引用的layout的xml文件没有错误
4.检查AndroidManifest.xml文件,里边的package,layout配置文件,strings.xml等的字符串全部书写正确
5.layout的xml文件中引用的strings.xml中的字符串拼写完全正确
6.在layout 的xml文件手写添加一个控件,看id能否在R.java中自动生成,如果不能,那很大可能就是这个layout 的xml文件有问题,查看格式是否使用正确,或者包含什么非法字符串,或者调用到了不正确的字符串,等等,可以使用排除法,挨个去掉控件,直到发现error message消失或者id能在R.java中自动生成。
7.删掉gen文件夹,使R.java重新自动生成一次,如果不能生成,继续检查layout的xml文件是否有如上不易发觉的问题
8.Clean project ,重新build,或者重新import project。
9.重启eclipse
10.重启电脑,以防Android 虚拟机的问题

第二个问题:Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

造成原因:我删除了tools,结果重装之后还是提示这个。。

已久来自网络:去sdkmanager里把android sdk platform-tools删掉再重装。

 

sed简单用法

sed 命令:可以利用scrpipt命令批处理文本文件
sed [-hVn][-e<script>][-f<script>]
-n 不显示处理过程
参数
-e 执行命令
-h 打印帮助
-V 版本
-n 不显示执行过程
-f sed脚本文件
例子:
替换1.txt文件中的www为123
sed -e ‘s/www/123/g’ ./a.txt
如果需要保存替换结果
sed -e ‘s/www/123/g’ ./a.txt >>./b.txt
或者sed -ie ‘s/www/123/g’ a.txt
替换指定目录下所有文件,/var/www/html下所有目录
sed -i ‘s/www/123/g’ `grep www -rl /var/www/html`