Обновлять

Обновлять

Я использую Mac OS X 10.9.4, включая встроенный веб-сервер apache2 с PHP 5.5.14 от brew (пакеты: 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)

Я могу сказать, что приложение, которое я использую, использует веб-сокеты, а также использует резервный вариант, когда веб-сокеты недоступны или аналог не запущен на сервере. Что меня смущает, так это -часть (CLOSED), почему она все еще указана?

ОБНОВЛЯТЬ: Через некоторое время я посмотрел порт cslistener, который на самом деле 9000, который, опять же, является тем портом, который xdebug слушает для удаленной отладки. Так что я предполагаю, что у меня там какая-то неправильная конфигурация, или это ошибка в xdebug (я использую XDebug 2.2.5, установленный brew)

решение1

Используете ли вы PHPStorm с XDEBUG на Mac?

У меня та же проблема. Я нашел открытый баг, поданным с помощью XDEBUG здесь:

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

Обновлять

Эта ошибка уже исправлена:

Я только что добавил патч от Шона Дюбуа, который должен это исправить \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, и с Apache 2.2, и с PHP 5.3 от Brew.

Хотя это на самом деле не решает проблему, вы можете ограничить ее, установив параметр 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 время от времени, чтобы избавиться от этих утёкших файлов.

Связанный контент