【发布时间】:2013-09-16 00:52:11
【问题描述】:
在我的开发机器上(谢天谢地,它没有发生在生产环境中——据我所知——我还知道),当我在一个 PHP 网站上工作时,我偶尔会遇到这个错误:
警告: require_once(filename.php): 失败 打开流:打开的文件太多 路径/functions.php 在第 502 行
致命错误:require_once(): 未能打开所需的 'filename.php' (include_path='/my/include/path') 在 路径/functions.php 在第 502 行
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。这些页面是否没有正确关闭或其他原因?我该如何解决这些问题?)
【问题讨论】: