【问题标题】:PHP exec() not returningPHP exec()不返回
【发布时间】:2012-07-12 23:25:46
【问题描述】:

我正在编写一个 PHP 脚本,它将在服务器上启动一个程序。

我这样做:

exec('myAppName');

这行代码“有效”,因为它实际上执行了程序,但是,我无法让它从这一行返回(继续过去)。

它会一直挂在那里,直到我手动关闭打开的程序或超过 max_execution_time。

我是否遗漏了一些明显的东西?

【问题讨论】:

  • 你想fork 然后exec 吗?因为exec 不应该以某种方式“背景”该过程。
  • 在黑暗中拍摄,但请尝试使用passthru() 而不是exec()。程序的输出可能会揭示一些东西。
  • 也尝试过 passthru(),结果相同。
  • 我应该声明我在 Windows 服务器上运行 PHP。无论如何,我使用了一个名为“PsExec”的工具来启动进程而不是等待它。 exec("psexec -d myAppName");这似乎完成了我所需要的。
  • Adam,您可以在 Windows 上完成此操作,无需任何外部程序:ss64.com/nt/start.html

标签: php


【解决方案1】:

manual for exec,虽然对等待启动程序退出的事情并不完全清楚,但声明返回值为

返回值:命令结果的最后一行。

换句话说,正如您所观察到的,为了返回最后一行输出,exec 在启动的程序退出之前不会返回。

【讨论】:

    【解决方案2】:

    要在 PHP 中后台处理进程,您需要执行以下操作:

    function spawnBackgroundProcess($sProcessLine)
    {
        $aPipes = array();
    
        $rProcess = proc_open($sProcessLine, array(), $aPipes);
        proc_close($rProcess);
    }
    

    这确实是在滥用 proc_* 系列,但遗憾的是,这是最好的方法。

    (别忘了 &!)

    【讨论】:

      【解决方案3】:

      您需要将其设置为背景才能继续我相信的其余 php。

      在 Unix/Linux 中,使用“&”字符。 ..

      嗯,或者是那个系统..该死的,现在不记得了 - 将再次阅读手册。

      【讨论】:

      • 我应该在原帖中说明,但我在 Windows Server 上。
      【解决方案4】:

      如果您想在后台执行命令而不让脚本等待结果,您可以执行以下操作:

      <?php
      passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log        2>&1 &");
      ?>
      

      这里有几件事很重要。

      首先:输入php二进制文件的完整路径,因为这个命令将在apache用户下运行,你可能不会在那个用户中设置像php这样的命令别名。

      第二点:注意命令字符串末尾的两件事:'2>&1'和'&'。 '2>&1' 用于将错误重定向到标准 IO。最重要的是命令字符串末尾的'&',它告诉终端不要等待响应。

      第三:确保你对'log_file.log'文件有777权限

      享受吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2011-08-01
        • 2020-02-22
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多