如何在不将网页挂起的情况下在后台运行PHP脚本,同时将错误记录到日志文件中?
我知道我可以使用此命令exec("php -f background.php >/dev/null 2>&1 &");
,但这不会输出错误到日志文件。
background.php在后台执行。
这是在用户提交表单后运行的脚本(这不是后台脚本):
# Execute the script in the background Linux style. Writes errors to a log file.
exec("php -f background.php 2>&1 &", $error_result);
# If $error_result is not empty, there was an error (2>&1).
if(!empty($error_result))
{
# If $error_result is an array, convert it to a string seperated by PHP End of Line.
if(is_array($error_result))
{
$error_result=implode(PHP_EOL, $error_result);
}
# Get the Logger Class.
require_once Utility::locateFile(MODULES.'Logger'.DS.'Logger.php');
# Create a new Logger object, and set the log file to use.
$logger_obj=new Logger('command_line.log');
# Write exec() output to log file.
$logger_obj->writeLogFile($error_result);
# Close log file.
$logger_obj->closeLogFile();
}
以上脚本有效,但页面会挂起,直到后台脚本完成。
编辑:因此,我从答案和评论中收集到使用$error_result
参数和我的Logger类无法做到这一点。
我将尝试在background.php中添加try
和catch
,看看我是否可以通过这种方式记录错误。
答案 0 :(得分:2)
仍在运行exec("php -f background.php >/dev/null 2>&1 &");
但在文件中添加:
ini_set("log_errors","1");
ini_set("error_log",'path/to/erroor.txt');
确保你包含一个路径,如果没有在用户家中创建文件,用户将依赖于它的运行方式(可能是php)。
答案 1 :(得分:1)
如果要将错误流输出到外部日志文件,可以这样做:
exec("php background.php 1>/dev/null 2>background.log &", $output, $error_code);
在这种情况下,我们将STDOUT重定向到/dev/null
,将STDERR重定向到文件background.log
,并在后台运行background.php
,因为最终&
。 php不需要-f
选项。
您实际上可以跳过$output
和$error_code
。我把它们包含在这里,所以我可以解释$output
将永远是空数组,$error_code
将始终为0.它们的意思是OS(Linux)在后台成功创建了另一个进程。
从1开始,background.php
在后台运行,而exec
命令会立即返回,2)$output
和$error_code
不会告诉您是否出现问题,需要通过检查background.log
来检查其他地方的错误。
如果我的解释不是很清楚,请告诉我,我会尽力详细说明。
答案 2 :(得分:-1)
ignore_user_abort(true);
set_time_limit(0);