邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

关于HTTP Keep-Alive
在http早期,每个http请求都要求打开一个tcp socket连接,并且使用一次之后就断开这个tcp连接。

使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。

但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。

$ch = curl_init ();
$header = array ();
$header [] = 'Content-Type: application/json; charset=utf-8';
$header [] = 'Connection: keep-alive';
$header [] = 'Keep-Alive: 120';
curl_setopt ( $ch, CURLOPT_URL, 'http://xingdong365.com/aboutme' );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); //设置是否显示头信息
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); //设定是否输出页面内容
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
$datas =  curl_exec ( $ch );

php curl并发测试

test.php

<?php 

function multiCurl($res, $options=""){
    if(count($res)<=0) return False;
    $handles = array();
    if(!$options) // add default options
        $options = array(
            CURLOPT_HEADER=>0,
            CURLOPT_RETURNTRANSFER=>1,
            CURLOPT_TIMEOUT=>1,//超时时间
        );
    // add curl options to each handle
    foreach($res as $k=>$row){
        $ch{$k} = curl_init();
        $options[CURLOPT_URL] = $row['url'];
        $opt = curl_setopt_array($ch{$k}, $options);
        var_dump($opt);
        $handles[$k] = $ch{$k};
    }
    $mh = curl_multi_init();
    // add handles
    foreach($handles as $k => $handle){
        $err = curl_multi_add_handle($mh, $handle);            
    }
    $running_handles = null;
    do {
        curl_multi_exec($mh, $running_handles);
        curl_multi_select($mh);
    } while ($running_handles > 0);
        foreach($res as $k=>$row){
            $res[$k]['error'] = curl_error($handles[$k]);
            if(!empty($res[$k]['error']))
                $res[$k]['data']  = '';
            else
                $res[$k]['data']  = curl_multi_getcontent( $handles[$k] );  // get results

            // close current handler
            curl_multi_remove_handle($mh, $handles[$k] );
        }
        curl_multi_close($mh);
        return $res; // return response
}
$res = array( 
    "0"=>array("url"=>"http://localhost/curl/test1.php"), 
    "1"=>array("url"=>"http://localhost/curl/test2.php"), 
    "2"=>array("url"=>"http://localhost/curl/test3.php"), 

); 
echo "<pre>";
print_r( multiCurl($res)); 
echo "</pre>";
?> 

---------------------------------------------------------------------------

test1.php

<?php

    sleep(1);

    echo test1;

?>

test2.php

<?php

    sleep(2);

    echo test2;

?>

test3.php

<?php

    sleep(3);

    echo test3;

?>

php curl函数设置毫秒级超时时间
$ch = curl_init($url);//设置需要获取的URL地址,或者$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);    //注意,毫秒超时一定要设置这个
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); //超时时间100毫秒
curl_exec($ch);
curl_close($ch);
smarty模板配置参数
<?php
//引入Smarty模板类
require_once("../Smarty/libs/Smarty.class.php");
//实例化Smarty类对象
$smarty=new Smarty;
//是否使用缓存,项目调试期间,不建议启用缓存
$smarty->caching=false;
//缓存生命周期
$smarty->cache_lifetime=120;
//设置配置目录
$smarty->setConfigDir("../configs");
//设置模板目录
//$smarty->template_dir="../templates";//老版本
$smarty->setTemplateDir("../templates");
//设置编译目录351721199305168049
//$smarty->compile_dir="../templates_c";//老版本
$smarty->setCompileDir("../templates_c");
//缓存文件夹
//$smarty->cache_dir="../smarty_cache";//老版本
$smarty->setCacheDir("../smarty_cache");
//左右边界符,默认是{},但实际应用中容易与JavaScript冲突,可以设计为<{ and }>这样的形式
$smarty->left_delimiter="<{";
$smarty->right_delimiter="}>";

//示例
$smarty -> assign("title","hello world");
$smarty -> display("hello.tpl");

?>

初识php7

初识php7

php7 新特性

变量类型
php7版本函数的参数和返回值增加了类型限定。
加入类型,实际上是为了php7.1版本的JIT特性做准备,增加类型后的php JIT可以正确判断变量类型,生成最佳的机器指令。
JIT:是just in time,即时编译技术,表示运行时将指令转化为二进制机器码。
对于计算机密集型的程序,JIT可以将PHP的OpCode直接转换为机器码,大幅度提升性能,将在php7.1版本带有此特性

function test(int $a,string $b,array $c):int{
//code
}

错误异常
php程序出错后过去zend引擎会发生致命错误并终止程序运行,php7 可以使用try/catch捕获错误
try{
not_exists_func();
}catch(EngineException $e){
echo "Exception:($e->getMessage())":
}

php7性能优化

zval 使用栈内存
在zend引擎和扩展中,经常要创建一个php的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配

一个ZVAL内存。而php7可以直接使用栈内存。
php5
zavl *val;MAKE_STD_ZVAL;
php7
zval val;

zend_string存储hash值,array查询不再需要重复计算hash
php7为字符串单独创建了新类型叫做zend_string,除了char*指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。

数组键值查找不需要反复计算hash值。
struct _zend_string{
zend_refcounted gc;
zend_ulong h;
size_t len;
char val[1];


hashtable桶内直接存数据,减少内存申请次数,提升了cache命中率和内存访问速度。
zend_parse_parameters改为宏实现,性能提升5%
新增加4种OPCODE,call_user_function,is_int/string/array,strlen,defined 4个函数变为php OpCode指令,速度更快
其他更多性能优化,如基础类型int float bool 等改为直接进行拷贝,排序算法改进,PCRE with JIT,execute_data和opline进
行全局寄存器,使用gdb4.8的PGO功能

php7 安装

下载地址:
https://downloads.php.net/~ab/
下载解压后进入目录 
./configure --prefix=/lnmp/php7  //或者加载更多模块./configure --prefix=/lnmp/php7 --with-mysql --with-gd --with-curl
make -j 4
make install 

//php -m 查看安装了的模块
./configure --prefix=/lnmp/php7 --with-mysql --with-gd --with-curl --enable-fpm


然后 cd ~ 回到root 目录下

mkdir php

vim index.php

输入<?php  phpinfo(); ?>

执行/lnmp/php7/bin/php -S 0.0.0.0:80

然后再通过你的服务器ip就可以访问了 


QQ截图20151002121536.png


php驼峰字符串转换成下划线样式
<?php

$str = 'OpenAPI';

//方法1

// $length = mb_strlen($str);
// $new = '';
// for($i = 0; $i < $length; $i++)
// {
//  $num = ord($str[$i]);
//  $pre = ord($str[$i - 1]);
//  $new .= ($i != 0 && ($num >= 65 && $num <= 90) && ($pre >= 97 && $pre <= 122)) ? "_{$str[$i]}" : $str[$i];
// } 
// echo strtolower($new) . '<br>';
//方法2
echo strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $str)).'<br>';

?>
php实现数字转为汉字金额(转)

<?php

header("Content-type:text/html;charset=utf-8");

 /**
* 数字转换为中文
* @param  string|integer|float  $num  目标数字
* @param  integer $mode 模式[true:金额(默认),false:普通数字表示]
* @param  boolean $sim 使用小写(默认)
* @return string
*/
 function number2chinese($num,$mode= true,$sim= true){
    if(!is_numeric($num)) return'含有非数字非小数点字符!';
    $char   = $sim? array('零','一','二','三','四','五','六','七','八','九')
    : array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
    $unit   = $sim? array('','十','百','千','','万','亿','兆')
    : array('','拾','佰','仟','','萬','億','兆');
    $retval = $mode? '元':'点';
    //小数部分
    if(strpos($num, '.')){
        list($num,$dec) = explode('.', $num);
        $dec= strval(round($dec,2));
        if($mode){
            $retval.= "{$char[$dec['0']]}角{$char[$dec['1']]}分";
        }else{
            for($i= 0,$c= strlen($dec);$i< $c;$i++) {
                $retval.= $char[$dec[$i]];
            }
        }
    }
    //整数部分
    $str= $mode? strrev(intval($num)) : strrev($num);
    for($i= 0,$c= strlen($str);$i< $c;$i++) {
        $out[$i] = $char[$str[$i]];
        if($mode){
            $out[$i] .= $str[$i] != '0'? $unit[$i%4] : '';
                if($i>1 and$str[$i]+$str[$i-1] == 0){
                $out[$i] = '';
            }
                if($i%4 == 0){
                $out[$i] .= $unit[4+floor($i/4)];
            }
        }
    }
    $retval= join('',array_reverse($out)) . $retval;
    return$retval;
 }
 //实例调用=====================================================
$num= '0123648867.789';
echo$num,'<br>';
 //普通数字的汉字表示
echo'普通:',number2chinese($num,false),'';
echo'<br>';
 //金额汉字表示
echo'金额(简体):',number2chinese($num,true),'';
echo'<br>';
echo'金额(繁体):',number2chinese($num,true,false);
windows下php安装扩展pthreads实现php多线程
一、下载pthreads扩展
下载地址:http://windows.php.net/downloads/pecl/releases/pthreads
我下载的是php_pthreads-2.0.9-5.5-ts-vc11-x64.zip //5.5对应的是php版本,64位是系统位数
二、安装pthreads扩展
复制php_pthreads.dll 到目录 bin\php\ext\ 下面。(D:\wamp\bin\php\php5.5.12\ext)
复制pthreadVC2.dll 到目录 bin\php\ 下面。(D:\wamp\bin\php\php5.5.12)
复制pthreadVC2.dll 到目录 C:\windows\system32 下面。
打开php配置文件php.ini。在后面加上extension=php_pthreads.dll
提示!Windows系统需要将 pthreadVC2.dll 所在路径加入到 PATH 环境变量中。
我的电脑--->鼠标右键--->属性--->高级--->环境变量--->系统变量--->找到名称为Path的--->编辑--->在变量值最后面加上pthreadVC2.dll的完整路径(C:\WINDOWS\system32\pthreadVC2.dll)。

访问phpinfo.php  可以看到 pthreads扩展

测试pthreads扩展
class AsyncOperation extends \Thread {
public function __construct($arg){
$this->arg = $arg;
}
public function run(){
if($this->arg){
printf("Hello %s\n", $this->arg);
}
}
}
$thread = new AsyncOperation("World");
if($thread->start())
$thread->join();

运行以上代码出现 Hello World,说明pthreads扩展安装成功! 

例子:
header("Content-type:text/html;charset=utf-8");
class test extends \Thread {
public $url;
public $result;

public function __construct($url) {
$this->url = $url;
}

public function run() {
if ($this->url) {
$this->result = model_http_curl_get($this->url);
}
}
}
function model_http_curl_get($url) {
$curl = curl_init();  
curl_setopt($curl, CURLOPT_URL, $url);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_TIMEOUT, 5);  
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');  
$result = curl_exec($curl);  
curl_close($curl);  
return $result;  
}
for ($i = 0; $i < 10; $i++) {
$urls[] = 'http://www.baidu.com/s?wd='. rand(10000, 20000);
}
/* 多线程速度测试 */
$t = microtime(true);
foreach ($urls as $key=>$url) {
$workers[$key] = new test($url);
$workers[$key]->start();
}
foreach ($workers as $key=>$worker) {
while($workers[$key]->isRunning()) {
usleep(100);  
}
if ($workers[$key]->join()) {
var_dump($workers[$key]->result);
}
}
$e = microtime(true);
echo "多线程耗时:".($e-$t)."秒<br>";  
/* 单线程速度测试 */
$t = microtime(true);
foreach ($urls as $key=>$url) {
var_dump(model_http_curl_get($url));
}
$e = microtime(true);
echo "For循环耗时:".($e-$t)."秒<br>";  

优惠券
最新微语