1

在我的开发箱上(谢天谢地,它还没有在生产中发生——我知道——但是),当我在一个 PHP 站点上工作时,我偶尔会收到这个错误:

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

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

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

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

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

重新启动 php-fpm 似乎可以解决症状,但从长远来看不是问题。

我在我的 Mac (OS X 10.8) 上通过 php-fpm 使用 nginx 1.4.2 运行 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。这些页面是否没有正确关闭或其他什么?我该如何打击这些?)

4

1 回答 1

1

尝试根据您的需要将 php-fpm(默认情况下它们设置为无限)设置为更合适的值。

例如:

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

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

rlimit_files = 1024
于 2014-11-16T13:25:33.343 回答