包含/需要PHP脚本时间歇性的“太多打开文件”

时间:2013-09-16 00:52:11

标签: php require

在我的开发框中(谢天谢地,它还没有在生产中发生 - 我还知道),因为我正在PHP网站上工作,我偶尔会遇到这样的错误:

  

警告:   require_once( filename.php ):失败   打开流:打开的文件过多   第502行的路径 /functions.php

     

致命错误:require_once():无法打开所需的' filename.php '   (include_path ='/ my / include / path')in   第502行的路径 /functions.php

functions.php的第502行是我的“自动加载”功能,它自动需要包​​含我使用的类的PHP文件:

function autoload($className)
{
    require_once $className . ".php";   // <-- Line 502
}

通过“偶然”错误,我的意思是它可以在大约一天的开发中正常工作,然后当我第一次看到这个时,我可以刷新页面,它会再次没问题,然后刷新给了我同样的错误。这种情况在每次开始显示之前只发生过几次。有时它需要的文件名称(我有一个分成几个PHP文件的脚本)是不同的...它并不总是它轰炸的第一个或最后一个或中间文件。

重启php-fpm似乎解决了症状,但从长远来看并不是问题。

我在我的Mac(OS X 10.8)上使用nginx 1.4.2通过php-fpm运行PHP 5.5.3。

正在运行lsof | grep php-fpm | wc -l告诉我php-fpm已打开 824 个文件。当我检查实际输出时,我看到了这一点,以及一些.so.dylib文件,绝大多数行都是这样的:

php-fpm    4093 myuser  69u   unix 0x45bc1a64810eb32b    0t0   ->(none)

每行的“69u”段和0x45bc1a6481 ...号不同。这意味着什么?这是问题吗? (ulimit是“无限制”)

顺便说一句(虽然可能不相关),但也有一两个:

php-fpm  4093 myuser  8u  IPv4 0x45bc1a646b0f97b3   0t0   TCP 192.168.1.2:59611->rest.nexmo.com:https (CLOSE_WAIT)

(我有一些页面使用HttpRequest(PECL库)来调用Nexmo API。这些页面是否未正确关闭或者什么?我怎样才能打击那些?)

1 个答案:

答案 0 :(得分:1)

尝试将php-fpm(默认设置为无限)设置为更适合您需要的值。

例如:

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

也许,如果你的应用程序使用大量文件,也可以设置它:

rlimit_files = 1024