简单介绍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的curl实现get和post的代码
Aug 23 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
php中error与exception的区别及应用
Jul 28 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
Jan 09 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
python 初始化一个定长的数组实例
2019/12/02 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
优秀毕业生求职信范文
2014/01/02 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
校园安全学习心得体会
2016/01/18 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书