"Забагато файлів відкрито" на Mac OSX після деякого часу запуску apache в PHP з XDebug


13

Я запускаю 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. Я вже дізнався про певні обмеження, але запуск returnctl у мене є необмежений жорсткий ліміт для відкритих файлів:

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

Відповіді:


14

Ви використовуєте PHPStorm з XDEBUG на Mac?

У мене така ж проблема. Тут я знайшов відкриту помилку, подану разом з XDEBUG:

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

Оновлення

Цю помилку тепер виправлено:

Я щойно об’єднав патч Шона Дюбуа, який повинен виправити це \ о /! Виправлення буде в 2.3.4 та 2.4.0.

Я вважаю, що це зобов'язання: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

Переконайтеся, що ви використовуєте оновлену версію з цим патчем.


Насправді не рішення, але я думаю, що це відповідає на питання
Даніель Роттер

В основному, Xdebug просочує дескриптори файлів для слухачів підключень (вибачте, якщо це технічно неправильно, це ідея), коли клієнт налагодження не відкритий. Щоб вирішити проблему, переконайтеся, що клієнт налагодження відкритий, коли віддалений налагоджувач починає сеанс налагодження. Звичайно, кращим рішенням було б виправлення помилок розробниками.
mcdado

Це також відбувається з відкритими відладчиками (наприклад, PhpStorm). Сподіваємось, вони це виправлять :)
Стів Таубер

Це досить важливо, я сподіваюся, що виправлення буде видано незабаром.
Хуберт Перрон

1
Іншим рішенням є набір xdebug.remote_enable=0в , php.iniщоб включити віддалені з'єднання Xdebug , коли вони не використовуються. Потрібен перезапуск Apache.
Григорій Космо Хаун

7

Я впевнений, що у вас є щось, що працює в апачі (можливо, модуль PHP, але важко бути впевненим), що це протікання дескрипторів файлів. Тобто, це відкриття файлів, а потім просто їх відкриття на невизначений термін. У такому випадку збільшення ліміту відкритого файлу просто перевищує ліміт часу. Що вам дійсно потрібно зробити, це відстежити, що відкриває всі файли та залишає їх відкритими.

Напевно, ви можете отримати уявлення про те, що відбувається з командою lsof("LiSt Open Files"):

sudo lsof -c httpd

Запустіть його, коли апарат довго не працює, щоб побачити, що нормально, а потім знову, коли він досягне межі. Подивіться у другому виході багато додаткових файлів, яких немає в першому списку. Зауважте, що це буде дещо ускладнено тим, що в ньому будуть перераховані файли, відкриті всіма процесами httpd, і (залежно від ваших налаштувань apache та завантаження сервера) їх може бути велика кількість; найважливіше - це кількість файлів, відкритих одним процесом, а не загальна кількість для всіх серверних процесів. Ви також можете одночасно sudo lsof -p someprocessIDперераховувати лише один серверний процес.

Сподіваємось, що побачити зайві відкриті файли, ви дасте гарне уявлення про те, що їх відкривати та залишати відкритими.


Спробувавши, я оновив питання.
Даніель Роттер

Я не дуже знайомий з точним значенням стану сокетів TCP, але мені здається, що з'єднання з аналогом не закриваються належним чином. Це працює на порту cslistener (номер 9000)? Як саме ваш додаток закриває зв’язки зі своїм аналогом? Чи можливо це закриття сеансу TCP, але не дескриптор файлу?
Гордон Девіссон

1
Я дізнався, що 9000 - порт xdebug, який слухає, тож чи можливо помилка в цьому розширенні?
Даніель Роттер

3

Додавання наступного рядка до xdebug.ini також вирішило проблему для мене

xdebug.remote_autostart = 0

1

Я отримую те ж саме з 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 так часто, щоб позбутися цих витікаючих файлів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.