php - 如何优化多个进程试图写入同一个日志文件的过程

标签 php asynchronous architecture scalability

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

最佳答案

我看到两个选项。

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

  2. 您还可以使用类似 Apache Log4php 的工具这是一个使用文件追加机制的日志记录框架。只需调用一个方法,您就可以轻松推送对您重要的信息。

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

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

希望这对您有所帮助!

关于php - 如何优化多个进程试图写入同一个日志文件的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707001/

相关文章:

php - 只允许特定协议(protocol)查看网页

c++ - 什么时候必须将 io_context 传递给 boost::asio::spawn? (C++)

android - 如何从 JSON 解析获得的 URL 将图像加载到 imageview 中?

ios - Alamofire 无法在 Swift 中正确执行

java - Libgdx:创建其他对象的对象

javascript - AJAX 针对单个 anchor 元素

PHP - 对嵌套数组执行解析规则

javascript - Backbone.js:.render() 和 .remove() 应该能够相互逆转吗?

c# - 除了测试,依赖注入(inject)有什么比静态类/方法更好的地方?

PHP:SeekableIterator::seek()