Estoy ejecutando Mac OS X 10.9.4, incluido el servidor web incorporado apache2 con PHP 5.5.14 de brew (paquetes: php55, php55-intl, php55-pdo-pgsql, php55-xdebug).
Al ejecutar esta configuración, funciona bastante bien. Sin embargo, después de algún tiempo, ejecutaré 403 errores por cada solicitud. He buscado el registro de errores de apache y he encontrado algo como lo siguiente:
[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
Me parece que el archivo ya no se puede leer, y devuelve el 403 de alguna manera. Ya descubrí ciertos límites, pero launchctl devuelve que tengo un límite estricto ilimitado en los archivos abiertos:
~ $ 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
También he intentado establecer los maxfiles en 4096 con el comando launchctl limit maxfiles 4096 16384
, pero el problema aún regresa después de un tiempo. ¿Alguna idea de qué más puedo consultar?
ACTUALIZACIÓN : Al ejecutar el lsof -c httpd
comando sugerido por Gordon Davisson, puedo ver que hay muchas entradas como las siguientes:
httpd 1361 _www 15u IPv4 0xb306b48659f63853 0t0 TCP localhost:50603->localhost:cslistener (CLOSED)
Puedo decir que la aplicación que uso está usando WebSockets, y también está utilizando un recurso alternativo cuando WebSocket no está disponible o la contraparte no se está ejecutando en el servidor. Lo que me confunde es la parte (CLOSED)
, ¿por qué sigue en la lista?
ACTUALIZACIÓN : Después de un tiempo busqué el puerto cslistener, que en realidad es 9000, que de nuevo es qué puerto xdebug está escuchando para la depuración remota. Así que supongo que tengo una configuración incorrecta allí, o es un error en xdebug (estoy usando XDebug 2.2.5, instalado por brew)
fuente
xdebug.remote_enable=0
enphp.ini
a su vez de las conexiones remotas Xdebug cuando no usarlos. Se requiere reiniciar Apache.Estoy bastante seguro de que tiene algo ejecutándose en Apache (probablemente el módulo PHP, pero es difícil estar seguro) que está filtrando descriptores de archivos. Es decir, está abriendo archivos y luego dejándolos abiertos indefinidamente. Si este es el caso, aumentar el límite de archivos abiertos solo demora más en alcanzar el límite. Lo que realmente necesita hacer es localizar qué está abriendo todos los archivos y dejarlos abiertos.
Probablemente pueda hacerse una idea de lo que está sucediendo con el
lsof
comando ("LiSt Open Files"):Ejecútelo cuando Apache no se haya estado ejecutando durante mucho tiempo para ver qué es normal, y nuevamente cuando llegue al límite. Busque en la segunda salida muchos archivos adicionales que no están en la primera lista. Tenga en cuenta que esto será algo complicado por el hecho de que enumerará los archivos abiertos por todos los procesos httpd, y (dependiendo de la configuración de apache y la carga del servidor) puede haber una gran cantidad de ellos; Lo importante es la cantidad de archivos abiertos por un solo proceso, no el total en todos los procesos del servidor. También puede usar
sudo lsof -p someprocessID
para enumerar solo un proceso de servidor a la vez.Con suerte, ver cuáles son los archivos abiertos adicionales le dará una buena idea de lo que los abre y los deja abiertos.
fuente
Agregar la siguiente línea a xdebug.ini también me resolvió el problema
fuente
Estoy obteniendo lo mismo con OSX 10.9.4 y Apache 2.2 y PHP 5.3 de Brew.
Si bien esto en realidad no soluciona el problema, puede contenerlo estableciendo la configuración de Apache MaxRequestsPerChild en algo así como 10, que debería estar bien para el desarrollo.
Eso debería evitar al menos tener que reiniciar Apache de vez en cuando para deshacerse de esos archivos filtrados
fuente