php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...
by 尘缘 on 七月 31st, 2014 // Filed Under → php
让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:
一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。
01
02
03
04
05
06
07
08
09
10
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的非阻塞模式请求另外的网址
1
2
3
4
5
6
7
8
$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_*函数发送异步请求
1
2
3
4
5
6
$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等缓存、队列,将数据写入缓存,使用后台计划任务实现数据异步处理。
这个方法在常见的大流量架构中应该很常见吧
五、极端的情况下,可以调用系统命令,可以将数据传给后台任务执行,个人感觉不是很高效。
1
2
$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。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
if(($pid= pcntl_fork()) == 0) {
child_func(); //子进程函数,主进程运行
}else{
father_func(); //主进程函数
}
echo"Process ".getmypid() ." get to the end.\n";
functionfather_func() {
echo"Father pid is ".getmypid() ."\n";
}
functionchild_func() {
sleep(6);
echo"Child process exit pid is ".getmypid() ."\n";
exit(0);
}
php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...
1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...
- php 元_PHP 享元模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区
/** * 享元模式 * 共享子系统 * 抽象子系统实现接口 * 根据key储存对应的子系统实例 */ /** * Interface ServiceIO * 共享子系统抽象接口 */ interfa ...
- php状态,PHP 状态模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区
/** * 状态模式 * 允许一个实例在内部修改状态行为 * */ /** * Class state * 状态类 抽象 */ abstract class AState { abstract fun ...
- php命名空间非限定名称,PHP命名空间 - osc_nnp3dgfb的个人空间 - OSCHINA - 中文开源技术交流社区...
1.概述 命名空间是PHP为了解决重名问题推出的机制,密码空间可以认为地将内存进行分隔,让不同内存区域的同名结构得以共存,类似操作系统中文件夹的概念 基础语法:namespace space_name ...
- c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...
(转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...
- matlab simhash,最大非负的序列和 - 轻舞凋零的个人空间 - OSCHINA - 中文开源技术交流社区...
第一种方法:设定一个从i开始的计数,然后再以j为起点,k不断变化,算和算法复杂度是o(N*N*N) 第二种是第一种的改进算法复杂度是O(N*N) 第三中是最直接的 .算法复杂度是O(N) 它隐藏着条件 ...
- java 多线程阻塞队列 与 阻塞方法与和非阻塞方法
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- 同步I/O、异步I/O、阻塞I/0、非阻塞I/O、五种I/O模型、高性能网络模型
10.I/O相关概念 https://www.cnblogs.com/xiaoxi/p/6525396.html 10.1.同步和异步 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须 ...
- 深入理解非阻塞同步IO和非阻塞异步IO
这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...
最新文章
- [WPF]自定义鼠标指针
- 电厂MIS,SIS简介
- 7. SVM松弛变量
- 南开大学java考试试题_2014秋学期南开大学《Java语言程序设计》在线作业附答案...
- 瞧!公务员的工作还可以这样干
- git报错fatal: HTTP request failed
- 本周个人进步要点20160821
- python 延时运行命令_使用子进程延迟执行命令
- 汽车语音控制是什么意思 汽车语音控制怎么用
- (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
- JAVA输出最大值和最小值
- xshell xftp 工具免费版本免费下载
- 【数学建模】2017年B题
- 项目进度管理:制定进度计划
- NanoPi-NEO——初体验
- 童年计算机课企鹅游戏,这些童年游戏,你一定玩过
- centos镜像下载,镜像站使用
- 鲁能群英荟萃 萝卜开会
- 10万级内存交易撮合系统
- 记一次服务后端502 Bad Gateway解决办法