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 - 中文开源技术交流社区...相关推荐

  1. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  2. php 元_PHP 享元模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

    /** * 享元模式 * 共享子系统 * 抽象子系统实现接口 * 根据key储存对应的子系统实例 */ /** * Interface ServiceIO * 共享子系统抽象接口 */ interfa ...

  3. php状态,PHP 状态模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

    /** * 状态模式 * 允许一个实例在内部修改状态行为 * */ /** * Class state * 状态类 抽象 */ abstract class AState { abstract fun ...

  4. php命名空间非限定名称,PHP命名空间 - osc_nnp3dgfb的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.概述 命名空间是PHP为了解决重名问题推出的机制,密码空间可以认为地将内存进行分隔,让不同内存区域的同名结构得以共存,类似操作系统中文件夹的概念 基础语法:namespace space_name ...

  5. c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...

    (转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...

  6. matlab simhash,最大非负的序列和 - 轻舞凋零的个人空间 - OSCHINA - 中文开源技术交流社区...

    第一种方法:设定一个从i开始的计数,然后再以j为起点,k不断变化,算和算法复杂度是o(N*N*N) 第二种是第一种的改进算法复杂度是O(N*N) 第三中是最直接的 .算法复杂度是O(N) 它隐藏着条件 ...

  7. java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  8. 同步I/O、异步I/O、阻塞I/0、非阻塞I/O、五种I/O模型、高性能网络模型

    10.I/O相关概念 https://www.cnblogs.com/xiaoxi/p/6525396.html 10.1.同步和异步 ​ 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须 ...

  9. 深入理解非阻塞同步IO和非阻塞异步IO

    这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...

最新文章

  1. [WPF]自定义鼠标指针
  2. 电厂MIS,SIS简介
  3. 7. SVM松弛变量
  4. 南开大学java考试试题_2014秋学期南开大学《Java语言程序设计》在线作业附答案...
  5. 瞧!公务员的工作还可以这样干
  6. git报错fatal: HTTP request failed
  7. 本周个人进步要点20160821
  8. python 延时运行命令_使用子进程延迟执行命令
  9. 汽车语音控制是什么意思 汽车语音控制怎么用
  10. (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
  11. JAVA输出最大值和最小值
  12. xshell xftp 工具免费版本免费下载
  13. 【数学建模】2017年B题
  14. 项目进度管理:制定进度计划
  15. NanoPi-NEO——初体验
  16. 童年计算机课企鹅游戏,这些童年游戏,你一定玩过
  17. centos镜像下载,镜像站使用
  18. 鲁能群英荟萃 萝卜开会
  19. 10万级内存交易撮合系统
  20. 记一次服务后端502 Bad Gateway解决办法

热门文章

  1. 飞鸽传书完全不知道这是什么
  2. 《纽约时报》:互联网新一轮品牌争夺战到来
  3. 怎么会这样?delete [] 了,还能用!!!
  4. VC Studio 使用技巧大全
  5. c/c++永不过时的编程语言
  6. 北妈每日一题:JS从无序乱码找我要的数字!
  7. mysql 冗余外键 同步_由于外键约束导致mysql同步出问题的故障
  8. 特征匹配 + 单应性查找对象
  9. 来看看这些门户网站的变迁史 - 感受下网络发展的这段过往
  10. 投稿过程要不要考虑预印本?——medRxiv那些事