PHP警告:exec():无法分叉

时间:2016-12-07 06:48:56

标签: php linux

  

PHP警告:exec():无法在some.php中分叉[rm some_file.txt]   第111行

关于这个问题,有一个问题已被提出PHP Warning: exec() unable to fork我有类似的问题,但不一样。

ulimit -a 

core file size          (blocks, -c) 0                                        
data seg size           (kbytes, -d) unlimited                                
scheduling priority             (-e) 0                                        
file size               (blocks, -f) unlimited                                
pending signals                 (-i) 31364                                    
max locked memory       (kbytes, -l) 64                                       
max memory size         (kbytes, -m) unlimited                                
open files                      (-n) 1024                                     
pipe size            (512 bytes, -p) 8                                        
POSIX message queues     (bytes, -q) 819200                                   
real-time priority              (-r) 0                                        
stack size              (kbytes, -s) 10240                                    
cpu time               (seconds, -t) unlimited                                
max user processes              (-u) 31364                                    
virtual memory          (kbytes, -v) unlimited                                
file locks                      (-x) unlimited 

我的限制如上所示,看起来服务器上没有任何可以影响此错误的限制。

我尝试在使用未设置的变量并将它们设置为null以释放内存后取消设置变量。但它没有效果。

unset($var);
$var = null;

由于某些资源耗尽而无法解决错误,但我无法找到原因。 您能否建议我查看哪些日志?

此问题的任何想法或解决方法?

1 个答案:

答案 0 :(得分:1)

  

此问题的任何想法或解决方法?

问题可能是代码中的一个缺陷 - 就像在https://stackoverflow.com/a/20649541/2038383中一样。因此,解决方法就是修复它。

  

你能告诉我我应该看哪些日志吗?

有PHP日志,然后是系统/内核日志。

您已经知道在哪里获取PHP日志以及默认情况下的内容。不幸的是,你不会从PHP中获得更多。您可以使用set_error_handler()自己捕获错误,但这不会为您提供更多有用的信息(它会给您PHP"#34; errno"但不是UNIX&# 39; s errno)。

至于系统日志;我在评论中说过检查你的syslog。那里可能有一些东西,它始终是一个很好的起点。但实际上你通常不会在syslog中看到ulimit违规。有些会被记录(示例stack size会生成记录的段错误)但很多人不会记录。这篇文章介绍了如何获取ulimit违规行为的日志:https://unix.stackexchange.com/questions/139011/how-do-i-configure-logging-for-ulimits。令人惊讶的是非常微不足道。

系统调用应报告系统ulimit违规的方式是设置errno。例如,如果点击max user processes fork()将返回EAGAIN

所以......你需要得到那个UNIX errno才能知道真正发生了什么。不幸的是,我认为PHP中没有一种方法(有posix_errno(),但很可靠,仅限于PHP的posix_XXX函数库)。另请注意,它是PHP generating the "Unable to fork"消息。映射到实际系统调用错误的方式并不完全透明。

最好看看有其他方法来调试哪些有很多。与系统监控工具一样:psdstatstrace可能是一个良好的开端。