“ เปิดไฟล์มากเกินไป” ใน 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 อย่างใด ฉันพบข้อ จำกัด บางอย่างแล้ว แต่ผลตอบแทนของ 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แล้ว แต่ปัญหายังคงกลับมาหลังจากผ่านไประยะหนึ่ง มีความคิดอะไรที่ฉันสามารถตรวจสอบได้อีกบ้าง?

UPDATE : เมื่อรันlsof -c httpdคำสั่งตามที่ Gordon Davisson แนะนำฉันจะเห็นว่ามีรายการจำนวนมากดังต่อไปนี้:

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

ฉันสามารถพูดได้ว่าแอปพลิเคชันที่ฉันใช้กำลังใช้เว็บซ็อกเก็ตและยังใช้ทางเลือกเมื่อเว็บซ็อกเก็ตไม่พร้อมใช้งานหรือไฟล์คู่นั้นไม่ได้ทำงานบนเซิร์ฟเวอร์ อะไรคือสิ่งที่ทำให้ฉันสับสน - (CLOSED)ส่วนที่เหลือทำไมมันถึงอยู่ในรายการ?

UPDATE : หลังจากนั้นสักครู่ฉันค้นหาพอร์ต cslistener ซึ่งอันที่จริงแล้วคือ 9000 ซึ่งอีกครั้งคือพอร์ตที่ xdebug กำลังรับฟังสำหรับการแก้ไขข้อบกพร่องระยะไกล ดังนั้นฉันคิดว่าฉันมีการกำหนดค่าที่ผิดหรือมีข้อผิดพลาดใน xdebug (ฉันใช้ XDebug 2.2.5 ติดตั้งโดยชง)

คำตอบ:


14

คุณใช้ PHPStorm กับ XDEBUG บน Mac หรือไม่

ผมมีปัญหาเดียวกัน. ฉันพบข้อผิดพลาดแบบเปิดที่ยื่นด้วย XDEBUG ที่นี่:

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

ปรับปรุง

ข้อผิดพลาดนี้ได้รับการแก้ไขแล้ว:

ฉันเพิ่งรวมชุดข้อมูลแก้ไขโดย Sean Dubois ซึ่งควรแก้ไข \ o /! แพตช์จะเป็น 2.3.4 และ 2.4.0

ฉันเชื่อว่านี่เป็นความมุ่งมั่น: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชันที่อัพเดตด้วยแพตช์นี้


ไม่ใช่วิธีแก้ปัญหาจริงๆ แต่ฉันคิดว่ามันตอบคำถาม
Daniel Rotter

โดยพื้นฐานแล้ว Xdebug คือตัวอธิบายไฟล์รั่วสำหรับตัวรับฟังการเชื่อมต่อ (ขออภัยหากนี่เป็นเทคนิคที่ไม่ถูกต้องนั่นเป็นแนวคิด) เมื่อไคลเอ็นต์การดีบักไม่เปิด เมื่อต้องการแก้ไขปัญหาตรวจสอบให้แน่ใจว่าไคลเอนต์ดีบักเกอร์เปิดเมื่อดีบักเกอร์ระยะไกลเริ่มเซสชันการตรวจแก้จุดบกพร่อง แน่นอนทางออกที่ดีกว่าจะแก้ไขข้อผิดพลาดโดยนักพัฒนา
mcdado

สิ่งนี้เกิดขึ้นกับ debuggers บางตัวที่เปิดอยู่ (เช่น PhpStorm) หวังว่าพวกเขาจะแก้ไขได้ :)
สตีฟโตเบอร์

นี่เป็นเรื่องสำคัญฉันหวังว่าจะมีการแก้ไขในไม่ช้า
Hubert Perron

1
วิธีแก้ปัญหาก็คือการตั้งค่าxdebug.remote_enable=0ในการphp.iniที่จะเปิดการเชื่อมต่อระยะไกล xdebug เมื่อไม่ได้ใช้พวกเขา ต้องเริ่ม Apache ใหม่
Gregory Cosmo Haun

7

ฉันค่อนข้างมั่นใจว่าคุณมีบางสิ่งที่ทำงานอยู่ใน apache (อาจเป็นโมดูล PHP แต่มันก็ยากที่จะแน่ใจ) นั่นคือคำอธิบายไฟล์รั่ว นั่นคือมันกำลังเปิดไฟล์และเปิดทิ้งไว้อย่างไม่ จำกัด หากเป็นกรณีนี้การเพิ่มขีด จำกัด ของไฟล์ที่เปิดอยู่จะใช้เวลานานกว่านั้นเพื่อให้ถึงขีด จำกัด สิ่งที่คุณต้องทำคือติดตามสิ่งที่เปิดไฟล์ทั้งหมดและเปิดทิ้งไว้

คุณอาจจะเข้าใจว่าเกิดอะไรขึ้นกับlsofคำสั่ง ("LiSt Open Files"):

sudo lsof -c httpd

เรียกใช้เมื่อ apache ไม่ได้ทำงานนานเพื่อดูว่ามีอะไรปกติจากนั้นอีกครั้งเมื่อถึงขีด จำกัด ค้นหาไฟล์เพิ่มเติมจำนวนมากที่ไม่อยู่ในรายชื่อแรก โปรดทราบว่าสิ่งนี้จะค่อนข้างซับซ้อนโดยข้อเท็จจริงที่ว่ามันจะแสดงรายการไฟล์ที่เปิดโดยกระบวนการ httpd ทั้งหมดและ (ขึ้นอยู่กับการตั้งค่า apache และโหลดเซิร์ฟเวอร์ของคุณ) อาจมีจำนวนมาก สิ่งสำคัญคือจำนวนไฟล์ที่เปิดโดยกระบวนการเดียวไม่ใช่ผลรวมในทุกกระบวนการของเซิร์ฟเวอร์ คุณยังสามารถใช้sudo lsof -p someprocessIDเพื่อแสดงรายการกระบวนการเซิร์ฟเวอร์เดียวในแต่ละครั้ง

หวังว่าการดูว่าไฟล์ที่เปิดเป็นพิเศษจะช่วยให้คุณมีความคิดที่ดีว่าอะไรที่เปิดไฟล์เหล่านั้นและเปิดทิ้งไว้


เมื่อทดลองใช้ฉันได้อัปเดตคำถามแล้ว
Daniel Rotter

ฉันไม่คุ้นเคยกับความหมายที่แท้จริงของสถานะซ็อกเก็ต TCP แต่ฟังดูแล้วเหมือนกับว่าการเชื่อมต่อกับคู่นั้นไม่ได้รับการปิดอย่างถูกต้อง นั่นทำงานบนพอร์ต cslistener (หมายเลข 9000) หรือไม่ แอปของคุณปิดการเชื่อมต่อกับคู่หูอย่างไร เป็นไปได้หรือไม่ว่าจะปิดเซสชัน TCP แต่ไม่ใช่ตัวให้คำอธิบายไฟล์
Gordon Davisson

1
ฉันพบว่า 9000 พอร์ต xdebug กำลังฟังอยู่ดังนั้นจึงเป็นไปได้ไหมว่าข้อผิดพลาดอยู่ในส่วนขยายนี้
Daniel Rotter

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 ทุกครั้งเพื่อกำจัดไฟล์ที่รั่วไหลออกมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.