【问题标题】:How to optimize the process of multiple process trying to write to the same log file如何优化多个进程尝试写入同一个日志文件的过程
【发布时间】:2016-12-07 00:21:53
【问题描述】:

使用 PHP 的网站具有非常巨大的流量,例如每秒 5000 次请求。这些请求中的每一个都尝试将数据记录到单个文件中。由于在任何时间点,只有一个请求可以写入文件,因此另一个请求排队,这会影响整体响应时间。需要记录数据,这很重要。我该如何优化这种情况。

【问题讨论】:

  • 能否改为登录数据库,然后有一个函数将数据表处理成日志文件?
  • 您可以为每个用户(或日志条目)创建一个临时文本文件,并以特定的时间间隔合并文件。或者编写一个文件管理器/包装器来创建一个文件,添加日志条目并在后台将其排队等待主文件条目。
  • @Cricket 为每个请求将日志写入数据库并不是一个好主意。不能谈论没有基准测试的性能。
  • @Nitin 听起来不错。增加了一些额外的工作,但会起作用。
  • 使用fluentd并将其记录在那里,然后您可以让fluentd将其写入文件,MySQL,Mongo,任何地方。它正是为此目的而开发的工具。将排队和多路复用留给专为其设计的软件。

标签: php asynchronous architecture scalability


【解决方案1】:

我看到了两个选项。

  1. 因为您的要求是写入一个大的日志文件而不是其他地方。您可以让您的 PHP 脚本首先将这些条目记录到队列中。您可以使用许多消息队列平台,例如 RabbitMQ 或 ActiveMQ。假设这些日志条目不是大的有效负载,您的导致日志条目的用户请求可以被定向到将消息插入队列。您将拥有另一个后端进程(可能是一个 php 脚本?),它将简单地监听队列并不断地写入日志文件。以下是关于客户端如何使用队列消息的详细说明 (https://www.rabbitmq.com/tutorials/tutorial-one-php.html)

  2. 您还可以使用像 Apache Log4php 这样的东西,它是一个使用文件附加机制的日志框架。只需调用一个方法,您就可以轻松推送对您重要的信息。

    $logger->info("这是要记录的消息。");

他们应该处理登录到同一个文件的多个请求的复杂性。您甚至可以让他们按天分解文件等。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多