简单介绍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实现jQuery扩展函数
Oct 30 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
php登录超时检测功能实例详解
Mar 21 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
php字符串倒叙
Apr 01 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 cron中的批处理
2008/09/16 PHP
php中var_export与var_dump的区别分析
2010/08/21 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
token 机制和实现方式
2020/12/15 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
python 中xpath爬虫实例详解
2019/08/26 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
Crabtree & Evelyn欧盟:豪华洗浴、身体和护发
2021/03/09 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
人力资源行政经理自我评价
2013/10/23 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2015年专项整治工作总结
2015/04/03 职场文书