记录错误时在后台执行PHP脚本

时间:2016-01-28 00:01:39

标签: php

如何在不将网页挂起的情况下在后台运行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中添加trycatch,看看我是否可以通过这种方式记录错误。

3 个答案:

答案 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)

ignore_user_abort(true); 
set_time_limit(0);