简单介绍PHP非阻塞模式


Posted in PHP onMarch 03, 2016

非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。

让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:

一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。

echo "program start.";
file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
fastcgi_finish_request();
sleep(1);
echo 'debug...';
file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND);
sleep(10);
file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);

这个例子输出结果可看到输出program start.后会话就返回了,所以debug那个输出浏览器是接收不到的,而log.txt文件能完整接收到三个完成时间。

二、使用fsockopen、cUrl的非阻塞模式请求另外的网址

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) die('error fsockopen');
stream_set_blocking($fp,0);
$http = "GET /save.php / HTTP/1.1\r\n"; 
$http .= "Host: www.example.com\r\n"; 
$http .= "Connection: Close\r\n\r\n";
fwrite($fp,$http);
fclose($fp);

利用cURL中的curl_multi_*函数发送异步请求

$cmh = curl_multi_init();
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php");
curl_multi_add_handle($cmh, $ch1);
curl_multi_exec($cmh, $active);
echo "End\n";

三、使用Gearman、Swoole扩展

Gearman是一个具有php扩展的分布式异步处理框架,能处理大批量异步任务;
Swoole最近很火,有很多异步方法,使用简单。(尘缘注:号称重新定义PHP,把NodeJS喷得体无完肤。Swoole工具虽好,却感觉是扩展本身跟NodeJS没可比性)

四、使用redis等缓存、队列,将数据写入缓存,使用后台计划任务实现数据异步处理。

这个方法在常见的大流量架构中应该很常见吧

五、极端的情况下,可以调用系统命令,可以将数据传给后台任务执行,个人感觉不是很高效。

$cmd = 'nohup php ./processd.php $someVar >/dev/null &';
`$cmd`

六、外国佬的大招,没看懂,php原生支持

http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html

七、安装pcntl扩展,使用pcntl_fork生成子进程异步执行任务,个人觉得是最方便的,但也容易出现zombie process

if (($pid = pcntl_fork()) == 0) {
child_func(); //子进程函数,主进程运行
} else {
father_func(); //主进程函数
}
echo "Process " . getmypid() . " get to the end.\n";
function father_func() {
echo "Father pid is " . getmypid() . "\n";
}
function child_func() {
sleep(6);
echo "Child process exit pid is " . getmypid() . "\n";
exit(0);
}

以上内容是小编给大家介绍的PHP非阻塞模式,希望对大家有所帮助!

PHP 相关文章推荐
elgg 获取文件图标地址的方法
Mar 20 PHP
PHP 登录记住密码实现思路
May 07 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
php类的定义与继承用法实例
Jul 07 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
php中strtotime函数性能分析
Nov 20 PHP
php生成无限栏目树
Mar 16 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
浅析php设计模式之数据对象映射模式
Mar 03 #PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 #PHP
PHP MVC框架路由学习笔记
Mar 02 #PHP
深入浅析用PHP实现MVC
Mar 02 #PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 #PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 #PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 #PHP
You might like
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
如何使用php输出时间格式
2013/08/31 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python检测网站链接是否已存在
2016/04/07 Python
解读python如何实现决策树算法
2018/10/11 Python
wxpython绘制音频效果
2019/11/18 Python
python3排序的实例方法
2020/10/20 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
煤矿安全生产月活动总结
2014/07/05 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
八年级英语教学反思
2016/02/15 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery