繁体   English   中英

PHP函数error_log()是否可以安全使用?

[英]Is the PHP function error_log() safe to use?

我想确保使用自定义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);

您可以在ext/standard/basic_functions.c找到error_log实现的源代码。 您会看到它几乎只调用任何已定义的记录器。 如果您担心由于多个并发调用而错误地由error_log本身进行某种类型的数据,则不需要。 或者至少,没有比大多数其他PHP代码更关注。 如果您的自定义记录器正在写入文件,则您需要自己实现文件锁定。 并发调用error_log(跨进程)是一种非常常见的情况。

编辑

使用error_log提供的内置日志记录几乎肯定会更好。

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

在许多公司实施了高吞吐量日志记录之后,我强烈建议您配置syslog或使用scribe之类的东西。 我的2c。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM