- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想确保使用 a custom PHP error handler 不会引入竞争条件.为此,我想知道我是否可以依靠 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
绑定(bind)。通过使用 error_log
,您可以配置系统日志记录。 Syslog 是异步的,因此您可以避免获取锁,并且它还(通常)由内核缓冲区支持,这将允许任何 syslog 守护进程写入连续的记录而不会出现问题。
在许多公司实现了高吞吐量日志记录后,我强烈建议配置 syslog 或使用 scribe 之类的东西。我的 2c。
关于php - PHP 函数 error_log() 使用安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375809/
我运行了 phpinfo() 并且 error_log 指令只是说 error_log。那指的是什么文件?即 error_log 的完整路径是什么? 最佳答案 报价 from the document
我有一个使用 error_log() 输出错误的 cron 脚本.然而,有时日志文件会变得很大。是否error_log()是否具有在达到特定定义的行数后自动存档日志文件的 native 函数?我可以编
我想通过将失败的登录尝试写入Apache错误日志来提高PHP CMS的安全性。我的想法是,它随后将与fail2ban一起使用,从而禁止试图拖出的所有IP地址强制猜测CMS管理员登录名的密码。 另外,如
我一直在尝试编写一个可以在网站上使用的错误处理类,如果出现错误,它会向我发送电子邮件。问题是,当我分析应用程序时,它被 error_log 函数阻塞。这是我的代码(省略类: class ErrorHa
如何获得动态虚拟主机的错误日志文件? server { listen 80; server_name ~^(?[^.]*).(?[^.]*).dev.example.com;
我公司有一个大型主机,但它不由我们管理,我们看不到配置文件,但我想在我们的本地测试服务器上回复此功能。 我是我公司的新人,想开始一些应用程序调试,以解决客户的一些次要和主要问题,但文件量太大,以至于单
当我使用函数 error_log 时使用 $message_type = 1 - 通过电子邮件发送,我需要传递给 sendmail 额外参数 "-f"。 $发件人邮件 有什么方法可以将参数传递给发件人
标题几乎说明了一切。我一直在努力让这个工作一整天。我正在创建一个基于 PHP 的登录系统,我需要进行一些调试。现在对我来说最有用的是能够在整个 PHP 程序的某些点将调试消息写入文件。根据文档,看起来
我研究了不同的方法和指令,包括: auto_prepend_file .user.ini 文件 getcwd() 调试回溯() 而且我似乎无法找到一种方法来更改 error_log 的路径以登录与包含
我正在开发一个不使用任何框架,也不使用debug = 1的基本应用程序。我试图弄清楚如何显示php的var_dump和error_log,但是我不确定它们应该在哪里打印。 我在本地主机上使用PHP的内
如标题所述,我期待找到一种方法来防止在我的 PHPUnit 测试期间在终端中打印 error_log() 消息。 在上面的示例中,被测方法通过 error_log('Don\'t show up'),
如标题所述,我期待找到一种方法来防止在我的 PHPUnit 测试期间在终端中打印 error_log() 消息。 在上面的示例中,被测方法通过 error_log('Don\'t show up'),
来自 Laravel 的所有日志都进入 storage/logs。不幸的是,我无权访问此目录。我什至无法检查是否有任何文件或阅读它们。我只能请求不会给我这些文件的日志。我会得到 error_log、a
php 函数 error_log() 允许您将日志发送到电子邮件,将第二个参数设置为 1。我这样做了,但我想在 html 中显示消息。代码如下所示: error_log($this->_errorMs
我正在编写一个查询我的数据库的函数,如果 mysql 查询由于某种原因出错,我希望我的函数返回一个值(在本例中为 -1),指示查询失败,而不是消失整个脚本。 通常我只使用这个结构: $result =
我有这个 PHP 代码: error_log('my message 1'); .... error_log('my message 2'); ... error_log('my message 3'
PHP 5.6 有什么方法可以定义使用error_log时显示的日期格式? 我用它来记录来自某个脚本的消息和错误。似乎 set_error_handler won't handle all error
我正在运行 nginx 和 PHP 5.5,当传递的字符串很长时,我所有的 error_log 消息都会被截断。 我已经更新了我的 php.ini 文件并将日志最大长度从 1024 增加到 0(无最大
我在这里做错了什么? 我在 .ini 文件中设置了 error_log 以及 error_reporting = E_ALL | E_STRICT. 我还缺少什么?这通常给了我。我希望在 .ini 文
如何在使用 error_log() 时插入换行符在 PHP 中? 我尝试使用 和 \n ,但这些都不起作用。 最佳答案 添加错误信息时使用双引号。 error_log("This is a two l
我是一名优秀的程序员,十分优秀!