[最好语言]PHP下的fastcgi使用fastcgi_finish_request真的提高页面响应速度无副作用?与session锁的一个相关性问题的探讨性性业余非正式研究。
Php/Js/Shell/Go jackxiang 2015-10-23 16:38
背景:提高了性能,任何事情都可以辩证的看,稳定性于鲁棒性,光的波粒二象性,凡事都有两面性,如戴眼镜虽然可以装丝文,但是雨中漫步的时候容易撞电线杆;抽烟可以让身上有女生喜欢的淡淡烟草味,但是会危害周围人的健康;醉酒虽然可以让人精神愉悦,但是会说出真话,这些都是我的亲身体验.......写不下去了。
wintiongXX - sng<wintiXX@gmail.com> 14:39:09
php里哪个函数,是可以在php执行过程中直接响应nginx,但是让php继续执行?
cody(2501385XX) 14:40:44
fastcgi_finish_request();
wintiongXX - sng<wintiXX@gmail.com> 14:41:22
我就记得有这个函数,一时想不起来了
@cody
X哥chen(X哥)<blXXX.c@163.com> 14:45:09
用fastcgi_finish_request要注意一下,
如果fastcgi_finish_request"之后", 到整个程序完成的时间还很久或有其他的阻塞调用,
当前进程是无法处理请求的, 可能导致各种问题
wintiongXX - sng<wintiXX@gmail.com> 14:46:23
这个知道的,其实总体而言进程耗时没变化,只是有些东西没必要让用户等你
erikYXXX-TEG(744366XXX) 14:48:32
使用这个函数不能使用file存储session(使用其他存储也需要关掉session 锁)。不然用户A第一次持有session访问,如果后续操作有耗时操作,用户的session会被锁住,导致后续访问卡住。
问苍天个猫(13427XXX) 15:01:35
可以提前session_write_close啊
erikYXXX-TEG(744366XXX) 15:01:59
也是可以的。
——————扯淡开始———————
JackX-回忆未来有甚用(372647XXX) 16:19:27
请问各位弟兄们,这两个函数放在一块有啥区别:
1.PHP ignore_user_abort() 函数, ignore_user_abort(true); php关闭浏览器还能运行函数。
2. fastcgi_finish_request();
都解决了啥么子问题???
JackX-回忆未来有甚用(372647XXX) 16:24:06
我问的问题就没一个人接一个?还是认为我不是搞PHPer的啊
问题太肤浅?
allendai<snowheart.dai@gmail.com> 16:24:56
没用过。。
JackX-回忆未来有甚用(372647XXX) 16:27:31
我只是好奇,哈哈~
你说这些鸡肋功能开发出来有毛用啊,还好天峰说没有之一,哈哈。
Ran-韩最好语言(128112XX) 16:29:13
因为PHP设计之初只有 请求开始到请求结束 这段生命周期,后面的它控制不了。各种函数的出现就是为了弥补这个缺陷。
JackX-回忆未来有甚用(372647XXX) 16:29:16
PHP ignore_user_abort() 函数,我用来做一些导表由PHP从A到B做下逻辑导入数据库,浏览器上访问下容易超时,于是用到。
至于这个: fastcgi_finish_request(); 我也是听x哥在说,于是问下,都用来干嘛子?上传视频后-》转码->入库->推前台,第二三四都可以连接起来???
Ran-韩最好语言(128112XX) 16:29:28
使用消息队列异步处理才是正途。
erikYXXX-TEG(744366XXX) 16:29:54
php session lock主要是各个session促出模块实现自己实现的锁。默认的session 存储是文件,实现是在打开之前flock session文件。如果选择memcached存储session,锁是在memcache扩展里面实现的。
如果自己实现SessionHandler接口存储,可以选择不实现锁。
fastcgi_finish_request 可以提前把结果返回给nginx,之后脚本还可以保留上下文执行一些任务,可以算是伪异步。最好还是使用MQ来异步处理任务。
allendai<snowheart.dai@gmail.com> 16:30:06
……用浏览器调用导入程序
这就是你的不专业了
JackX-回忆未来有甚用(372647XXX) 16:31:05
我觉得也是,所以我觉得兄弟们都是专业的,
可为何发明这个鸡肋功能,有点玩的感觉哟。
结论:
X哥chen(X哥)<blXXX.c@163.com> 16:38:59
+1
异步化才是正途
wintiongXX - sng<wintiXX@gmail.com> 14:39:09
php里哪个函数,是可以在php执行过程中直接响应nginx,但是让php继续执行?
cody(2501385XX) 14:40:44
fastcgi_finish_request();
wintiongXX - sng<wintiXX@gmail.com> 14:41:22
我就记得有这个函数,一时想不起来了
@cody
X哥chen(X哥)<blXXX.c@163.com> 14:45:09
用fastcgi_finish_request要注意一下,
如果fastcgi_finish_request"之后", 到整个程序完成的时间还很久或有其他的阻塞调用,
当前进程是无法处理请求的, 可能导致各种问题
wintiongXX - sng<wintiXX@gmail.com> 14:46:23
这个知道的,其实总体而言进程耗时没变化,只是有些东西没必要让用户等你
erikYXXX-TEG(744366XXX) 14:48:32
使用这个函数不能使用file存储session(使用其他存储也需要关掉session 锁)。不然用户A第一次持有session访问,如果后续操作有耗时操作,用户的session会被锁住,导致后续访问卡住。
问苍天个猫(13427XXX) 15:01:35
可以提前session_write_close啊
erikYXXX-TEG(744366XXX) 15:01:59
也是可以的。
——————扯淡开始———————
JackX-回忆未来有甚用(372647XXX) 16:19:27
请问各位弟兄们,这两个函数放在一块有啥区别:
1.PHP ignore_user_abort() 函数, ignore_user_abort(true); php关闭浏览器还能运行函数。
2. fastcgi_finish_request();
都解决了啥么子问题???
JackX-回忆未来有甚用(372647XXX) 16:24:06
我问的问题就没一个人接一个?还是认为我不是搞PHPer的啊
问题太肤浅?
allendai<snowheart.dai@gmail.com> 16:24:56
没用过。。
JackX-回忆未来有甚用(372647XXX) 16:27:31
我只是好奇,哈哈~
你说这些鸡肋功能开发出来有毛用啊,还好天峰说没有之一,哈哈。
Ran-韩最好语言(128112XX) 16:29:13
因为PHP设计之初只有 请求开始到请求结束 这段生命周期,后面的它控制不了。各种函数的出现就是为了弥补这个缺陷。
JackX-回忆未来有甚用(372647XXX) 16:29:16
PHP ignore_user_abort() 函数,我用来做一些导表由PHP从A到B做下逻辑导入数据库,浏览器上访问下容易超时,于是用到。
至于这个: fastcgi_finish_request(); 我也是听x哥在说,于是问下,都用来干嘛子?上传视频后-》转码->入库->推前台,第二三四都可以连接起来???
Ran-韩最好语言(128112XX) 16:29:28
使用消息队列异步处理才是正途。
erikYXXX-TEG(744366XXX) 16:29:54
php session lock主要是各个session促出模块实现自己实现的锁。默认的session 存储是文件,实现是在打开之前flock session文件。如果选择memcached存储session,锁是在memcache扩展里面实现的。
如果自己实现SessionHandler接口存储,可以选择不实现锁。
fastcgi_finish_request 可以提前把结果返回给nginx,之后脚本还可以保留上下文执行一些任务,可以算是伪异步。最好还是使用MQ来异步处理任务。
allendai<snowheart.dai@gmail.com> 16:30:06
……用浏览器调用导入程序
这就是你的不专业了
JackX-回忆未来有甚用(372647XXX) 16:31:05
我觉得也是,所以我觉得兄弟们都是专业的,
可为何发明这个鸡肋功能,有点玩的感觉哟。
结论:
X哥chen(X哥)<blXXX.c@163.com> 16:38:59
+1
异步化才是正途
[实践OK]简单实现限定phpmyadmin访问ip的方法,phpadmin因PHP的session目录及自身目录权限引发错误解决。
Php/Js/Shell/Go jackxiang 2015-10-16 14:27
背景:在外面上面放一个phpmyadmin的发现阿里的云盾发现有人居然来试着访问,网上不安全。
攻击IP 攻击时间 攻击URL 攻击类型 处理结果
199.191.57.182 2015-10-16 05:29:33 101.20*.1*.**/phpmyadmin/scripts/setup.php Match1:/phpmyadmin/scripts/setup.php 其他 已拦截
——————————————————————————————————————————————————————————————————————
修改:config.inc.php
在第一行加入
$ip_prefix = '192.168.121.';
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip_prefix)) != $ip_prefix ) die('illegal access error');
ip可以设置成你自己电脑的ip。如果是内网建议直接设置成自己的ip地址取代ip地址段。这样的话可以防止其它用户在内网中访问。如果是公网ip限制,直接使用即可。
只是简单的限定,没有太大要求只是暂时限定,可以使用这种方式。临时性的限制用户去访问。
当然,也可以用foreach写成一个数组来处理..........
摘自:http://www.jb51.net/article/34509.htm
phpMyAdmin 因PHP的session目录及自身目录权限引发错误解决:
问题一:phpMyAdmin -Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
问题:打开phpmyadmin出现如下错误:Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
解决办法如下:
vim /etc/php5/apache2/php.ini
查找session.save_path ,将session.save_path=/var/lib/php5这一句的注释符号去掉。
如还不能正常工作,将session.auto_start的值改为1(启动),默认是0(禁用)
这个错误一般是由于session文件的存储路径不可写造成的,在linux下一般是路径的权限问题。在windows下面session.save_path一定要设置到一个可以读写的路径,如 D:/tmp 等。
摘自:http://blog.sina.com.cn/s/blog_62cd41130100uhpv.html
=====================================================================================
问题二:phpmyadmin错误Wrong permissions on configuration file, should not be world writable!
登录phpmyadmin,发现提示Wrong permissions on configuration file, should not be world writable!,提示配置文件必须不可写,这里改成755就OK了.
用以下命令 chmod -R 755 /home/wwwroot/phpmyadmin
摘自:http://www.111cn.net/phper/31/59722.htm
攻击IP 攻击时间 攻击URL 攻击类型 处理结果
199.191.57.182 2015-10-16 05:29:33 101.20*.1*.**/phpmyadmin/scripts/setup.php Match1:/phpmyadmin/scripts/setup.php 其他 已拦截
——————————————————————————————————————————————————————————————————————
修改:config.inc.php
在第一行加入
$ip_prefix = '192.168.121.';
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip_prefix)) != $ip_prefix ) die('illegal access error');
ip可以设置成你自己电脑的ip。如果是内网建议直接设置成自己的ip地址取代ip地址段。这样的话可以防止其它用户在内网中访问。如果是公网ip限制,直接使用即可。
只是简单的限定,没有太大要求只是暂时限定,可以使用这种方式。临时性的限制用户去访问。
当然,也可以用foreach写成一个数组来处理..........
摘自:http://www.jb51.net/article/34509.htm
phpMyAdmin 因PHP的session目录及自身目录权限引发错误解决:
问题一:phpMyAdmin -Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
问题:打开phpmyadmin出现如下错误:Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
解决办法如下:
vim /etc/php5/apache2/php.ini
查找session.save_path ,将session.save_path=/var/lib/php5这一句的注释符号去掉。
如还不能正常工作,将session.auto_start的值改为1(启动),默认是0(禁用)
这个错误一般是由于session文件的存储路径不可写造成的,在linux下一般是路径的权限问题。在windows下面session.save_path一定要设置到一个可以读写的路径,如 D:/tmp 等。
摘自:http://blog.sina.com.cn/s/blog_62cd41130100uhpv.html
=====================================================================================
问题二:phpmyadmin错误Wrong permissions on configuration file, should not be world writable!
登录phpmyadmin,发现提示Wrong permissions on configuration file, should not be world writable!,提示配置文件必须不可写,这里改成755就OK了.
用以下命令 chmod -R 755 /home/wwwroot/phpmyadmin
摘自:http://www.111cn.net/phper/31/59722.htm
【解决】无法载入 mcrypt 扩展,<br />请检查 PHP 配置 ...
Php/Js/Shell/Go jackxiang 2015-10-11 17:57
对于phpmyadmin“无法载入 mcrypt 扩展,<br />请检查 PHP 配置”的问题,我记得前段时间还有午饭提问过。
自己很长一段时间之前就遇过这个问题,但是也不知道怎么解决的,记得是安装过两个RPM包就搞定。
对于这个问题,可以发现网上发问的可是N多呀,普遍都经受这个折腾。
现在在自己的LNMP下重新进行了安装,也出现这个问题。当我再次尝试安装
libmcrypt-2.5.7-3.el5.remi.i386.rpm
php-mcrypt-5.1.6-1.el5.i386.rpm
不过得不到解决,于是我选择通过源码包编译安装libmcrypt-2.5.7.tar.gz ,并且重新编译到PHP中去,最终解决了
该问题。
#tar zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#./configure --prefix=/usr/local/libmcrypt
#make && make install
重新编译php:
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fastcgi --enable-fpm --enable-mbstring --with-mcrypt=/usr/local/libmcrypt/
这里顺便编译php的配置文件php.ini
extension=php_mbstring.dll 把这行前面的;去掉
然后重启mysql、php-fpm、nginx
重新登录phpmyadmin就不显示了。
————————————————————————————————————————————————————————
来自:http://bbs.51cto.com/thread-821175-1.html
自己很长一段时间之前就遇过这个问题,但是也不知道怎么解决的,记得是安装过两个RPM包就搞定。
对于这个问题,可以发现网上发问的可是N多呀,普遍都经受这个折腾。
现在在自己的LNMP下重新进行了安装,也出现这个问题。当我再次尝试安装
libmcrypt-2.5.7-3.el5.remi.i386.rpm
php-mcrypt-5.1.6-1.el5.i386.rpm
不过得不到解决,于是我选择通过源码包编译安装libmcrypt-2.5.7.tar.gz ,并且重新编译到PHP中去,最终解决了
该问题。
#tar zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#./configure --prefix=/usr/local/libmcrypt
#make && make install
重新编译php:
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fastcgi --enable-fpm --enable-mbstring --with-mcrypt=/usr/local/libmcrypt/
这里顺便编译php的配置文件php.ini
extension=php_mbstring.dll 把这行前面的;去掉
然后重启mysql、php-fpm、nginx
重新登录phpmyadmin就不显示了。
————————————————————————————————————————————————————————
来自:http://bbs.51cto.com/thread-821175-1.html
JS邮箱正则判断,正则表达式验证邮箱。
Php/Js/Shell/Go jackxiang 2015-9-29 10:54
背景:正则是一门厚书啊,想写好也不容易,但日常中也就那些像电话、邮箱、手机,网上一堆,但真好验证好了,还得了解一点正则知识,再就是多测试了:-)
下面邮箱正则:
中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的。按照DNS的标准,域名是不允许有下划线的。
下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便。
二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大了范围但问题不大,主要是起到提示用户就可以了。
com.cn域名支持:((\.[a-zA-Z0-9-]{2,3}){1,2} com.cn
——————————————————————————————————————————————————————————————
//emailpreg = /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/; //这个对QQ号的邮箱验证不了。
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //dfdfd1212@dfdfd.abc.cn 都成二级邮箱。abc@12df1.com.cn
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]{2,3}){1,2})$/; //域名是不允许有下划线的 ,去掉下划线,这个就是最后的正则,发现其像afeng@staff.jackxiang.com 这样的匹配不了。至于还有啥首字母不能是下划线,要这样,这正则就还得加长...用户也不是sb,只是起到一定提示作用,别搞复杂了,还是做一下简单的验证,对后面的com,tv,com.cn啥的别验证太细了:
^[A-Za-z0-9]+((-|_|\.)[A-Za-z0-9]+)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$
到此为止吧。
用正则猫可以分析一下:
^[A-Za-z0-9]+ :以大小写字母和数字开头, 并重复一次或多次。
(-|_|\.) :中间可夹杂- _ . ,注意是分组,这个分组里是或,也就是可没有这些也成。
[A-Za-z0-9]+ :分装后紧跟大小写字母及数字,这个可以重复一次或多次。(如果- _ .没有可以理解为全是匹配一次或多次的大小写字母和数字符)
((-|_|\.)[A-Za-z0-9]+)+ :小组里并成大组匹配一次或多次。
后面也是类似和前面的分组,最后加一个点再匹配一次或多次(点后的com,org,并没有作长度限定)!
============================================================================
<dd><input id="2" rel="邮箱" res='2' type="text" class="item-edit-txt" name="2" value="<{$user.email}>" ></dd>
}else if($(this).attr('res') == '2' && !emailpreg.test($(this).val())){//从QQ登录过来的用户大网接口获取不到邮箱,放开让其填写。
$(this).css("border","1px solid #f00");
$("#"+$(this).attr('res')+'span').remove();
$("#"+$(this).attr('res')).after("<span id="+$(this).attr('res')+'span'+"><br />"+$(this).attr("rel")+"格式不正确</span>");
$(this).focus();
res = false;
return false;
——————————————————————————————————————————————————————————————
JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return reg.test(str);
}
摘自:http://www.ijavascript.cn/yanzheng/validate-email-186.html
下面邮箱正则:
中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的。按照DNS的标准,域名是不允许有下划线的。
下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便。
二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大了范围但问题不大,主要是起到提示用户就可以了。
com.cn域名支持:((\.[a-zA-Z0-9-]{2,3}){1,2} com.cn
——————————————————————————————————————————————————————————————
//emailpreg = /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/; //这个对QQ号的邮箱验证不了。
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //dfdfd1212@dfdfd.abc.cn 都成二级邮箱。abc@12df1.com.cn
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]{2,3}){1,2})$/; //域名是不允许有下划线的 ,去掉下划线,这个就是最后的正则,发现其像afeng@staff.jackxiang.com 这样的匹配不了。至于还有啥首字母不能是下划线,要这样,这正则就还得加长...用户也不是sb,只是起到一定提示作用,别搞复杂了,还是做一下简单的验证,对后面的com,tv,com.cn啥的别验证太细了:
^[A-Za-z0-9]+((-|_|\.)[A-Za-z0-9]+)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$
到此为止吧。
用正则猫可以分析一下:
^[A-Za-z0-9]+ :以大小写字母和数字开头, 并重复一次或多次。
(-|_|\.) :中间可夹杂- _ . ,注意是分组,这个分组里是或,也就是可没有这些也成。
[A-Za-z0-9]+ :分装后紧跟大小写字母及数字,这个可以重复一次或多次。(如果- _ .没有可以理解为全是匹配一次或多次的大小写字母和数字符)
((-|_|\.)[A-Za-z0-9]+)+ :小组里并成大组匹配一次或多次。
后面也是类似和前面的分组,最后加一个点再匹配一次或多次(点后的com,org,并没有作长度限定)!
============================================================================
<dd><input id="2" rel="邮箱" res='2' type="text" class="item-edit-txt" name="2" value="<{$user.email}>" ></dd>
}else if($(this).attr('res') == '2' && !emailpreg.test($(this).val())){//从QQ登录过来的用户大网接口获取不到邮箱,放开让其填写。
$(this).css("border","1px solid #f00");
$("#"+$(this).attr('res')+'span').remove();
$("#"+$(this).attr('res')).after("<span id="+$(this).attr('res')+'span'+"><br />"+$(this).attr("rel")+"格式不正确</span>");
$(this).focus();
res = false;
return false;
——————————————————————————————————————————————————————————————
JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return reg.test(str);
}
摘自:http://www.ijavascript.cn/yanzheng/validate-email-186.html
[调试关掉]开启OPCache时注意一下关掉这块,否则会等一分钟才生效。
Php/Js/Shell/Go jackxiang 2015-9-22 17:26
背景:有一兄弟用sftp往线下的那个服务器传更改的文件,发现传上去不好使呢,于是重新传,到后来又好了,我当时一看浏览器头,发现也没有啥问题呀,今天我自己搞了一把,发现还真有这个问题,细查了一下,是opcache引起的,默认是60秒。于是我给关了,之前是ea加速,现在新版本的php好像用这个opcache了:
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
————————————————————————
调试先关了,后面没问题再打开:
—————————————————————————
以下是opcache的配置说明:
复制代码
[opcache]
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"
; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4
; 最大缓存的文件数目 200 到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000
; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0
; 开启文件时间戳验证
opcache.validate_timestamps=1
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0
; 是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1
; 是否加载文件/函数的注释
;opcache.load_comments=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1
;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0
; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0
; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_
;opcache.blacklist_filename=
; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180
; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0
来自:http://www.cnblogs.com/HD/p/4554455.html
opcache.huge_code_pages=1 参数的内在关联:
http://www.laruence.com/2015/10/02/3069.html
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
————————————————————————
调试先关了,后面没问题再打开:
—————————————————————————
以下是opcache的配置说明:
复制代码
[opcache]
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"
; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4
; 最大缓存的文件数目 200 到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000
; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0
; 开启文件时间戳验证
opcache.validate_timestamps=1
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0
; 是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1
; 是否加载文件/函数的注释
;opcache.load_comments=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1
;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0
; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1
; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0
; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_
;opcache.blacklist_filename=
; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180
; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0
来自:http://www.cnblogs.com/HD/p/4554455.html
opcache.huge_code_pages=1 参数的内在关联:
http://www.laruence.com/2015/10/02/3069.html
PHP不如C++ 吗?被swoole坑哭的PHP程序员。
Php/Js/Shell/Go jackxiang 2015-9-17 14:26
昨天和一个前同事聊天,各种吐槽PHP,吐槽Swoole,他认为PHP到处是坑,PHP局限很大。PHP+Swoole不适合做高并发服务器,C+Swoole才是最好的方案。C++有各种数据结构,C++可以开线程,C++可以共享对象。看来有必要好好得说明一下了。
PHP不如C++ 吗?
PHP比C/C++或Java少了什么?多线程,多线程,多线程……
是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?
多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。
数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。
不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。
某个线程挂了那所有线程都会退出
反而在看多进程,其实就简单的多了。
配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来
多进程不需要锁
多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列
所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。
C++写出来的程序性能更好?
这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。
高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。
开发效率快的意义是什么?
这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。
被swoole坑哭的PHP程序员:
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。
被swoole坑哭的PHP程序员
遇到的几点问题:
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
因为swoole是多线程编程,global是不能在多个进程间共享的。例
global $i = 0;
function onRequest() {
echo $i++;
}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。
2:什么是异步、什么是回高
对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。
3:为什么onReceive收到的数据这么大
客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次
4:自制httpserve
写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。
原因
出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。
swoole的特色:网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。
使用swoole必须要掌握的技能
多线程编程
进程间通信
网络协议TCP/UDP的认知
PHP的各项基本技能
个人学习swoole的经历
在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。
总结
swoole并不是一个简单的PHP框架,正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!swoole重新激活了PHP,php成就了swoole!
PHP不如C++ 吗?
PHP比C/C++或Java少了什么?多线程,多线程,多线程……
是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?
多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。
数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。
不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。
某个线程挂了那所有线程都会退出
反而在看多进程,其实就简单的多了。
配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来
多进程不需要锁
多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列
所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。
C++写出来的程序性能更好?
这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。
高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。
开发效率快的意义是什么?
这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。
被swoole坑哭的PHP程序员:
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。
被swoole坑哭的PHP程序员
遇到的几点问题:
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
因为swoole是多线程编程,global是不能在多个进程间共享的。例
global $i = 0;
function onRequest() {
echo $i++;
}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。
2:什么是异步、什么是回高
对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。
3:为什么onReceive收到的数据这么大
客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次
4:自制httpserve
写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。
原因
出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。
swoole的特色:网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。
使用swoole必须要掌握的技能
多线程编程
进程间通信
网络协议TCP/UDP的认知
PHP的各项基本技能
个人学习swoole的经历
在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。
总结
swoole并不是一个简单的PHP框架,正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!swoole重新激活了PHP,php成就了swoole!
Dora RPC 虚拟机下实测性能
Php/Js/Shell/Go jackxiang 2015-9-14 11:31
背景:关于rpc,即远程过程调用,这个技术最早是由sun公司发明出来,后来在linux上默认有rpc服务,该功能我最早见在新浪的企业邮箱里有这样一个运用,在用户登录这块用到rpc,其服务端实现了与mysql长连接的技术,进而减少了重次重新连接,提高了高并发时的性能,而后来在鸟哥的一个php框架里实现了类似的php rpc框架,也是用c写的,但究其根源,还是来自于xdr这样一种数据结构,其可以跨平台使用,进而它在做一些高并发这块的的确确有较好的效果,最近rango兄弟的swoole里发布后,也有兄弟基于它做成了Dora Rpc,值得了解,应该性能还成,可能试用并使用,毕竟简单、效率、快才是王道。
Dora RPC
简介(Introduction)
用于复杂项目前后端分离,分离后项目都通过API工作可更好维护管理。
是一款基础于Swoole定长包头通讯协议的最精简的RPC
目前只提供PHP语言代码
后续有什么bug或者问题请提交Issue
功能支持(Function)
支持单API调用,多API并发调用
支持同步调用,异步任务下发
其他相关知识请参考Swoole扩展
客户端长链接,请求完毕后仍旧保留,减少握手消耗
guid收发一致性检测,避免发送和接收数据不一致
dora-rpc/server.php
使用最简单的方式实现的服务端
目前需要继承才能使用,继承后请实现dowork,这个函数是实际处理任务的函数参数为提交参数
做这个只是为了减少大家启用RPC的开发时间
返回结果是一个数组 分两部分,第一层是通讯状态(code),第二层是处理状态(code)
使用方法(Example)
客户端(Client)
服务端(Server)
_____________________________________________________________________________
经过24小时持续压力测试,目前接口仍旧工作正常
使用的vagrant虚拟进行压测的分配了1G内存和1核CPU(Mac 2.2 GHz Intel Core i7)
压测进程:目前只开了10个php进程疯狂发送请求
并发性能:TPS 2100上下(比直接使用curl快很多)
响应时间:0.02~0.04s 偶尔出现0.4s
后端代码为:查询一次数据库后返回结果
CPU使用:10~25%
内存使用:一个PHP task 16M 目前开了30个进程
PHP版本:5.4.41
压测时使用端口个数:10个(长连接)
测试代码使用的使用客户端示范程序无限循环,服务端直接返回一个数组。
每次接口会请求一次api接口调用后再下发一个请求内含两个并发任务
其他资源情况如下:
Dora <wbr>RPC <wbr>虚拟机下实测性能
此开源使用Swoole特性制作
客户端使用长链接,处理请求结束后连接也不会断开,再次使用的时候会自动找回
服务端自动管理task及进程通讯
通过task处理业务
如果使用更高速的序列化函数取代serialize会更快一些
支持单api请求,多api并发请求,此功能可取代发展越来越怪的gearman
如果有持久化请求需求,可以考虑在此基础上自行封装下(会降性能的哦)
过几天增加个中间件,可以检测后端服务压力状态自动负载均衡~
github地址
https://github.com/xcl3721/Dora-RPC
有一个哥们测试了一下,地址:http://blog.sina.com.cn/s/blog_54ef39890102vkgh.html
Dora RPC
简介(Introduction)
用于复杂项目前后端分离,分离后项目都通过API工作可更好维护管理。
是一款基础于Swoole定长包头通讯协议的最精简的RPC
目前只提供PHP语言代码
后续有什么bug或者问题请提交Issue
功能支持(Function)
支持单API调用,多API并发调用
支持同步调用,异步任务下发
其他相关知识请参考Swoole扩展
客户端长链接,请求完毕后仍旧保留,减少握手消耗
guid收发一致性检测,避免发送和接收数据不一致
dora-rpc/server.php
使用最简单的方式实现的服务端
目前需要继承才能使用,继承后请实现dowork,这个函数是实际处理任务的函数参数为提交参数
做这个只是为了减少大家启用RPC的开发时间
返回结果是一个数组 分两部分,第一层是通讯状态(code),第二层是处理状态(code)
使用方法(Example)
客户端(Client)
服务端(Server)
_____________________________________________________________________________
经过24小时持续压力测试,目前接口仍旧工作正常
使用的vagrant虚拟进行压测的分配了1G内存和1核CPU(Mac 2.2 GHz Intel Core i7)
压测进程:目前只开了10个php进程疯狂发送请求
并发性能:TPS 2100上下(比直接使用curl快很多)
响应时间:0.02~0.04s 偶尔出现0.4s
后端代码为:查询一次数据库后返回结果
CPU使用:10~25%
内存使用:一个PHP task 16M 目前开了30个进程
PHP版本:5.4.41
压测时使用端口个数:10个(长连接)
测试代码使用的使用客户端示范程序无限循环,服务端直接返回一个数组。
每次接口会请求一次api接口调用后再下发一个请求内含两个并发任务
其他资源情况如下:
Dora <wbr>RPC <wbr>虚拟机下实测性能
此开源使用Swoole特性制作
客户端使用长链接,处理请求结束后连接也不会断开,再次使用的时候会自动找回
服务端自动管理task及进程通讯
通过task处理业务
如果使用更高速的序列化函数取代serialize会更快一些
支持单api请求,多api并发请求,此功能可取代发展越来越怪的gearman
如果有持久化请求需求,可以考虑在此基础上自行封装下(会降性能的哦)
过几天增加个中间件,可以检测后端服务压力状态自动负载均衡~
github地址
https://github.com/xcl3721/Dora-RPC
有一个哥们测试了一下,地址:http://blog.sina.com.cn/s/blog_54ef39890102vkgh.html
PHP扩展相关信息及类函数如何查看,及内置函数参数怎么看的命令行查看办法备案。
Php/Js/Shell/Go jackxiang 2015-9-11 11:19
背景:有时需要查一些函数,比如分隔函数,不知道那个分割符号是放第几位了,怎么办? 有时想看php.ini文件在哪儿了,怎么办?有时想看这个扩展如:swoole扩展的相关扩展信息怎么看?有时想看这个扩展的类名怎么看?有时想看这个扩展的函数有哪些怎么了解,这些都是问题,于是有该文。
php -i ,php -i|grep php.ini php --ri swoole php --ri memcache
零)php -i|grep php.ini
[root@localhost htdocs]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--ri <name> Show configuration for extension <name>.
一)php --rf explode
[root@localhost htdocs]# php --rf explode
Function [ <internal:standard> function explode ] {
- Parameters [3] {
Parameter #0 [ <required> $separator ]
Parameter #1 [ <required> $str ]
Parameter #2 [ <optional> $limit ]
}
}
二)php --ri memcache
memcache
memcache support => enabled
Version => 3.0.6
Revision => $Revision: 310129 $
Directive => Local Value => Master Value
memcache.allow_failover => 1 => 1
memcache.max_failover_attempts => 20 => 20
memcache.default_port => 11211 => 11211
memcache.chunk_size => 32768 => 32768
memcache.protocol => ascii => ascii
memcache.hash_strategy => consistent => consistent
memcache.hash_function => crc32 => crc32
memcache.redundancy => 1 => 1
memcache.session_redundancy => 2 => 2
memcache.compress_threshold => 20000 => 20000
memcache.lock_timeout => 15 => 15
三)--re <name> Show information about extension <name>.
php --re memcache
Extension [ <persistent> extension #39 memcache version 3.0.6 ] {
Method [ <internal:memcache, inherits MemcachePool> public method decrement ] {
}
Method [ <internal:memcache, inherits MemcachePool> public method close ] {
}
Method [ <internal:memcache, inherits MemcachePool> public method flush ] {
}
}
四)--rc <name> Show information about class <name>.
php --rc memcache
Class [ <internal:memcache> class Memcache extends MemcachePool ] {
- Constants [0] {
}
php -i ,php -i|grep php.ini php --ri swoole php --ri memcache
零)php -i|grep php.ini
[root@localhost htdocs]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--ri <name> Show configuration for extension <name>.
一)php --rf explode
[root@localhost htdocs]# php --rf explode
Function [ <internal:standard> function explode ] {
- Parameters [3] {
Parameter #0 [ <required> $separator ]
Parameter #1 [ <required> $str ]
Parameter #2 [ <optional> $limit ]
}
}
二)php --ri memcache
memcache
memcache support => enabled
Version => 3.0.6
Revision => $Revision: 310129 $
Directive => Local Value => Master Value
memcache.allow_failover => 1 => 1
memcache.max_failover_attempts => 20 => 20
memcache.default_port => 11211 => 11211
memcache.chunk_size => 32768 => 32768
memcache.protocol => ascii => ascii
memcache.hash_strategy => consistent => consistent
memcache.hash_function => crc32 => crc32
memcache.redundancy => 1 => 1
memcache.session_redundancy => 2 => 2
memcache.compress_threshold => 20000 => 20000
memcache.lock_timeout => 15 => 15
三)--re <name> Show information about extension <name>.
php --re memcache
Extension [ <persistent> extension #39 memcache version 3.0.6 ] {
Method [ <internal:memcache, inherits MemcachePool> public method decrement ] {
}
Method [ <internal:memcache, inherits MemcachePool> public method close ] {
}
Method [ <internal:memcache, inherits MemcachePool> public method flush ] {
}
}
四)--rc <name> Show information about class <name>.
php --rc memcache
Class [ <internal:memcache> class Memcache extends MemcachePool ] {
- Constants [0] {
}
php -a 交互式 0 === false???,PHP 的 Interactive shell 模式,Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。
Php/Js/Shell/Go jackxiang 2015-8-26 11:38
背景:有时PHP像python那样可交互能对小代码片段的验证提高效果,但默认编译好像是不行的。
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",
试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
正确安装如下:
#php -a
Interactive shell
php > echo "hello" ;
hello
不对的输出如下,输入 php -a 之后,基本就没有反应了。:
#php -a
Interactive mode enabled
解决方法:
重新编译安装php,加入--with-readline选项。
php -i | grep "\-\-with\-readline" --color
不正确的输出是空,正确的输出编译项里有。
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
./configure
make && make install
[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history
这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————
0 === false???
php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)
php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1
————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)
而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)
Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.
目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.
主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.
Interactive mode enabled
$ php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1
Interactive shell
$ php -a
Interactive shell
php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1
来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185
在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。
演示:http://segmentfault.com/a/1190000000353069
需要git。
—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 1.9 kB 00:00
primary.sqlite.bz2 100% |=========================| 504 kB 00:00
addons 100% |=========================| 1.9 kB 00:00
extras 100% |=========================| 2.1 kB 00:00
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5. 20% |===== | 1.5 MB 00:12 ETA
安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069
你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:
git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。
[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.
[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",
试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
正确安装如下:
#php -a
Interactive shell
php > echo "hello" ;
hello
不对的输出如下,输入 php -a 之后,基本就没有反应了。:
#php -a
Interactive mode enabled
解决方法:
重新编译安装php,加入--with-readline选项。
php -i | grep "\-\-with\-readline" --color
不正确的输出是空,正确的输出编译项里有。
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
./configure
make && make install
[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history
这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————
0 === false???
php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)
php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1
————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)
而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)
Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.
目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.
主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.
Interactive mode enabled
$ php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1
Interactive shell
$ php -a
Interactive shell
php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1
来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185
在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。
演示:http://segmentfault.com/a/1190000000353069
需要git。
—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 1.9 kB 00:00
primary.sqlite.bz2 100% |=========================| 504 kB 00:00
addons 100% |=========================| 1.9 kB 00:00
extras 100% |=========================| 2.1 kB 00:00
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5. 20% |===== | 1.5 MB 00:12 ETA
安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069
你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:
git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。
[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.
[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris
curTempSetTwo
Php/Js/Shell/Go jackxiang 2015-8-18 23:39
背景:做温度比较时有用。
PHP如何比较两个浮点数的大小?
在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。
注意第三个参数
$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;
From:http://baike.1688.com/doc/view-d35956820.html
PHP如何比较两个浮点数的大小?
在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。
注意第三个参数
$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;
From:http://baike.1688.com/doc/view-d35956820.html
echo exec('whoami')
Php/Js/Shell/Go jackxiang 2015-8-17 23:18
echo exec('whoami')
PHP 协程方案 tsf
Php/Js/Shell/Go jackxiang 2015-7-9 17:38
背景:rango兄弟搞一个swoole,这兄弟尼玛名字取得太大 Tencent Sever Framework。 不怕腾讯告你啊,tsf用了PHP的生成器语法实现了协程,这是最大的创新。QQ 现在 部分后台协议 是用这个搞的公众号。也有人用swoole做日志服务器。
顺带介绍下swoole:采用swoole+redis,基于swoole扩展,根据内部的需求,封装了一套可扩展、高性的PHP server,已应用于多个业务模块,提供高并发的kv数据查询及业务数据的在线计算,每天亿级的PV量,某熊公司有一套分布式压测系统,他们对实际项目做过100亿次的测试,无问题,正在用,我没用,哈哈。
开始扯:
协程也有一个小小的缺点:做并发不如异步IO方便。除非你再启动一个协程。做comet还是golang比较舒服,swoole的comet也非常方便。
golang+redis (数字公司在用,跟开发普通后端server一样,不过golang是协程机制,hold连接很简单,单机一般有100w,经过优化后连接能到200w).......swoole这块我就不想提了,毕竟要相信PHP是最好的语言没有之一
go吸引人的是顺应了目前主流语言的编程风格,进行了语法的一些改进,吸收了erlang的协程机制,另外与c的无缝混编。
仅管看go很NB的样子,但我还是要说PHP才是最好的语言,没有之一,因为swoole也能实现了。
总之,PHP是世界上最好的语言
————————————————————————————————————————————————————————————————————————
PHP 协程方案 tsf
tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole+PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发服务器,同时支持同步阻塞,异步非阻塞回调,协程这 3 种 IO 模型。
主要特性:
基于 PHP,相比 C++ 开发更高效
基于 Swoole 扩展,强大的异步 IO
支持 PHP coroutine
支持服务器监控器和提供接口
要求:
php5.5+
Swoole1.7.18+
linux,OS X
服务器配置:
vim server.ini
[server]
;server type:tcp,udp,http
type = http
; port
listen[] = 12312
; entrance file
root = '/data/web_deployment/serv/test/index.php'
;php start path
php = '/usr/local/php/bin/php'
[setting]
; worker process num
worker_num = 16
; task process num
task_worker_num = 0
; dispatch mode
dispatch_mode = 2
; daemonize
daemonize = 1
; system log
log_file = '/data/log/test.log'
启动服务器:
cd /root/tsf/bin/
php swoole testHttpServ start
使用 TCP/UDP/HTTP 客户端:
$tcpReturn=(yield $this->tcpTest());
$udpReturn=(yield $this->udpTest());
$httpReturn=(yield $this->httpTest());
public function tcpTest(){
$ip = '127.0.0.1';
$port = '9905';
$data = 'test';
$timeout = 0.5; //second
yield new Swoole\Client\TCP($ip, $port, $data, $timeout);
}
public function udpTest(){
$ip = '127.0.0.1';
$port = '9905';
$data = 'test';
$timeout = 0.5; //second
yield new Swoole\Client\UDP($ip, $port, $data, $timeout);
}
public function httpTest(){
$url='http://www.qq.com';
$httpRequest= new Swoole\Client\HTTP($url);
$data='testdata';
$header = array(
'Content-Length' => 12345,
);
yield $httpRequest->get($url); //yield $httpRequest->post($path, $data, $header);
}
来自:http://m.oschina.net/p/tsf?from=timeline&isappinstalled=0
顺带介绍下swoole:采用swoole+redis,基于swoole扩展,根据内部的需求,封装了一套可扩展、高性的PHP server,已应用于多个业务模块,提供高并发的kv数据查询及业务数据的在线计算,每天亿级的PV量,某熊公司有一套分布式压测系统,他们对实际项目做过100亿次的测试,无问题,正在用,我没用,哈哈。
开始扯:
协程也有一个小小的缺点:做并发不如异步IO方便。除非你再启动一个协程。做comet还是golang比较舒服,swoole的comet也非常方便。
golang+redis (数字公司在用,跟开发普通后端server一样,不过golang是协程机制,hold连接很简单,单机一般有100w,经过优化后连接能到200w).......swoole这块我就不想提了,毕竟要相信PHP是最好的语言没有之一
go吸引人的是顺应了目前主流语言的编程风格,进行了语法的一些改进,吸收了erlang的协程机制,另外与c的无缝混编。
仅管看go很NB的样子,但我还是要说PHP才是最好的语言,没有之一,因为swoole也能实现了。
总之,PHP是世界上最好的语言
————————————————————————————————————————————————————————————————————————
PHP 协程方案 tsf
tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole+PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发服务器,同时支持同步阻塞,异步非阻塞回调,协程这 3 种 IO 模型。
主要特性:
基于 PHP,相比 C++ 开发更高效
基于 Swoole 扩展,强大的异步 IO
支持 PHP coroutine
支持服务器监控器和提供接口
要求:
php5.5+
Swoole1.7.18+
linux,OS X
服务器配置:
vim server.ini
[server]
;server type:tcp,udp,http
type = http
; port
listen[] = 12312
; entrance file
root = '/data/web_deployment/serv/test/index.php'
;php start path
php = '/usr/local/php/bin/php'
[setting]
; worker process num
worker_num = 16
; task process num
task_worker_num = 0
; dispatch mode
dispatch_mode = 2
; daemonize
daemonize = 1
; system log
log_file = '/data/log/test.log'
启动服务器:
cd /root/tsf/bin/
php swoole testHttpServ start
使用 TCP/UDP/HTTP 客户端:
$tcpReturn=(yield $this->tcpTest());
$udpReturn=(yield $this->udpTest());
$httpReturn=(yield $this->httpTest());
public function tcpTest(){
$ip = '127.0.0.1';
$port = '9905';
$data = 'test';
$timeout = 0.5; //second
yield new Swoole\Client\TCP($ip, $port, $data, $timeout);
}
public function udpTest(){
$ip = '127.0.0.1';
$port = '9905';
$data = 'test';
$timeout = 0.5; //second
yield new Swoole\Client\UDP($ip, $port, $data, $timeout);
}
public function httpTest(){
$url='http://www.qq.com';
$httpRequest= new Swoole\Client\HTTP($url);
$data='testdata';
$header = array(
'Content-Length' => 12345,
);
yield $httpRequest->get($url); //yield $httpRequest->post($path, $data, $header);
}
来自:http://m.oschina.net/p/tsf?from=timeline&isappinstalled=0
php5.4 Illegal string offset
Php/Js/Shell/Go jackxiang 2015-6-24 17:38
http://www.laruence.com/2011/12/19/2409.html
每次编辑和新增内容时均会产生"Illegal string offset 'enablehits' | phpcms\modules\poster\index.php | 104"的错误,网上查询是不兼容php5.4版本导致,希望官方尽快修复兼容php5.4版本
http://bbs.phpcms.cn/thread-886897-1-1.html
每次编辑和新增内容时均会产生"Illegal string offset 'enablehits' | phpcms\modules\poster\index.php | 104"的错误,网上查询是不兼容php5.4版本导致,希望官方尽快修复兼容php5.4版本
http://bbs.phpcms.cn/thread-886897-1-1.html
在WAMPServer下同时支持PHP5.3、PHP5.4、PHP5.5、PHP5.6的步骤
Php/Js/Shell/Go jackxiang 2015-6-24 10:30
在WAMPServer下同时支持PHP5.3、PHP5.4、PHP5.5、PHP5.6的步骤:
http://www.cnblogs.com/lyongde/p/3745030.html
http://www.cnblogs.com/lyongde/p/3745030.html
Linux 下 PHP 扩展 PDO 编译安装
Php/Js/Shell/Go jackxiang 2015-6-15 15:57
背景:pt-query-digest需要PDO,别搞成/ext/pdo了,实际是/ext/pdo_mysql。
这篇文章需要:http://jackxiang.com/post/8113/
DownLoad:https://www.percona.com/downloads/percona-toolkit/ 里面有一个:
percona-toolkit-2.2.14-1.noarch.rpm
https://www.percona.com/downloads/percona-toolkit/2.2.14/RPM/percona-toolkit-2.2.14-1.noarch.rpm
————————————————————————————————————————
来自:http://blog.csdn.net/liruxing1715/article/details/8268513
1、进入 PHP 的软件包 pdo 扩展目录中(注:不是 PHP 安装目录)
[root@gamejzy /]# cd /tmp/lamp/php-5.3.19/ext/pdo_mysql/
注:我的 php 软件包在 /tmp/lamp/php-5.3.19 下
执行 phpize 命令
[root@gamejzy pdo_mysql]# /usr/local/php/bin/phpize
注:/usr/local/php 是我的 php 安装目录
执行完 phpize 命令后,在 pdo_mysql 目录中就会出现 configure
执行配置
[root@gamejzy pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
不加mysql会出现:configure: error: Unable to find your mysql installation
参数说明:
--with-php-config=/usr/local/php/bin/php-config 指定安装 PHP 的时候的配置
--with-pdo-mysql=/usr/local/mysql/ 指定 MySQL 数据库的安装目录位置
编译安装
[root@gamejzy pdo_mysql]# make && make install
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so
php里加上(不是pdo.so呢,它是sqlite的扩展名,特别要注意下。):
extension = "pdo_mysql.so"
这篇文章需要:http://jackxiang.com/post/8113/
DownLoad:https://www.percona.com/downloads/percona-toolkit/ 里面有一个:
percona-toolkit-2.2.14-1.noarch.rpm
https://www.percona.com/downloads/percona-toolkit/2.2.14/RPM/percona-toolkit-2.2.14-1.noarch.rpm
————————————————————————————————————————
来自:http://blog.csdn.net/liruxing1715/article/details/8268513
1、进入 PHP 的软件包 pdo 扩展目录中(注:不是 PHP 安装目录)
[root@gamejzy /]# cd /tmp/lamp/php-5.3.19/ext/pdo_mysql/
注:我的 php 软件包在 /tmp/lamp/php-5.3.19 下
执行 phpize 命令
[root@gamejzy pdo_mysql]# /usr/local/php/bin/phpize
注:/usr/local/php 是我的 php 安装目录
执行完 phpize 命令后,在 pdo_mysql 目录中就会出现 configure
执行配置
[root@gamejzy pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
不加mysql会出现:configure: error: Unable to find your mysql installation
参数说明:
--with-php-config=/usr/local/php/bin/php-config 指定安装 PHP 的时候的配置
--with-pdo-mysql=/usr/local/mysql/ 指定 MySQL 数据库的安装目录位置
编译安装
[root@gamejzy pdo_mysql]# make && make install
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so
php里加上(不是pdo.so呢,它是sqlite的扩展名,特别要注意下。):
extension = "pdo_mysql.so"
PHP连接Mysql时候用如何使用上try catch实现捕获连接上的错误简单示例。
Php/Js/Shell/Go jackxiang 2015-5-20 11:39
背景:对于书上一些连接mysql的例子,总是像写c语言一样,一行一行的,直接写下去,确实好看明白,但是在实际使用中,如果暴露出错误到前端页面是不太好的,这时候需要try catch来捕获这些错误,对于mysql的连接句柄的密码是否正确可以用if直接判断其返回值,再用throw new exception("Sorry,could not connect to mysql.");而对于一些非密码的网络及数据库,得用上catch,网上有一篇文章就有这样的类似介绍。
自己简单实践如下,如果密码错误则会捕获并报如下信息,而不是直接抛出:
一)来个设置温度是否成功了,并无从db查询的数据返回的:
密码错会报如下错,前端用json去解析判断并提示用户即可,自己也好查错不是:
{"opt":"setTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}
二)来个有数据查询并返回的简单示例:
(1)错误结果:
{"opt":"getTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}
(2)正确结果:
{"opt":"getTemperatureValue","status":-1,"curTempOne":"40.2","curTempTwo":"38.6","curTempSetOne":"35.5","curTempSetTwo":"55.4"}
原始代码参考来源:http://bbs.csdn.net/topics/240078038
自己简单实践如下,如果密码错误则会捕获并报如下信息,而不是直接抛出:
一)来个设置温度是否成功了,并无从db查询的数据返回的:
密码错会报如下错,前端用json去解析判断并提示用户即可,自己也好查错不是:
{"opt":"setTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}
二)来个有数据查询并返回的简单示例:
(1)错误结果:
{"opt":"getTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}
(2)正确结果:
{"opt":"getTemperatureValue","status":-1,"curTempOne":"40.2","curTempTwo":"38.6","curTempSetOne":"35.5","curTempSetTwo":"55.4"}
原始代码参考来源:http://bbs.csdn.net/topics/240078038
phpmyadmin出现空密码登录被禁止 (参见 允许空密码)的解决办法
Php/Js/Shell/Go jackxiang 2015-5-13 15:55
在Windows或者Linux下mysql安装后默认的密码为空,
又当我们又安装了mysql的管理工具
phpmyadmin后登陆时出现“空密码登陆呗禁止(参见允许密码为空)”。不能登录成功
解决办法如下:
1..要是你想用空密码,则将phpmyadmin下的
config.inc.php(根目录)或者config.default.php(根目录)
再则:libraries\config.default.php
(友情提示,由于版本不一样可能涉及的文件不同,基本为这三个文件)
中的$cfg['Servers'][$i]['AllowNoPassword'] = false;
改为$cfg['Servers'][$i]['AllowNoPassword'] = true;
2.要是你想设置密码不为空则将
$cfg['blowfish_secret'] = '123456'; // use here a value of your choice 你要设置的密码
又当我们又安装了mysql的管理工具
phpmyadmin后登陆时出现“空密码登陆呗禁止(参见允许密码为空)”。不能登录成功
解决办法如下:
1..要是你想用空密码,则将phpmyadmin下的
config.inc.php(根目录)或者config.default.php(根目录)
再则:libraries\config.default.php
(友情提示,由于版本不一样可能涉及的文件不同,基本为这三个文件)
中的$cfg['Servers'][$i]['AllowNoPassword'] = false;
改为$cfg['Servers'][$i]['AllowNoPassword'] = true;
2.要是你想设置密码不为空则将
$cfg['blowfish_secret'] = '123456'; // use here a value of your choice 你要设置的密码