Я использую 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)
-part, почему он все еще указан?
ОБНОВЛЕНИЕ : Через некоторое время я посмотрел порт cslistener, который на самом деле является 9000, который снова является тем, какой порт xdebug прослушивает для удаленной отладки. Так что я думаю, что у меня там какая-то неправильная конфигурация, или это ошибка в xdebug (я использую XDebug 2.2.5, установленный brew)
источник
xdebug.remote_enable=0
в ,php.ini
чтобы включить удаленные соединения Xdebug , когда они не используются. Требуется перезагрузка Apache.Я почти уверен, что у вас есть что-то, работающее в apache (возможно, модуль PHP, но в этом трудно убедиться), которое пропускает дескрипторы файлов. То есть он открывает файлы, а затем просто оставляет их открытыми на неопределенный срок. Если это так, то увеличение лимита открытых файлов просто увеличивает время, необходимое для достижения лимита. Что вам действительно нужно сделать, так это отследить, что открывает все файлы и оставляет их открытыми.
Вы, вероятно, можете получить некоторое представление о том, что происходит с командой
lsof
("LiSt Open Files"):Запустите его, когда Apache долго не работал, чтобы увидеть, что нормально, и снова, когда он достигнет предела. Ищите во втором выводе множество дополнительных файлов, которых нет в первом списке. Обратите внимание, что это будет несколько усложнено тем фактом, что в нем будут перечислены файлы, открытые всеми процессами httpd, и (в зависимости от настроек apache и нагрузки на сервер) их может быть много; важнее всего количество файлов, открытых одним процессом, а не общее количество всех процессов сервера. Вы также можете использовать
sudo lsof -p someprocessID
для перечисления только один процесс сервера за один раз.Надеюсь, что вы увидите, какие дополнительные открытые файлы дадут вам хорошее представление о том, как их открывать и оставлять открытыми.
источник
Добавление следующей строки в xdebug.ini также решило проблему для меня
источник
Я получаю то же самое с OSX 10.9.4 и Apache 2.2 и PHP 5.3 от Brew.
Хотя это на самом деле не решает проблему, вы можете ее устранить, установив для параметра Apache MaxRequestsPerChild значение, подобное 10 - что должно быть хорошо для разработки.
Это должно избавить вас, по крайней мере, от необходимости перезапускать Apache так часто, чтобы избавиться от этих утечек файлов
источник