在我的开发箱上(谢天谢地,它还没有在生产中发生——我知道——但是),当我在一个 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。这些页面是否没有正确关闭或其他什么?我该如何打击这些?)