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