【问题标题】:Anynchronous Logging strategy for Python & PHPPython 和 PHP 的异步日志记录策略
【发布时间】:2011-10-21 15:57:16
【问题描述】:

情况是这样的:我们有一堆python脚本不断地做东西,最终在mysql中写入数据,我们需要一个日志来分析错误率和脚本性能。

我们还有与 mysql 数据交互的 php 前端,我们还需要记录用户操作,以便我们可以分析他们的行为,并计算一些评分函数。 所以我们想为每种情况创建一个 mysql 表(一个用于“python 脚本”日志,一个用于“用户操作”日志)。

理想情况下,出于性能和低延迟的原因,我们会异步写入这些日志表。有没有办法在 Python(我们使用 django ORM)和 PHP(我们使用 Yii Framework)中这样做?

有没有更好的方法来解决这个问题?

更新: 对于用户操作(Web UI),我们现在正在考虑通过简单的 Apache 配置自动将 Apache 日志加载到 mysql 中,并带有相关的会话信息

【问题讨论】:

    标签: php python logging asynchronous queue


    【解决方案1】:

    (AFAIK)只有两种方法可以在 PHP 中异步执行任何操作:

    • fork 进程(需要pcntl_fork
    • exec() 一个进程并通过(假设 *nix)将 > /dev/null & 附加到命令字符串的末尾来释放它。

    这两种方法都会导致创建一个新进程,尽管是暂时的,所以这是否能带来任何性能提升是值得商榷的,并且很大程度上取决于您的服务器环境 - 我怀疑这会使事情变得更糟,而不是更好。如果您的数据库负载非常重(因此会减慢您的速度),您可能会通过将日志消息转储到文件中获得更快的结果,并使用一个守护程序脚本来爬取进入数据库的东西 - 但同样,这是否有帮助值得商榷。

    Python supports multi-threading 让生活更轻松。

    【讨论】:

    • 通过独立的 HTTP 服务器登录呢?
    • @jaz - 我希望附加到日志文件比发送 HTTP 请求更快。
    【解决方案2】:

    您可以打开原始 Unix 或网络套接字到日志服务,该服务缓存消息并将它们异步写入磁盘或数据库。如果您的 PHP 和 Python 进程长时间运行并且每次执行会生成许多消息,则保持打开的套接字比同步发出单独的 HTTP/数据库请求更高效。

    您必须将其与附加到文件(打开一次,然后在运行时锁定、查找、写入和解锁并在结束时关闭)进行比较,看看哪个更快。

    【讨论】:

    • +1 - 我忘记了非阻塞套接字,大概这也适用于非阻塞文件流(至少在 PHP 中,Py 不是我的专长)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多