Estou executando o Mac OS X 10.9.4, incluindo o servidor web apache2 embutido com PHP 5.5.14 do brew (pacotes: php55, php55-intl, php55-pdo-pgsql, php55-xdebug).
Ao executar esta configuração, ele funciona muito bem. No entanto, depois de algum tempo, executarei 403 erros para cada solicitação. Eu procurei o log de erros do apache e encontrei algo como o seguinte:
[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
Parece-me que o arquivo não pode mais ser lido e retorna o 403 de alguma forma. Eu já descobri alguns limites, mas o launchctl retorna um limite ilimitado de arquivos abertos:
~ $ 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
Eu também já tentei definir o maxfiles para 4096 com o comando launchctl limit maxfiles 4096 16384
, mas o problema ainda retorna depois de algum tempo. Alguma idéia do que mais posso verificar?
ATUALIZAÇÃO : Ao executar o lsof -c httpd
comando conforme sugerido por Gordon Davisson, posso ver que há muitas entradas como as seguintes:
httpd 1361 _www 15u IPv4 0xb306b48659f63853 0t0 TCP localhost:50603->localhost:cslistener (CLOSED)
Posso dizer que o aplicativo que eu uso está usando websockets e também está usando um fallback quando websockets não estão disponíveis ou a contraparte não está sendo executada no servidor. O que me confunde é a (CLOSED)
parte, por que ainda está listada?
ATUALIZAÇÃO : Depois de algum tempo, procurei a porta cslistener, que na verdade é 9000, e novamente qual porta xdebug está ouvindo a depuração remota. Então eu acho que tenho alguma configuração errada lá ou é um bug no xdebug (estou usando o XDebug 2.2.5, instalado pelo brew)
fonte
xdebug.remote_enable=0
emphp.ini
transformar de conexões remotas XDebug quando não estiver usando-los. É necessário reiniciar o Apache.Tenho certeza que você tem algo em execução no apache (provavelmente o módulo PHP, mas é difícil ter certeza) que está vazando descritores de arquivo. Ou seja, é abrir arquivos e depois deixá-los abertos indefinidamente. Se for esse o caso, aumentar o limite de arquivo aberto apenas leva mais tempo para atingir o limite. O que você realmente precisa fazer é rastrear o que está abrindo todos os arquivos e deixá-los abertos.
Você provavelmente pode ter uma idéia do que está acontecendo com o
lsof
comando ("LiSt Open Files"):Execute-o quando o apache não estiver em execução há muito tempo para ver o que é normal e, novamente, quando atingir o limite. Procure na segunda saída muitos arquivos adicionais que não estão na primeira listagem. Observe que isso será um pouco complicado pelo fato de listar os arquivos abertos por todos os processos httpd e (dependendo das configurações do apache e da carga do servidor), pode haver um grande número deles; o importante é o número de arquivos abertos por um único processo, não o total em todos os processos do servidor. Você também pode usar
sudo lsof -p someprocessID
para listar apenas um processo de servidor por vez.Esperamos que ver quais são os arquivos abertos extras lhe dará uma boa idéia do que os está abrindo e deixando em aberto.
fonte
Adicionar a seguinte linha ao xdebug.ini também resolveu o problema para mim
fonte
Estou recebendo a mesma coisa com o OSX 10.9.4 e o Apache 2.2 e o PHP 5.3 do Brew.
Embora isso não resolva o problema, você pode contê-lo definindo a configuração do Apache MaxRequestsPerChild para algo como 10 - o que deve ser bom para o desenvolvimento.
Isso deve evitar que você tenha que reiniciar o apache de vez em quando para se livrar desses arquivos vazados
fonte