简单介绍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
php 设计模式之 工厂模式
Dec 19 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
PHP中Trait及其应用详解
Feb 14 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
yii2多图上传组件的使用教程
May 10 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
php用wangeditor3实现图片上传功能
Aug 22 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
详解phpstorm2020最新破解方法
Sep 17 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动态图像的创建
2006/10/09 PHP
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
js 解决“options为空或不是对象”
2008/12/22 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
python实现汉诺塔方法汇总
2016/07/25 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
最新计算机专业自荐信
2013/10/16 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书