简单介绍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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
php whois查询API制作方法
Jun 23 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
微信access_token的获取开发示例
Apr 16 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 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 !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Django Highcharts制作图表
2016/08/27 Python
python的concat等多种用法详解
2018/11/28 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
Intersport西班牙:在线体育商店
2019/11/06 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
SQL中where和having的区别
2012/06/17 面试题
介绍一下except的用法和作用
2015/01/22 面试题
社区挂职锻炼个人工作总结
2015/10/23 职场文书
初三化学教学反思
2016/02/22 职场文书