简单介绍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加密解密的代码
Jul 16 PHP
php木马攻击防御之道
Mar 24 PHP
php 图片上传类代码
Jul 17 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
php定义一个参数带有默认值的函数实例分析
Mar 16 PHP
你应该知道PHP浮点数知识
May 13 PHP
php图片裁剪函数
Oct 31 PHP
PHP根据key删除数组中指定的元素
Feb 28 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
python和php学习哪个更有发展
2020/06/17 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
大学生自我鉴定范文
2013/12/28 职场文书
班组长岗位职责
2014/03/03 职场文书
公司请假条格式
2014/04/11 职场文书
超市店庆活动方案
2014/08/31 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
学生保证书
2015/01/16 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
保卫工作个人总结
2015/03/03 职场文书
技术入股协议书
2016/03/22 职场文书