邢栋博客

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

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);
php用redis存储session数据(附一个简单的类)
php用redis存储session数据(附一个简单的类)
在php.ini中配置
session.save_handler = Redis
session.save_path = "tcp://localhost:6379"
或者在php文件中配置的,
ini_set('session.save_handler','Redis');
ini_set('session.save_path','tcp://localhost:6379');

<?php
class RedisSession{

private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime=30;

public function __CONSTRUCT(){
$this->redis = new Redis();
$this->redis->connect('127.0.0.1',6379);
$retval = session_set_save_handler(
array($this,'open'), 
array($this,'close'), 
array($this,'read'), 
array($this,'write'), 
array($this,'destroy')
array($this,'gc')
);
session_start();
}

public function open($path,$name){
return true;
}

public function close(){
return true;
}

public function read($id){
$value = $this->redis->get($id);
if($value){
return $value;
}else{
return '';
}
}

public function write($id,$data){
if($this->redis->set($id,$data)){
$this->redis->expire($id,$this->sessionExpireTime);
return true;
}
return false;
}

public function destroy($id){
if($this->redis->delete($id)){
return true;
}
return false;
}

public function gc($maxlifetime){
return true;
}

public function __DESTRUCT(){
session_write_close();

}

}


?>

在新建两个文件,test1.php
<?php
include('RedisSession.php');
new RedisSession();
$_SESSION['name'] = 'xingdong';
?>

test2.php

<?php
include('RedisSession.php');
new RedisSession();
echo $_SESSION['name'];
?>

初识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


linux下memcache以及其php扩展的安装

安装memcache ,先下载

1.首先安装依赖包libevent

yum –y install libevent *
2. 主包已经安装,别忘记安装libevent-devel*,不然./configure过不去
tar xzf /lamp/memcached-1.4.10.tar.gz 解压memcached
cd /lamp/memcached-1.4.10 进入 memcached目录
./configure --prefix=/usr/local/memcache 配置
make && make install 编译与安装
useradd memcache 添加memcache用户

3.因为系统不能用root运行memcache软件
/usr/local/memcache/bin/memcached –umemcache & #后台运行
netstat –tunpl|grep :11211 查看端口
telnet 192.168.10.1 11211 连接测试
stats memcache命令:查看当前状态
4.写入自启动:
vi /etc/rc.local
/usr/local/memcache/bin/memcached –umemcache &
5.如何杀掉后台进程
pkill memcached

安装php memcache扩展
Liunx系统下:
– tar zxvf memcache-2.2.5.tgz 解压软件包
– cd memcache-2.2.5 进入目录
– /usr/local/php/bin/phpize 生成配置环境
– ./configure --with-php-config=/usr/local/php/bin/php-config
配置
– make && make install 编译和安装
修改php.ini
– extension_dir = "/usr/local/php//lib/php/extensions/no-debug-non-zts-
20060613/“
– extension="memcache.so";
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>";  
php计算二维数组中某个key的集合
$array(类似于这个数组)
Array ( [0] => Array ( [id] => 3 [name]=>'aaa') [1] => Array ( [id] => 4 [name]=>'bbb') [2] => Array ( [id] => 13 [name]=>'ccc') );

方法1
$ids = array(); 
$ids = array_map('array_shift', $array); 

方法2(php>=5.5)
$ids = array(); 
$ids = array_column($array, 'id'); 

方法3
$names = array(); 
$names = array_reduce($array, create_function('$v,$w', '$v[$w["id"]]=$w["name"];return $v;')); 

优惠券
广告位-淘宝
最新微语