Python 和 PHP 的异步日志策略

3 投票
2 回答
2388 浏览
提问于 2025-04-17 04:46

情况是这样的:我们有一堆 Python 脚本在不停地运行,最后把数据写入 MySQL 数据库。我们需要一个日志来分析错误率和脚本的性能。

此外,我们还有一个用 PHP 做的前端,它和 MySQL 数据库的数据进行交互。我们也需要记录用户的操作,这样才能分析他们的行为,并计算一些评分函数。因此,我们想为每种情况建立一个 MySQL 表(一个用于“Python 脚本”日志,另一个用于“用户操作”日志)。

理想情况下,我们希望能够异步地写入这些日志表,这样可以提高性能并减少延迟。请问在 Python(我们使用的是 Django ORM)和 PHP(我们使用的是 Yii 框架)中,有什么方法可以做到这一点吗?

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

更新:关于用户操作(网页界面),我们现在考虑通过简单的 Apache 配置,将 Apache 日志自动加载到 MySQL 中,并附带相关的会话信息。

2 个回答

2

你可以打开一个原始的Unix或网络连接,连接到一个日志服务,这个服务会缓存信息,然后异步地把这些信息写入磁盘或数据库。如果你的PHP和Python程序运行时间很长,并且每次执行都会产生很多信息,那么保持这个连接是比每次都发HTTP请求或数据库请求要快的。

你需要测量一下这种方法和把信息追加到文件(先打开文件,然后上锁、定位、写入、解锁,最后在结束时关闭文件)相比,哪个更快。

2

据我所知,PHP中只有两种方法可以实现异步操作:

  • 分叉进程(需要使用 pcntl_fork
  • 使用 exec() 来启动一个进程,并通过在命令字符串末尾加上 > /dev/null & 来释放它(假设你使用的是类Unix系统)。

这两种方法都会创建一个新的进程,虽然是暂时的,所以它们是否能提高性能是有争议的,主要取决于你的服务器环境。我怀疑这可能会让事情变得更糟,而不是更好。如果你的数据库负载很重(也就是导致你速度慢的原因),你可能会通过把日志信息写入文件,然后用一个后台脚本去处理这些信息并存入数据库,来获得更快的结果。但同样,这是否真的有帮助也是个问题。

Python支持多线程,这让事情变得简单很多。

撰写回答