pcntl_fork()的最大执行时间超过300秒

时间:2014-05-17 08:21:02

标签: php linux process centos

我有一些代理正在运行,经过几周的正常模式后,我们突然得到:

Maximum execution time of 300 seconds exceeded

在一行

$this->pids[$next_child] = pcntl_fork();

我们也有:

[root@a ~]# ulimit -u
385913

[root@a ~]# ps ax | wc -l
400

[root@a ~]# cat /proc/sys/kernel/pid_max
4194303

strace shows

poll([{fd=4, events=POLLIN|POLLPRI|POLLHUP}], 1, 1000) = 0 (Timeout)

我们在php5.4 centos上,它可能是一个PHP bug吗?或者什么可能是错的? 的更新 2年后仍然有这个错误,从那时起我们升级到php5.6然后到php7,现在到php7.3.1

2 个答案:

答案 0 :(得分:1)

这个错误有点神秘。因此,我们必须进行一些调试才能找到问题的根源。

注意:而不是专注于函数pcntl_fork或PHP错误。我将专注于这是一个系统资源问题。因为,抛出错误的行包含fork。我们将从那里看到它的位置

  • 错误可能是错误或不重要。要对此进行测试,请将ini_set('MAX_EXECUTION_TIME', -1);添加到脚本的最顶部。如果您的脚本按预期运行没有任何问题,那么这是真的。如果没有,那么我们应该检查一下这种行为。如果你的代理人在他们正常抛出错误的时候开始服务客户端时遇到问题,这可能意味着错误意味着某些资源不足。如果情况并非如此,您应该检查代理商的行为,以便了解有关问题原因的更多信息。

  • 如果您从我听过的内容中使用它,则错误可能与Active URL缓存的大小有关。

如果问题仍然存在,您需要提供有关您的环境和配置的更多信息,以便我们为您提供帮助。

问题:您是否有机会使用Magento?

答案 1 :(得分:0)

在不知道整个代码的情况下很难确切地说...但我的第一个倾向是确保在脚本完成后你正确地杀死进程。如果没有这一点,偷看使用可能会耗尽资源来处理新的过程,但由于它们的性质,它们会死亡。非常不同。

请确保您没有假设您在退出时终止了该进程,请尝试 posix_kill( $this->pids[ $next_child ], 15 );

您可以尝试使用sig 9而不是15,但我不建议在生产中使用它 - 但它可能有助于调试问题。实际上,您可能会检查9,这可能是问题... posix_kill( $this->pids[ $next_child ], 9 );不会进行任何清理。