Python 和 PHP 的异步日志策略
情况是这样的:我们有一堆 Python 脚本在不停地运行,最后把数据写入 MySQL 数据库。我们需要一个日志来分析错误率和脚本的性能。
此外,我们还有一个用 PHP 做的前端,它和 MySQL 数据库的数据进行交互。我们也需要记录用户的操作,这样才能分析他们的行为,并计算一些评分函数。因此,我们想为每种情况建立一个 MySQL 表(一个用于“Python 脚本”日志,另一个用于“用户操作”日志)。
理想情况下,我们希望能够异步地写入这些日志表,这样可以提高性能并减少延迟。请问在 Python(我们使用的是 Django ORM)和 PHP(我们使用的是 Yii 框架)中,有什么方法可以做到这一点吗?
有没有更好的方法来解决这个问题?
更新:关于用户操作(网页界面),我们现在考虑通过简单的 Apache 配置,将 Apache 日志自动加载到 MySQL 中,并附带相关的会话信息。
2 个回答
你可以打开一个原始的Unix或网络连接,连接到一个日志服务,这个服务会缓存信息,然后异步地把这些信息写入磁盘或数据库。如果你的PHP和Python程序运行时间很长,并且每次执行都会产生很多信息,那么保持这个连接是比每次都发HTTP请求或数据库请求要快的。
你需要测量一下这种方法和把信息追加到文件(先打开文件,然后上锁、定位、写入、解锁,最后在结束时关闭文件)相比,哪个更快。
据我所知,PHP中只有两种方法可以实现异步操作:
- 分叉进程(需要使用
pcntl_fork
) - 使用
exec()
来启动一个进程,并通过在命令字符串末尾加上> /dev/null &
来释放它(假设你使用的是类Unix系统)。
这两种方法都会创建一个新的进程,虽然是暂时的,所以它们是否能提高性能是有争议的,主要取决于你的服务器环境。我怀疑这可能会让事情变得更糟,而不是更好。如果你的数据库负载很重(也就是导致你速度慢的原因),你可能会通过把日志信息写入文件,然后用一个后台脚本去处理这些信息并存入数据库,来获得更快的结果。但同样,这是否真的有帮助也是个问题。
Python支持多线程,这让事情变得简单很多。