php shell 调用系统命令后,怎么得知这个系统命令已经执行完成或者失败?

2014-10-16 17:50:15 +08:00
 herozzm
我用php调用linux系统命令 zip压缩文件,但是下达命令之后,不知道后面情况?
4837 次点击
所在节点    程序员
10 条回复
akstrom
2014-10-16 18:03:23 +08:00
原型:string exec(string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。如果array不是空的,在调用之前最好用unset()把它清除干净。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。


exec("/bin/ls -l", $res, $rc);
herozzm
2014-10-16 18:36:26 +08:00
@akstrom 发现exec命令如果命令执行时间长,整个web server进程都会挂起,其他页面也无法打开,或者速度缓慢!
dorentus
2014-10-16 19:30:33 +08:00
http://php.net/manual/zh/function.system.php
看这个函数的签名:string system ( string $command [, int &$return_var ] )

第二个可选参数 $return_var 用来接收命令完成后的状态码。*nix 系统下面,约定状态码为 0 的话代表命令执行成功,其它值代表命令执行失败。Window 系统下就不知道了。
herozzm
2014-10-16 22:25:27 +08:00
@dorentus 恩,知道了,但是问题来了,exec命令如果命令执行时间长,整个web server进程都会挂起,其他页面也无法打开,或者速度缓慢,和解?
herozzm
2014-10-16 22:30:54 +08:00
@dorentus system好像也是一样,都是被挂起
jsq2627
2014-10-17 03:16:00 +08:00
@herozzm 所以考虑使用队列,尽量不要直接在PHP exec
vibbow
2014-10-17 05:08:50 +08:00
@herozzm 你是不是开了session?session是有锁的。
Geikiy
2014-10-17 09:40:05 +08:00
@herozzm, 进程被挂起那是因为php-fpm会有一个链接最长时间,如果比较久的话建议采用异步后台进程处理,使用nohup命令将这个命令程序放到后台作为一个子进程处理即可
herozzm
2014-10-17 10:20:42 +08:00
@jsq2627 请明示,队列需要如何做
@Geikiy 使用nohup命令是不是就无法得到命令执行的结果?
jsq2627
2014-10-17 12:40:24 +08:00
@herozzm 我之前的做法是用RabbitMQ做消息队列,Web这边把执行的消息推入队列。又另外用C写了个Worker,取消息,fork,exec。Worker用python java这些都可以写,也许更容易。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/139338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX