简单介绍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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
ucenter通信原理分析
Jan 09 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
php微信开发之图片回复功能
Jun 14 PHP
php微信小程序解包过程实例详解
Mar 31 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控制网页过期时间的代码
2008/09/28 PHP
浅析php header 跳转
2013/06/17 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
PHP 读取和编写 XML
2014/11/19 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
javascript学习之json入门
2016/12/22 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
python的re模块应用实例
2014/09/26 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
python实现手势识别的示例(入门)
2020/04/15 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
技术人员面试提纲
2013/11/28 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
清明节寄语2015
2015/03/23 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
配置nginx负载均衡
2022/05/06 Servers