"Unter Mac OS X werden zu viele Dateien geöffnet", nachdem Apache einige Zeit in PHP mit XDebug ausgeführt wurde

13

Ich verwende Mac OS X 10.9.4, einschließlich des integrierten Apache2-Webservers mit PHP 5.5.14 von brew (Pakete: php55, php55-intl, php55-pdo-pgsql, php55-xdebug).

Wenn Sie dieses Setup ausführen, funktioniert es recht gut. Nach einiger Zeit werde ich jedoch 403 Fehler für jede Anforderung ausführen. Ich habe das Apache-Fehlerprotokoll nachgeschlagen und Folgendes gefunden:

[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

Mir scheint, dass die Datei nicht mehr gelesen werden kann und irgendwie die 403 zurückgibt. Ich habe bereits einige Beschränkungen herausgefunden, aber launchctl gibt eine unbegrenzte Beschränkung für geöffnete Dateien zurück:

 ~ $ 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

Ich habe auch schon versucht, die maxfiles mit dem Befehl auf 4096 zu setzen launchctl limit maxfiles 4096 16384, aber das Problem kehrt nach einiger Zeit immer noch zurück. Irgendeine Idee, was ich sonst noch überprüfen kann?

UPDATE : Wenn lsof -c httpdich den von Gordon Davisson vorgeschlagenen Befehl ausführe, sehe ich, dass es eine Menge Einträge wie die folgenden gibt:

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

Ich kann sagen, dass die von mir verwendete Anwendung Websockets verwendet und auch ein Fallback verwendet, wenn Websockets nicht verfügbar sind oder das Gegenstück nicht auf dem Server ausgeführt wird. Was mich verwirrt ist das (CLOSED)-teil, warum ist es noch gelistet?

UPDATE : Nach einiger Zeit habe ich den cslistener-Port nachgeschlagen, der eigentlich 9000 ist. Dies ist wiederum der Port, den xdebug auf das Remote-Debuggen wartet. Ich glaube, ich habe dort eine falsche Konfiguration oder es handelt sich um einen Fehler in xdebug (ich verwende XDebug 2.2.5, installiert von brew).

Daniel Rotter
quelle

Antworten:

14

Verwenden Sie PHPStorm mit XDEBUG auf dem Mac?

Ich habe das gleiche Problem. Ich habe hier einen offenen Fehler bei XDEBUG gefunden:

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

Aktualisieren

Dieser Fehler wurde behoben:

Ich habe gerade einen Patch von Sean Dubois zusammengeführt, der dieses Problem beheben sollte \ o /! Der Patch wird in 2.3.4 und 2.4.0 sein.

Ich glaube, dies ist das Commit: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

Stellen Sie sicher, dass Sie mit diesem Patch eine aktualisierte Version verwenden .

Steve Tauber
quelle
Keine wirkliche Lösung, aber ich denke, es beantwortet die Frage
Daniel Rotter
Grundsätzlich verliert Xdebug Dateideskriptoren für Verbindungslistener (sorry, wenn dies technisch inkorrekt ist, ist das die Idee), wenn der Debug-Client nicht geöffnet ist. Stellen Sie zur Behebung des Problems sicher, dass der Debugger-Client geöffnet ist, wenn der Remote-Debugger eine Debugsitzung startet. Eine bessere Lösung wäre natürlich die Behebung des Fehlers durch die Entwickler.
McDado
Dies passiert auch bei einigen geöffneten Debuggern (zum Beispiel PhpStorm). Hoffentlich reparieren sie es :)
Steve Tauber
Das ist ziemlich wichtig, ich hoffe, dass bald ein Update veröffentlicht wird.
Hubert Perron
1
Eine andere Lösung ist es , Satz xdebug.remote_enable=0in php.inider xdebug Remote - Verbindungen zu drehen , wenn sie nicht verwendet wird . Apache Neustart erforderlich.
Gregory Cosmo Haun
7

Ich bin mir ziemlich sicher, dass in Apache etwas läuft (wahrscheinlich das PHP-Modul, aber es ist schwer sicher zu sein), das Dateideskriptoren verliert. Das heißt, es öffnet Dateien und lässt sie dann auf unbestimmte Zeit geöffnet. In diesem Fall dauert es nur länger, bis das Limit erreicht ist, wenn Sie das Limit für geöffnete Dateien erhöhen. Was Sie wirklich tun müssen, ist herauszufinden, was alle Dateien öffnet und sie offen lässt.

Sie können sich wahrscheinlich ein lsofBild davon machen, was mit dem Befehl ("LiSt Open Files") los ist :

sudo lsof -c httpd

Führe es aus, wenn Apache nicht lange gelaufen ist, um zu sehen, was normal ist, und wieder, wenn es das Limit erreicht. Suchen Sie in der zweiten Ausgabe nach vielen zusätzlichen Dateien, die nicht in der ersten Auflistung enthalten sind. Beachten Sie, dass dies dadurch etwas kompliziert wird, dass die von allen httpd-Prozessen geöffneten Dateien aufgelistet werden und (abhängig von Ihren Apache-Einstellungen und der Serverauslastung) möglicherweise eine große Anzahl von ihnen vorhanden ist. Das Wichtigste ist die Anzahl der Dateien, die von einem einzelnen Prozess geöffnet werden, nicht die Summe aller Serverprozesse. Sie können auch sudo lsof -p someprocessIDnur einen einzelnen Serverprozess gleichzeitig auflisten.

Wenn Sie sich die zusätzlichen geöffneten Dateien ansehen, erhalten Sie hoffentlich eine gute Vorstellung davon, was sie öffnen und was sie offen lassen.

Gordon Davisson
quelle
Versuchte es, ich habe die Frage aktualisiert.
Daniel Rotter
Ich bin nicht sehr vertraut mit der genauen Bedeutung der TCP-Socket-Zustände, aber es klingt für mich, als würden die Verbindungen zum Gegenüber nicht richtig geschlossen. Läuft das auf dem cslistener-Port (Nummer 9000)? Wie genau schließt Ihre App die Verbindungen zu ihrem Gegenüber? Ist es möglich, dass die TCP-Sitzung geschlossen wird, aber nicht der Dateideskriptor?
Gordon Davisson
1
Ich habe herausgefunden, dass 9000 der Port ist, auf dem xdebug lauscht. Ist es also möglich, dass der Fehler in dieser Erweiterung liegt?
Daniel Rotter
3

Das Hinzufügen der folgenden Zeile zu xdebug.ini löste auch das Problem für mich

xdebug.remote_autostart = 0
Femi Veys
quelle
1

Ich bekomme das gleiche mit OSX 10.9.4 und sowohl Apache 2.2 als auch PHP 5.3 von Brew.

Obwohl dies das Problem nicht wirklich behebt, können Sie es eindämmen, indem Sie die Apache MaxRequestsPerChild-Einstellung auf 10 setzen - was für die Entwicklung in Ordnung sein sollte.

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

Das sollte Sie zumindest davor bewahren, Apache von Zeit zu Zeit neu starten zu müssen, um diese durchgesickerten Dateien loszuwerden

Barryp
quelle