微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php 异步执行脚本

这里说的异步执行是让PHP脚本在后台挂起一个执行具体操作的脚本,主脚本退出后,挂起的脚本还能继续执行。比如执行某些耗时操作或可以并行执行的操作,可以采用PHP异步执行的方式。主脚本和子脚本的通讯可以采用外部文件或memcached的方式。原理就是通过exec或system来执行一个外部命令。注意:本文所述的是针对Linux环境。

在Linux下要让一个脚本挂在后台执行可以在命令的结尾加上一个 “&” 符号,有时候这还不够,需要借助nohup命令,关于nohup,可以参考nofollow" target="_blank">http://www.netingcn.com/linux-nohup.html。

CLI环境和Web环境执行的操作还不太一样。先来说CLI环境,这里需要用上nohup和&,同时还要把指定输出,如果不想要输出结果,可以把输出定向到/dev/null中。现在来做一个测试,假设在一个目录中有main.PHP、sub1.PHP和sub2.PHP,其中sub1和sub2内容一样都让sleep函数暂停一段时间。代码如下:

PHP PHP = 'nohup PHP ./sub.PHP >./tmp.log &' ( = 'nohup PHP ./sub1.PHP >/dev/null &' ( ?> PHP sub2.PHP PHP (100000 ?>

上述文件中main.PHP是作为主脚本,在命令行中执行PHP main.PHP,可以看到main.PHP脚本很快就执行完并退出。在使用ps aux | grep sub命令搜索进程,应该可以在后台看到上述的两个子脚本,说明成功挂起了子脚本。

在Web环境下,执行PHP脚本都是Web服务器开启的cgi进程来处理,只要脚本不退出,就会一直占有该cgi进程,当启动的所有cgi进程都被占用完后就不能在处理新的请求。所以对那些可能会很费时的脚本,可以采用异步的方式。启动子脚本的方式和CLI差不多,必须要使用&和指定输出(只好是定向到/dev/null),但是不能使用nohup。例如:

PHP = 'PHP PATH_TO_SUB1/sub1.PHP >/dev/null &' ( = 'PHP PATH_TO_SUB1/sub2.PHP >/dev/null &' ( ?>

当在浏览器中访问该脚本文件,可以看到浏览器里面响应完成,同时使用ps命令查看后台可以看到sub1和sub2脚本。

注意上述例子中如果PHP命令不在PATH中,需要指定命令完整的路径。推荐使用完整路径,特别是在Web下。

 

 

 

其他例子:

('phantomjs /var/www/joinfsite/api/library/Screenshots.js ' . . ' /var/www/joinfsite/site/upload/kuaizhao/' . () . '.jpg >/dev/null &');

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐