用XDebug在PHP中运行apache一段时间后,在Mac OSX上“打开太多文件”


13

我正在运行Mac OS X 10.9.4,包括带有来自brew的PHP 5.5.14的内置apache2 Web服务器(软件包: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,但是一段时间后问题仍然出现。知道我还能检查什么吗?

更新lsof -c httpd按照戈登·戴维森的建议运行命令时,我看到有很多类似以下的条目:

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

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

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

Answers:


14

您是否在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

确保您在此修补程序中使用更新的版本


并不是真正的解决方案,但我认为它可以回答问题
Daniel Rotter 2014年

基本上,当调试客户端未打开时,Xdebug会泄漏连接侦听器的文件描述符(很抱歉,如果从技术上来说不正确,那就是这样)。要解决此问题,请确保在远程调试器启动调试会话时打开调试器客户端。当然,更好的解决方案是由开发人员修复该错误。
mcdado 2014年

打开某些调试器(例如PhpStorm)时,也会发生这种情况。希望他们会解决这个问题:)
史蒂夫·陶伯

这非常重要,我希望很快会发布修复程序。
休伯特·佩隆

1
另一个解决方法是设置xdebug.remote_enable=0php.ini当不使用它们转Xdebug的远程连接。需要Apache重新启动。
Gregory Cosmo Haun

7

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

您可能会知道使用lsof(“ LiSt Open Files”)命令发生了什么:

sudo lsof -c httpd

如果apache没运行很长时间,请运行它以查看正常情况,然后在达到极限时再次运行。在第二个输出中查找第一个清单中没有的许多其他文件。注意,由于它将列出所有 httpd进程打开的文件,因此这会有些复杂,并且(取决于您的apache设置和服务器负载)可能会有很多文件;重要的是单个进程打开的文件数,而不是所有服务器进程总数。您也可以一次sudo lsof -p someprocessID只列出一个服务器进程。

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


试过了,我已经更新了问题。
丹尼尔·罗特

我对TCP套接字状态的确切含义不是很熟悉,但是在我看来,与对方的连接未正确关闭。它在cslistener端口(编号9000)上运行吗?您的应用如何精确关闭与对方的连接?是否有可能关闭TCP会话,而不是文件描述符?
戈登·戴维森

1
我发现xdebug监听的端口是9000,因此此扩展名中是否可能出现错误?
Daniel Rotter 2014年


1

我在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来摆脱那些泄漏的文件的麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.