【问题标题】:Intermittent "too many open files" when including/requiring PHP scripts包含/需要 PHP 脚本时间歇性“打开的文件太多”
【发布时间】: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。这些页面是否没有正确关闭或其他原因?我该如何解决这些问题?)

【问题讨论】:

    标签: php require


    【解决方案1】:

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

    例如:

    emergency_restart_threshold = 10
    emergency_restart_interval = 1m
    process_control_timeout = 10s
    

    如果您的应用可以处理大量文件,也可以设置此项:

    rlimit_files = 1024
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2018-04-16
      相关资源
      最近更新 更多