如何减少多进程PHP应用程序的内存占用量

时间:2013-02-22 08:44:51

标签: php multithreading memory-management compilation

我有一个连续运行的多进程PHP(CLI)应用程序。我正在尝试优化内存使用量,因为每个进程使用的内存量限制了我可以在任何给定时间运行的分叉数(因为我有可用的内存量有限)。我尝试了几种方法。例如,按照preinheimer给出的建议,我重新编译PHP,禁用所有扩展,然后只重新启用我的应用程序所需的那些(mysql,curl,pcntl,posix和json)。但是,这并没有减少内存使用量。它实际上略有增加。

我几乎已经准备好放弃多进程方法了,但是我正在做最后的努力,看看是否有其他人对如何减少内存使用有更好的想法。我将发布我的替代方法,其中涉及我的应用程序的重大重构,下面。

非常感谢能够帮助我应对这一挑战的任何人!

1 个答案:

答案 0 :(得分:0)

Mutli-process PHP应用程序(例如,使用pcntl_fork()分叉自己的应用程序)在内存方面本质上是低效的,因为每个子进程将php可执行文件的整个副本加载到内存中。这可以轻松相当于每个进程10 MB或更多内存(取决于应用程序)。理论上,将扩展编译为共享库应该可以减少内存占用,但是我在这方面的成功有限(实际上,我的尝试使内存使用因某些未知原因而变得更糟)。

更好的方法是使用多线程。在这种方法中,应用程序驻留在单个进程中,但是可以在单独的线程中同时执行多个动作**(即多任务)。传统上,PHP并不适用于多线程应用程序,但最近一些新的扩展使得PHP中的多线程更加可行。例如,参见this answer关于PHP中多线程的问题(其接受的答案已经过时)。

对于上述问题,我计划使用pthreads将我的应用程序重构为多项目。这需要大量的修改,但它(希望)会为应用程序带来更高效的整体架构。我会继续更新这个答案,并为其他想做类似事情的人提供一些重新考虑的例子。其他人可以随意提供反馈,并使用代码示例更新此答案!

*关于并发的脚注:除非有一台多核机器,否则实际上不会同时执行 操作。但是它们将被安排在不同的小时间片上运行在CPU上。从用户的角度来看,它们似乎会同时运行。