【问题标题】:PHP CLI console closing on errorPHP CLI 控制台因错误而关闭
【发布时间】:2016-04-05 14:26:13
【问题描述】:

我正在运行一个循环,在回合结束后使用 proc_open 执行相同的应用程序,如下所示:

$description = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "proc_open_errors", "a+")
);

$command = "start /min php $operador_php";
$process = proc_open($command, $description, $pipe);

if (is_resource($process)) {
    print_r($process);
    sleep(5);
    fclose($pipe[0]);
    fclose($pipe[1]);
    $process_response = proc_close($process);
    echo $process_response;
}

我遇到的问题是,运行几个小时后,其中一个执行可能会在中间失败,从而破坏整个循环。它会自行关闭(在 Windows 上),所以我看不出问题出在哪里。

有什么方法可以防止 PHP CLI 在出现问题时自行关闭?还是我应该使用一系列“if /else”来检查执行过程中是否有任何问题?还有什么想法吗?

【问题讨论】:

  • 在我的项目中,对于每个 proc,都会生成一个包含每个控制台输出的新日志文件。您应该考虑这一点。
  • 是的,我认为这是我最好的选择......这也是 Dan Farrell 的提议。 "> output.txt 非常感谢!

标签: php command-line-interface proc-open


【解决方案1】:

您可以选择,但这取决于您如何执行它。

一种选择是在 php 脚本中配置错误处理。至少您可以捕获通用异常并在失败之​​前记录它们。更好的是,在许多情况下,您可能能够从错误中恢复。无论哪种方式,http://php.net/manual/en/language.exceptions.php 都可能是一本有趣的书。

一个更简单的方法,也许是一个很好的起点,将脚本的输出重定向到另一个文件。 Redirect Windows cmd stdout and stderr to a single file 显示了一个简单的调用 - 在 unix 中的工作方式相同。这样,窗口仍然会消失,但您可以单独查看日志。在任何操作系统中执行无人值守脚本时,这绝对是最佳实践。只要确保合理地处理输出文件的大小(如果 php 脚本将永远运行,您将不得不做一些更聪明的事情来防止日志填满您的硬盘驱动器)。

最后,如果您从命令行手动调用php脚本,我认为脚本退出时命令行不会退出,但我想如果它退出我不会感到震惊(而不是拥有windows自动为进程启动一个 shell,然后在完成后自动关闭它)。

【讨论】:

  • 谢谢丹,这很明显,但我最近筋疲力尽... php scriptname.php > logs.txt
  • @ChrisRusso 不要让您疲惫的头脑也错过标准错误!这可能与您有关(取决于您的错误记录方式,但我怀疑您两者都需要)
【解决方案2】:

这是我在 SO 上找到的另一个解决方案:

ini_set("log_errors", 1);
ini_set("error_log", "/php_error.log");
error_log( "Hello, errors!" );

我建议将代码放在 PHP 文件的开头。我想澄清一下,如果您正在与其他服务器交互并且响应不是 总是 相同,这将特别有用,所以这样,如果有任何异常凌晨3点,保存在第2行定义的文件中。

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多