PHP CLI 控制台因错误而关闭
PHP CLI console closing on error
我是 运行 一个循环,在一轮结束后执行相同的应用程序,使用 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" 来检查执行过程中是否有任何问题?还有其他想法吗?
你有多种选择,但这取决于你如何执行它。
一个选项是在 php 脚本中配置错误处理。至少您可以捕获一般异常并在失败之前记录它们。更好的是,在许多情况下,您可以从错误中恢复。无论哪种方式,http://php.net/manual/en/language.exceptions.php 都可能是一本有趣的书。
一种更简单的方法,也许是一个不错的起点,是将脚本的输出重定向到另一个文件。 Redirect Windows cmd stdout and stderr to a single file 显示了一个简单的调用 - 在 unix 中工作相同。这样 window 仍然会消失,但您将能够单独查看日志。这绝对是在任何 OS 中执行无人值守脚本时的最佳实践。只需确保合理地处理输出文件大小(如果 php 脚本将永远 运行,您将不得不做一些更聪明的事情来防止日志填满您的硬盘驱动器)。
最后,如果您从命令行手动调用 php 脚本,我认为脚本退出时命令行不会退出,但我想如果它退出我也不会感到震惊(与让 windows 自动神奇地为进程启动 shell 然后在完成后自动神奇地关闭它相反)。
这是我在 SO 上找到的另一个解决方案:
ini_set("log_errors", 1);
ini_set("error_log", "/php_error.log");
error_log( "Hello, errors!" );
我建议将代码放在 PHP 文件的开头。我想澄清一下,如果您正在与其他服务器交互并且响应不是 always 相同,这将特别有用,所以这个way,如果凌晨3点有异常,会保存到第2行定义的文件中。
我是 运行 一个循环,在一轮结束后执行相同的应用程序,使用 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" 来检查执行过程中是否有任何问题?还有其他想法吗?
你有多种选择,但这取决于你如何执行它。
一个选项是在 php 脚本中配置错误处理。至少您可以捕获一般异常并在失败之前记录它们。更好的是,在许多情况下,您可以从错误中恢复。无论哪种方式,http://php.net/manual/en/language.exceptions.php 都可能是一本有趣的书。
一种更简单的方法,也许是一个不错的起点,是将脚本的输出重定向到另一个文件。 Redirect Windows cmd stdout and stderr to a single file 显示了一个简单的调用 - 在 unix 中工作相同。这样 window 仍然会消失,但您将能够单独查看日志。这绝对是在任何 OS 中执行无人值守脚本时的最佳实践。只需确保合理地处理输出文件大小(如果 php 脚本将永远 运行,您将不得不做一些更聪明的事情来防止日志填满您的硬盘驱动器)。
最后,如果您从命令行手动调用 php 脚本,我认为脚本退出时命令行不会退出,但我想如果它退出我也不会感到震惊(与让 windows 自动神奇地为进程启动 shell 然后在完成后自动神奇地关闭它相反)。
这是我在 SO 上找到的另一个解决方案:
ini_set("log_errors", 1);
ini_set("error_log", "/php_error.log");
error_log( "Hello, errors!" );
我建议将代码放在 PHP 文件的开头。我想澄清一下,如果您正在与其他服务器交互并且响应不是 always 相同,这将特别有用,所以这个way,如果凌晨3点有异常,会保存到第2行定义的文件中。