PHP 函数error_log() 安全使用吗?

2022-08-30 22:20:10

我想确保使用自定义PHP错误处理程序不会引入竞争条件。为此,我想知道我是否可以依赖error_log(),或者我是否需要使用其他文件锁定方法来确保正确记录错误。

默认的 PHP 错误处理程序如何工作?它是否安全,不受竞争条件的影响?

例如,我是否必须锁定文件(这可能会导致在此简单版本中丢失错误)

function log_error($message)
{
    if(! $fp = @fopen('/path/to/error.log', 'a'))
    {
        return FALSE;
    }

    flock($fp, LOCK_EX);
    fwrite($fp, $message);
    flock($fp, LOCK_UN);
    fclose($fp);

    return TRUE;
}

或者我可以打电话给error_log?

error_log($message, 0);

答案 1

您可以在 中找到error_log实现的源代码。你会看到它几乎只是调用任何定义的记录器。如果您担心由于多个并发调用而导致error_log本身进行某种数据处理,则无需担心。或者至少,不比大多数其他任何PHP代码更令人担忧。如果您的自定义记录器正在写入文件,则需要自己实现文件锁定。对error_log的并发调用(跨进程)是一种非常常见的方案。ext/standard/basic_functions.c

编辑

几乎可以肯定的是,最好使用通过error_log提供的内置日志记录。

PHP flock 实现使用建议锁定,这使得其他进程可以简单地忽略锁定并写入。此外,在您自己的进程中,当进程等待获取锁时,您最终将被绑定。通过使用 ,您可以配置系统日志日志记录。Syslog是异步的,因此您可以避免锁获取,并且它还(通常)由内核缓冲区支持,这将允许任何syslog守护程序毫无问题地写入连续记录。IOerror_log

在很多公司实现了高吞吐量日志记录之后,我强烈建议你配置系统日志或使用scribe之类的东西。我的2c。


答案 2

推荐