简单介绍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 相关文章推荐
做个自己站内搜索引擎
Oct 09 PHP
某大型网络公司应聘时的笔试题目附答案
Mar 27 PHP
php仿ZOL分页类代码
Oct 02 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
一个好用的PHP验证码类实例分享
Dec 27 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
PHP实现货币换算的方法
Nov 29 PHP
详解php中的implements 使用
Jun 13 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 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学习笔记之一
2011/01/17 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
用js实现in_array的方法
2013/11/05 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
详解Vue打包优化之code spliting
2018/04/09 Javascript
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python配置grpc环境
2019/01/01 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
行政专员的岗位职责
2014/03/10 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
2015年女职工工作总结
2015/05/15 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python