Bir süre XDebug ile PHP'de apache çalıştırdıktan sonra Mac OSX'te “çok fazla dosya açık”


13

Demlemek PHP 5.5.14 ile yerleşik apache2 web sunucusu dahil Mac OS X 10.9.4 çalıştırıyorum (paketleri: php55, php55-intl, php55-pdo-pgsql, php55-xdebug).

Bu kurulumu çalıştırırken oldukça iyi çalışıyor. Ancak, bir süre sonra, her istek için 403 hataları üzerinde çalışacağım. Apache hata günlüğüne baktım ve aşağıdaki gibi bir şey buldum:

[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

Bana artık dosya okunamıyormuş gibi geliyor ve bir şekilde 403'ü döndürüyor. Zaten belirli sınırlar hakkında öğrendim, ancak launchctl döndürür Açık dosyalarda sınırsız bir sabit sınır var:

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

Ben de zaten komutla 4096 maxfiles belirtmeye çalıştığımız launchctl limit maxfiles 4096 16384, ancak sorun hala bir süre sonra döner. Başka neyi kontrol edebileceğime dair bir fikrin var mı?

GÜNCELLEME : lsof -c httpdGordon Davisson tarafından önerildiği gibi komutu çalıştırırken , aşağıdaki gibi çok sayıda giriş olduğunu görebiliyorum:

httpd   1361 _www   15u    IPv4 0xb306b48659f63853       0t0     TCP localhost:50603->localhost:cslistener (CLOSED)

Kullandığım uygulamanın websockets kullandığını ve websockets kullanılabilir olmadığında veya muadili sunucuda çalışmadığında da bir yedek kullandığını söyleyebilirim. Beni (CLOSED)şaşırtan şey -parta, neden hala listeleniyor?

GÜNCELLEME : Bir süre sonra, aslında 9000 olan cslistener portunu aradım, bu da xdebug'un uzaktan hata ayıklama için dinlediği port. Sanırım orada yanlış bir konfigürasyonum var ya da xdebug'da bir hata var (demlemek tarafından kurulan XDebug 2.2.5 kullanıyorum)

Yanıtlar:


14

Mac'te XDEBUG ile PHPStorm mu kullanıyorsunuz?

Aynı problemim var. Burada XDEBUG ile açılan açık bir hata buldum:

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

Güncelleme

Bu hata düzeltildi:

Ben sadece bu düzeltmek gerekir Sean Dubois tarafından bir yama birleştirdi! Yama 2.3.4 ve 2.4.0'da olacak.

Bunun taahhüt olduğuna inanıyorum: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

Bu düzeltme ekiyle güncelleştirilmiş bir sürüm kullandığınızdan emin olun .


Gerçekten bir çözüm değil, ama soruyu cevapladığını düşünüyorum
Daniel Rotter

Temel olarak, Xdebug hata ayıklama istemcisi açık değilken bağlantı dinleyicileri için dosya tanımlayıcılarını sızdırıyor (bu teknik olarak yanlışsa özür dilerim, fikir budur). Sorunu çözmek için, uzak hata ayıklayıcı bir hata ayıklama oturumu başlattığında hata ayıklayıcı istemcisinin açık olduğundan emin olun. Tabii ki, daha iyi bir çözüm geliştiriciler tarafından hataya bir çözüm olacaktır.
mcdado

Bu, bazı hata ayıklayıcılar açıkken de olur (örneğin PhpStorm). Umarım düzeltirler :)
Steve Tauber

Bu oldukça büyük, umarım yakında bir düzeltme yapılacaktır.
Hubert Perron

1
Başka bir geçici çözüm kümesine olduğu xdebug.remote_enable=0içinde php.inibunları kullanarak değilken xdebug uzak bağlantı açın. Apache'nin yeniden başlatılması gerekiyor.
Gregory Cosmo Haun

7

Apache (muhtemelen PHP modülü, ama emin olmak zordur) çalışan bir şey var eminim bu dosya tanıtıcıları sızıntı. Yani, dosyaları açıyor ve sonra onları süresiz olarak açık bırakıyor. Bu durumda, açık dosya sınırını artırmak yalnızca sınıra ulaşmanın daha uzun sürmesini sağlar. Gerçekten yapmanız gereken, tüm dosyaları nelerin açtığını ve onları açık bırakmayı izlemek.

Muhtemelen lsof("LiSt Open Files") komutuyla neler olup bittiğine dair bir fikir edinebilirsiniz :

sudo lsof -c httpd

Neyin normal olduğunu görmek için apache uzun süredir çalışmadığında, ardından limite ulaştığında tekrar çalıştırın. İlk listede bulunmayan birçok ek dosya için ikinci çıktıya bakın. Bunun tüm httpd işlemleri tarafından açılan dosyaları listeleyeceği için biraz karmaşık olacağını ve (apache ayarlarınıza ve sunucu yüküne bağlı olarak) çok sayıda olabileceğini unutmayın; önemli olan, tüm sunucu işlemlerinin toplamı değil, tek bir işlem tarafından açılan dosya sayısıdır. Aynı anda sudo lsof -p someprocessIDyalnızca tek bir sunucu işlemini listelemek için de kullanabilirsiniz .

Umarım ekstra açık dosyaların ne olduğunu görmek, onları neyin açtığı ve açık bıraktığı hakkında iyi bir fikir verecektir.


Denedim, soruyu güncelledim.
Daniel Rotter

TCP soket durumlarının tam anlamını çok iyi bilmiyorum, ama bana karşı tarafa olan bağlantılar düzgün bir şekilde kapanmıyor gibi geliyor. Bu cslistener portunda (9000 sayısı) çalışıyor mu? Uygulamanız, muadiliyle olan bağlantıları tam olarak nasıl kapatıyor? TCP oturumunu kapatması mümkün, ancak dosya tanıtıcısı değil mi?
Gordon Davisson

1
9000 bağlantı noktası xdebug dinliyor olduğunu öğrendim, bu yüzden hata bu uzantıda olması mümkün mü?
Daniel Rotter

3

Xdebug.ini dosyasına aşağıdaki satırı eklemek de sorunu benim için çözdü

xdebug.remote_autostart = 0

1

Aynı şeyi Brew'den OSX 10.9.4 ve hem Apache 2.2 hem de PHP 5.3 ile alıyorum.

Bu aslında sorunu çözmese de, geliştirme için iyi olması gereken Apache MaxRequestsPerChild ayarını 10 gibi bir şeye ayarlayarak içerebilirsiniz.

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

Bu, en azından sızan dosyalardan kurtulmak için sık sık apache'yi yeniden başlatmanızdan kurtaracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.