更新

更新

我正在运行 Mac OS X 10.9.4,包括来自 brew 的内置 apache2 网络服务器和 PHP 5.5.14(软件包:php55、php55-intl、php55-pdo-pgsql、php55-xdebug)。

运行此设置时,它运行得很好。但是,一段时间后,每次请求都会出现 403 错误。我查看了 apache 错误日志,发现了类似以下内容:

[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Warning:  require_once(/Users/daniel/Development/massiveart/sulu-complete/app/bootstrap.php.cache): failed to open stream: Too many open files in /Users/daniel/Development/massiveart/sulu-complete/web/website.php on line 10, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Stack trace:, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP   1. {main}() /Users/daniel/Development/massiveart/sulu-complete/web/website.php:0, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Fatal error:  require_once(): Failed opening required '/Users/daniel/Development/massiveart/sulu-complete/web/../app/bootstrap.php.cache' (include_path='.:/usr/local/Cellar/php55/5.5.14/lib/php') in /Users/daniel/Development/massiveart/sulu-complete/web/website.php on line 10, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Stack trace:, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP   1. {main}() /Users/daniel/Development/massiveart/sulu-complete/web/website.php:0, referer: http://sulu.lo/de
[Fri Jul 25 05:28:40 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:45 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:45 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de

在我看来,该文件无法再读取,并且不知何故返回了 403。我已经发现了某些限制,但 launchctl 返回了“我对打开的文件有无限制的硬限制”:

 ~ $ launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        unlimited      unlimited
    stack       8388608        67104768
    core        0              unlimited
    rss         unlimited      unlimited
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

我也尝试使用命令将 maxfiles 设置为 4096 launchctl limit maxfiles 4096 16384,但一段时间后问题仍然会再次出现。知道我还可以检查什么吗?

更新:当按照 Gordon Davisson 的建议运行lsof -c httpd命令时,我可以看到有大量如下所示的条目:

httpd   1361 _www   15u    IPv4 0xb306b48659f63853       0t0     TCP localhost:50603->localhost:cslistener (CLOSED)

我可以说我使用的应用程序正在使用 websockets,并且当 websockets 不可用或对应方未在服务器上运行时也会使用回退。让我困惑的是 -part (CLOSED),为什么它仍然列出?

更新:过了一段时间,我查看了 cslistener 端口,实际上是 9000,这也是 xdebug 监听远程调试的端口。所以我猜我那里的配置有误,或者是 xdebug 中的一个错误(我使用的是 XDebug 2.2.5,由 brew 安装)

答案1

您在 Mac 上将 PHPStorm 与 XDEBUG 一起使用吗?

我有同样的问题。我在这里发现了一个用 XDEBUG 提交的未解决的错误:

http://bugs.xdebug.org/view.php?id=1070

更新

该错误现已被修复:

我刚刚合并了 Sean Dubois 的一个补丁,应该可以修复这个问题 \o/!该补丁将包含在 2.3.4 和 2.4.0 中。

我相信这是承诺:https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

确保你使用更新版本使用这个补丁。

答案2

我非常确定您在 Apache 中运行了某些程序(可能是 PHP 模块,但很难确定),这些程序正在泄漏文件描述符。也就是说,它会打开文件,然后无限期地让它们保持打开状态。如果是这种情况,增加打开文件限制只会使达到限制所需的时间更长。您真正需要做的是追踪打开所有文件并让它们保持打开状态的原因。

您也许可以了解一下lsof("LiSt Open Files") 命令的作用:

sudo lsof -c httpd

当 apache 运行时间不长时运行它,看看是否正常,然后在达到限制时再次运行。在第二个输出中查找第一个列表中没有的大量其他文件。请注意,这将有点复杂,因为它会列出由全部httpd 进程,并且(取决于您的 apache 设置和服务器负载)可能有大量进程;重要的是单个进程打开的文件数,而不是所有服务器进程的总数。您还可以使用sudo lsof -p someprocessID一次仅列出单个服务器进程。

希望看到额外打开的文件可以让您很好地了解是什么打开了它们以及使它们保持打开状态。

答案3

在 xdebug.ini 中添加以下行也解决了我的问题

xdebug.remote_autostart = 0

答案4

我在 OSX 10.9.4 以及来自 Brew 的 Apache 2.2 和 PHP 5.3 上也遇到了同样的问题。

虽然这实际上并不能解决问题,但您可以通过将 Apache MaxRequestsPerChild 设置设置为 10 之类的值来控制它 - 这对于开发来说应该没问题。

diff -r 2c0473b696fd -r acf809f04b17 apache2/2.2/httpd.conf
--- a/apache2/2.2/httpd.conf    Thu Aug 14 16:14:25 2014 -0500
+++ b/apache2/2.2/httpd.conf    Thu Aug 14 16:19:10 2014 -0500
@@ -437,7 +437,7 @@
 # necessary.

 # Server-pool management (MPM specific)
-#Include /usr/local/etc/apache2/2.2/extra/httpd-mpm.conf
+Include /usr/local/etc/apache2/2.2/extra/httpd-mpm.conf

 # Multi-language error messages
 #Include /usr/local/etc/apache2/2.2/extra/httpd-multilang-errordoc.conf
diff -r 2c0473b696fd -r acf809f04b17 apache2/2.2/extra/httpd-mpm.conf
--- a/apache2/2.2/extra/httpd-mpm.conf  Thu Aug 14 16:14:25 2014 -0500
+++ b/apache2/2.2/extra/httpd-mpm.conf  Thu Aug 14 16:19:10 2014 -0500
@@ -38,7 +38,7 @@
     MinSpareServers       5
     MaxSpareServers      10
     MaxClients          150
-    MaxRequestsPerChild   0
+    MaxRequestsPerChild  10
 </IfModule>

 # worker MPM

这至少可以让你不必经常重新启动 apache 来清除那些泄露的文件

相关内容