如何让exec()自己运行,php页面继续运行,让PHP不再阻塞。

jackxiang 2014-12-10 14:50 | |
背景:用Nginx上传插件实现大文件分片上传后,处理子程序的程序需要每次对分片进行合并,但又不想耗费PHP太多内存,只好让shell来干这事儿,同时呢,又不想让PHP用exec合并文件时出现等待,怎么办?

   在php中,如果出现exec();那么php是先运行完exec中的外部命令,然后继续执行接下来的php语句的。有什么办法让exec自己在那运行,php语句不等待,自己运行下去,让浏览器不用等待。谢谢。

Note:
如何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。 否则会导致 PHP 挂起,直至程序执行结束。
exec("命令 > null");

来自:http://zhidao.baidu.com/link?url=sqz2GSYfd3fJWE5F7F_2AR15zpj6VNe-9jc1pMNmmj-3MB5KHOnbzOB_9Dls43TqL1zH0PZmdZuN1AXSc_Xj-_

——————————————————————————————————————————————————————————————
请问在php程序里如何非阻塞地执行另一个.php脚本?

我们知道在命令行里可以用php XX.php调用一个php脚本,
但是在php程序里怎样调用另一个.php脚本呢?
要求有两个:
(1) 非阻塞式的。即主程序执行调用其他脚本的语句后,继续执行下面的语句而不阻塞。
(2) 能否把一些主程序的对象作为参数传给被调用的脚本?可以以变通的方式。

exec("php XX.php")函数貌似不行,因为exec()是阻塞的。
请大家想想办法,如何满足以上这两个解决问题?谢谢!


刚看了看Process Control Functions的说明(英文的没看太明白).不过看到了pcntl_fork()复制进程.
这个和Perl的fork()差不多能实现.不过Process Control Functions不能在windows下使用啊,只能在unix或linux下用.比较不爽啊!!!!!
示範 1.pcntl_fork() example

主进程执行当前程序,让子进程去调用另一个php脚本吧,这不就不阻塞了吗!!!


来自:http://bbs.phpchina.com/thread-23687-1-1.html


当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:

一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。

这个例子输出结果可看到输出program start.后会话就返回了,所以debug那个输出浏览器是接收不到的,而log.txt文件能完整接收到三个完成时间。

二、使用fsockopen的非阻塞模式请求另外的网址

三、使用Gearman
Gearman是一个具有php扩展的分布式异步处理框架,能处理大批量异步任务。
摘自:http://blog.4wer.com/php-nonblock
PHP中实现非阻塞模式:
http://blog.csdn.net/linvo/article/details/5466046

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/7680/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-12-13 18:52
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]