简单介绍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 相关文章推荐
ASP知识讲座四
Oct 09 PHP
复杂检索数据并分页显示的处理方法
Oct 09 PHP
非常好的php目录导航文件代码
Oct 09 PHP
php读取数据库信息的几种方法
May 24 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
php延迟静态绑定实例分析
Feb 08 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
PHP解压ZIP文件到指定文件夹的方法
Nov 17 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
小谈php正则提取图片地址
2014/03/27 PHP
PHPThumb图片处理实例
2014/05/03 PHP
discuz目录文件资料汇总
2014/12/30 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
python的三目运算符和not in运算符使用示例
2014/03/03 Python
python任务调度实例分析
2015/05/19 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
Python测试线程应用程序过程解析
2019/12/31 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Python使用openpyxl复制整张sheet
2021/03/24 Python
商务英语专业应届毕业生求职信
2013/10/28 职场文书
房地产销售大学生自我评价分享
2013/11/11 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python