简单介绍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 相关文章推荐
特转载一高手总结PHP学习资源和链接.
Dec 05 PHP
php cli 方式 在crotab中运行解决
Feb 08 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 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网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
xmlHTTP实例
2006/10/24 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
使用python实现knn算法
2017/12/20 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python3爬虫全国地址信息
2019/01/05 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python字典的遍历3种方法详解
2019/08/10 Python
python logging添加filter教程
2019/12/24 Python
python机器学习库xgboost的使用
2020/01/20 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
RealTek面试题
2016/06/28 面试题
农药学硕士毕业生自荐信
2013/09/25 职场文书
营业员个人总结的自我评价
2013/10/25 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
受资助学生感谢信
2015/01/21 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL