简单介绍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版)
Oct 09 PHP
E路文章系统PHP
Dec 11 PHP
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
PHP读取PDF内容配合Xpdf的使用
Nov 24 PHP
PHP遍历并打印指定目录下所有文件实例
Feb 10 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
python编写分类决策树的代码
2017/12/21 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
python爬虫如何解决图片验证码
2021/02/14 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
企业党员一句话承诺
2014/05/30 职场文书
精神病医院见习报告
2014/11/03 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
《窃读记》教学反思
2016/02/18 职场文书
mysql数据库实现设置字段长度
2022/06/10 MySQL