【问题标题】:How to reduce the memory footprint of a multi-process PHP application如何减少多进程 PHP 应用程序的内存占用
【发布时间】:2013-02-22 17:08:08
【问题描述】:

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

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

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

【问题讨论】:

  • 虽然这不是你问题的真正答案,而是一个建议看看:你看过 php hiphop 吗? php hiphop 将你的 php 重新编译成 c++。最终这可能对你有用,但这取决于你如何编写代码以及你使用什么函数。我不知道它是否适用于 pcntl,但根据我的经验,它可能会大大提高速度和内存使用率。
  • 是的,我确实有。我在研究这个问题时发现了它的存在。我没有尝试过 HipHop 的主要原因只是因为我没有使用它的经验(我知道这不是一个很好的理由)。这是一个很好的建议,我认为它可以很好地回答这个问题。如果你有经验,你想把一些想法变成答案吗?

标签: php multithreading memory-management compilation


【解决方案1】:

多进程 PHP 应用程序(例如,使用 pcntl_fork() 分叉自身的应用程序)在内存方面本身就效率低下,因为每个子进程都会将 php 可执行文件的完整副本加载到内存中。这可以很容易地等同于每个进程 10 MB 的内存或更多(取决于应用程序)。从理论上讲,将扩展编译为共享库应该可以减少内存占用,但我在这方面的成功有限(实际上,我在这方面的尝试由于某种未知原因使内存使用情况变得更糟)。

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

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

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

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 2012-03-25
    • 2023-03-07
    • 2011-06-25
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多