php守护程序可能存在内存泄漏

php守护程序可能存在内存泄漏,php,memory-leaks,daemon,Php,Memory Leaks,Daemon,我已经用php编写了一个守护进程,希望确保它不会泄漏内存,因为它将全天候运行 即使在最简单的形式中,守护进程的内存\u get\u peak\u使用情况也会报告脚本在每个周期消耗更多内存。另一方面,内存的使用不会增加 问题是:我应该担心吗?我已经将守护进程剥离到了最基本的部分,但这仍然在发生。有什么想法吗 #!/usr/bin/php -q <?php require_once "System/Daemon.php"; System_Daemon::setOption("appName"

我已经用php编写了一个守护进程,希望确保它不会泄漏内存,因为它将全天候运行

即使在最简单的形式中,守护进程的内存\u get\u peak\u使用情况也会报告脚本在每个周期消耗更多内存。另一方面,内存的使用不会增加

问题是:我应该担心吗?我已经将守护进程剥离到了最基本的部分,但这仍然在发生。有什么想法吗

#!/usr/bin/php -q

<?php
require_once "System/Daemon.php";
System_Daemon::setOption("appName", "smsd");
System_Daemon::start();
while(!System_Daemon::isDying()){
 System_Daemon::info("debug: memory_get_peak_usage: ".memory_get_peak_usage());
 System_Daemon::info("debug: memory_get_usage: ".memory_get_usage());
 System_Daemon::iterate(2);
}
#/usr/bin/php-q

您可以尝试在PHP5.3中使用新的垃圾收集器来防止循环引用出现问题

    • 你不应该这样做。为什么?因为PHP语言不够成熟,无法运行数小时、数天、数周或数月。PHP是用C编写的,它提供的所有魔力都必须得到处理。垃圾收集,取决于您的版本,可能有效,也可能无效,这取决于您编译和使用的扩展。是的,如果他们附带官方版本,他们应该“玩得很好”,但是你检查过你使用的是什么版本吗?您确定所有加载的扩展都意识到它们可能会运行10-30秒以上吗?考虑到大多数执行时间都不会发现漏洞,你确定它能正常工作吗

      关于这一点,我几乎要发疯了,因为我看到这个问题越来越多。我知道今天有两次

      你会用撬棍当牙签吗?考虑到呈现网页时PHP进程的预期寿命,Zend、Roadsend和PHC都不够成熟,无法处理可能被认为是长期运行的任何时间段。是的,即使使用基于C++的PHP编译器提供的GC设施,在PHP中编写守护进程是不明智的。
      我讨厌回答说你不能那样做,但在这种情况下,这是真的,至少现在是这样。

      我也遇到了同样的问题。也许最好的办法是在

      顺便说一句,这样的代码并没有显示memleak:

      #!/usr/bin/php -q
      
      <?php
      require_once "System/Daemon.php";
      System_Daemon::setOption("appName", "smsd");
      System_Daemon::start();
      while(!System_Daemon::isDying()) {
       print ("debug: memory_get_peak_usage: ".memory_get_peak_usage()."\n");
       print ("debug: memory_get_usage: ".memory_get_usage()."\n\n");
       System_Daemon::iterate(2);
      
      }
      
      #/usr/bin/php-q
      
      原来
      file\u get\u contents
      正在泄漏内存。每当我禁用这一行时,峰值内存使用率是稳定的。当我在中重新评论它时,每次迭代的峰值内存使用量将增加32字节

      使用
      fread
      调用
      file\u get\u contents
      (用于检索/var/run中pid文件内的数字),并解决了此问题

      此修补程序将是下一版本的一部分

      感谢(找不到匹配的尼克)也报告了这个bug()的人,否则我可能永远都不知道


      再次感谢

      你可能是对的,我只是碰巧用php比说c要好得多。它将执行一个相当简单的任务,所以我可能会尝试一下。我不确定PHP5.3是否正确。自从我们实现了循环垃圾收集以来,我已经在长时间运行的PHP(days)守护进程方面取得了很好的成功,即使在负载很重的情况下也是如此。虽然PHP对守护程序的支持确实很差,但我正试图用@Kendall Hopkins来改变这一点——几乎所有关于SO的答案都是在提出问题的时候得到回答的,只有少数例外。到今天为止,我的建议仍然是,不要将PHP用于系统进程。如果您这样做了,请确保运行的是一个令人满意的PHP版本,PHP应该演示一个稳定且工作正常的GC。您可能会考虑添加一个回答。FYI,我们写了一个“守护进程”脚本,用于TwiteStMS.com。它是一个PHP5.3脚本,使用条令(DB ORM mapper),启动其他命令,并将日志消息保存到DB(通过条令)。我今天检查了一下,守护进程已经运行了4个多月,没有增加任何内存使用。我们在每个循环之后调用gc\u collect\u cycles(),以防万一。共享您的守护程序包装器将非常棒;)@很抱歉我没有及时回复。但是是的,嗯。它基本上只是一个无止境的while循环,在迭代之前使用一段时间。没别的了。只需确保记录每次迭代的内存\u get\u peak\u usage()。这样你就能知道你是否有内存泄漏。