当两个脚本实例同时写入日志时,为什么 Monolog 写入的日志行不会混乱/混合?

2024-04-24

当使用 Monolog 时StreamHandler,这是正常情况,PHP 脚本的多个实例会并行写入同一个日志文件。

(例如,在我的 Symfony 应用程序中,当多个用户同时打开“登录页面”时,会导致我的应用程序脚本出现多个实例(app.php)运行,因此 Monolog 的两个实例StreamHandler将写入相同的app/logs/prod.log.)

为什么尽管并发写入文件,但每个日志行都没有在中间中断和混乱?为什么下面的情况从来没有发生过:

  • 实例1StreamHanler 只写了一半的日志行,
  • 实例2StreamHandler 写它的前半部分
  • 实例1写了日志行的后半部分
  • 实例2写了日志行的后半部分
  • 现在我们的日志文件一团糟,因为两行是混合的。

我尝试查看源代码StreamHanler https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/StreamHandler.php#L93 https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/StreamHandler.php#L93

但我没有看到任何适当的并发控制,有一个flock()但它似乎被禁用了(->useLocking=false)在默认(Symfony)配置中,似乎日志没有它就很好......

    if ($this->useLocking) {
        // ignoring errors here, there's not much we can do about them
        flock($this->stream, LOCK_EX);
    }
    fwrite($this->stream, (string) $record['formatted']);
    if ($this->useLocking) {
        flock($this->stream, LOCK_UN);
    }

但为什么日志却神奇地完好呢?


当我使用日志记录时,我希望底层组件能够正常工作。它不是您必须确保并发访问的任何容器。

我读过,主流操作系统使用线程安全的 io 调用,这些调用也是不可中断的,并且存在非线程安全调用。

您可以在这里阅读,但在我看来,标记的答案根本不正确:fwrite 是原子的吗? https://stackoverflow.com/questions/2220525/is-fwrite-atomic

换句话说,我从来没有遇到过任何破损的木头。就像是INSERT在数据库中。要么插入一行,要么没有插入行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当两个脚本实例同时写入日志时,为什么 Monolog 写入的日志行不会混乱/混合? 的相关文章

  • Mink 不适用于 behat 3.0.12

    我安装了 Behat Mink 和其他一些相关的软件包 这是我的composer json 文件 require behat behat 3 0 6 behat symfony2 extension dev master behat min
  • PHP_CodeSniffer - 显示失败的嗅探

    PHP CodeSniffer 中是否有设置来显示失败的嗅探 我将输出与我们的编码标准进行比较 并且一一使用很难破译哪个测试失败 看看我们可能想忽略哪个 如果有一种简单的方法来显示故障嗅探 那么我可以更轻松 更快地完成配置 您可以使用 s
  • PHP/PDO/MySQL:插入 MEDIUMBLOB 会存储错误数据

    我有一个简单的 PHP Web 应用程序 它通过文件上传接受图标图像并将它们存储在 MEDIUMBLOB 列中 在我的机器 Windows 和两台 Linux 服务器上 这工作得很好 在第三台 Linux 服务器上 插入的图像已损坏 在 S
  • PHP中如何替换字符串?

    我有一个变量 其中包含如下所示的字符串 p The post a href http zed1 com journalized archives 2012 03 11 wordpress 3 for business bloggers Wo
  • 使用 href 和 php 从 sql 数据库对 html 表进行排序

    我有一个 html 表 其中包含来自 php 吐出的 sql 表的产品数据 我想通过单击表列的标题对数据进行排序 我像这样输出我的表 php product list sql mysql query SELECT FROM products
  • 如何使用 PHP 创建动态页面标题

    大家好 我想知道是否有人可以帮助解决这个 PHP 问题 是否可以使用 H2 标记中的文本并使用它来动态填充页面标题 我还希望能够使用相同的技术将 H2 文本添加到元描述中 有人可以帮忙吗 如果您的 h2 文本是动态创建的 那么网页的其他部分
  • PHP7 返回类型为 JSON

    PHP 7 有一个新功能 即返回类型声明 我们可以返回一个 字符串 类型 例如 function myFunction a string 我们还可以返回一个 数组 类型 例如 function myFunction a array 但是我们
  • MySQL 和 PHP:多关键字搜索

    我有一个包含逗号分隔关键字的字符串 例如 keywords keyword1 keyword2 keyword3 我的表架构 名为tbl address是这样的 简化的 id INT 11 PRIMARY KEY AUTO INCREMEN
  • 如何在 laravel/php 中访问该集合的内容

    我是 Laravel 的新手 正在做一个构建迷你社交网络应用程序的项目 我有一个与用户模型有关系的帖子模型 我有一个帖子页面 其中仅显示经过身份验证的用户及其朋友的帖子 在我的 PostController 中 我像这样查询经过身份验证的用
  • 在php中的字符串数组中查找字符串的开头[重复]

    这个问题在这里已经有答案了 我知道我们有 php in array 函数 但我正在寻找一种方法来查找以特定字符串开头的字符串数组中的值 例如找到 search string div 1 div 在这样的数组中 array sample gt
  • 如何在 phpfarm php 安装上安装 pthreads

    记录我为帮助他人所做的努力 并希望得到一些关于我如何做得更好的反馈 命令pecl install pthreads由于我的 php 安装失败ubuntu 13 04盒子没有配置 zts Options 1 ubuntu存储库没有启用zts的
  • PHP 和 ASP.Net 可以在 IIS 7.5 中的同一网站中一起运行吗?

    我们网站的一部分是用 PHP 完成的 而我们网站的一部分是用 ASP Net 完成的 我们刚刚使用 Windows Server 2008 R2 设置了一个新的 Web 服务器 其中安装了 IIS 7 5 我知道 IIS 7 支持 PHP
  • PHP 静态变量用双引号引起来

    如何让 PHP 计算双引号中的静态变量 我想做这样的事情 log self CLASS METHOD entering 我尝试过各种 组合来获取变量值self CLASS 但没有任何效果 我目前已经解决了字符串连接问题 但输入起来很痛苦 l
  • 如何理顺 Laravel Blade @extends 的执行顺序?

    In 我尝试找到一种通过引用刀片 include来传递变量的方法 https stackoverflow com questions 25437939 how to pass variables by reference to includ
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 使用 PHP 将子项添加到 XML 文件

    添加子项时 抛出此错误 无法添加孩子 父级不是 XML 树的永久成员 我无法解决这个问题 这是我的代码 if visited FIRST xml new SimpleXMLElement
  • Curl 和 Php 5.3.3 中的 SSL 连接错误

    我的网站自 3 年来一直运行良好 代码如下 现在突然从 2 天开始出现以下错误 SSL 连接错误 在 Curl error 中 下面是我的代码
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • /bootstrap/start.php 中的 Laravel 错误:\Illuminate\Foundation\Application 未找到

    因此 我在开发服务器上安装了 Laravel php5 5 3 标准安装 安装了 mcrypt 并收到以下错误消息 Fatal error Class Illuminate Foundation Application not found
  • 如何在createQueryBuilder中使用通配符?

    在我的存储库类中 我使用 public function getItemsByTag tag qb this gt createQueryBuilder c gt select c gt where c tags LIKE bipolar

随机推荐