V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
herozzm
V2EX  ›  程序员

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

  •  
  •   herozzm · 2014-10-16 17:50:15 +08:00 · 4843 次点击
    这是一个创建于 3726 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用php调用linux系统命令 zip压缩文件,但是下达命令之后,不知道后面情况?
    10 条回复    2014-10-17 12:40:24 +08:00
    akstrom
        1
    akstrom  
       2014-10-16 18:03:23 +08:00   ❤️ 1
    原型:string exec(string command [, string array [, int return_var]])
    exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。如果array不是空的,在调用之前最好用unset()把它清除干净。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。


    exec("/bin/ls -l", $res, $rc);
    herozzm
        2
    herozzm  
    OP
       2014-10-16 18:36:26 +08:00
    @akstrom 发现exec命令如果命令执行时间长,整个web server进程都会挂起,其他页面也无法打开,或者速度缓慢!
    dorentus
        3
    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
        4
    herozzm  
    OP
       2014-10-16 22:25:27 +08:00
    @dorentus 恩,知道了,但是问题来了,exec命令如果命令执行时间长,整个web server进程都会挂起,其他页面也无法打开,或者速度缓慢,和解?
    herozzm
        5
    herozzm  
    OP
       2014-10-16 22:30:54 +08:00
    @dorentus system好像也是一样,都是被挂起
    jsq2627
        6
    jsq2627  
       2014-10-17 03:16:00 +08:00 via iPhone
    @herozzm 所以考虑使用队列,尽量不要直接在PHP exec
    vibbow
        7
    vibbow  
       2014-10-17 05:08:50 +08:00
    @herozzm 你是不是开了session?session是有锁的。
    Geikiy
        8
    Geikiy  
       2014-10-17 09:40:05 +08:00
    @herozzm, 进程被挂起那是因为php-fpm会有一个链接最长时间,如果比较久的话建议采用异步后台进程处理,使用nohup命令将这个命令程序放到后台作为一个子进程处理即可
    herozzm
        9
    herozzm  
    OP
       2014-10-17 10:20:42 +08:00
    @jsq2627 请明示,队列需要如何做
    @Geikiy 使用nohup命令是不是就无法得到命令执行的结果?
    jsq2627
        10
    jsq2627  
       2014-10-17 12:40:24 +08:00
    @herozzm 我之前的做法是用RabbitMQ做消息队列,Web这边把执行的消息推入队列。又另外用C写了个Worker,取消息,fork,exec。Worker用python java这些都可以写,也许更容易。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:15 · PVG 05:15 · LAX 13:15 · JFK 16:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.