Có quá nhiều tập tin mở ra trên máy Mac OSX sau khi chạy apache trong PHP với XDebug một thời gian


13

Tôi đang chạy Mac OS X 10.9.4, bao gồm máy chủ web apache2 dựng sẵn với PHP 5.5,14 từ brew (gói: php55, php55-intl, php55-pdo-pssql, php55-xdebug).

Khi chạy thiết lập này, nó hoạt động khá tốt. Tuy nhiên, sau một thời gian, tôi sẽ chạy trên 403 lỗi cho mỗi yêu cầu. Tôi đã tra cứu nhật ký lỗi apache và tìm thấy một cái gì đó như sau:

[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

Đối với tôi có vẻ như tập tin không thể đọc được nữa và nó trả về 403 bằng cách nào đó. Tôi đã tìm ra các giới hạn nhất định, nhưng lợi nhuận launchctl tôi có giới hạn cứng không giới hạn đối với các tệp đang mở:

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

Tôi cũng đã cố gắng đặt maxfiles thành 4096 bằng lệnh launchctl limit maxfiles 4096 16384, nhưng vấn đề vẫn trở lại sau một thời gian. Bất cứ ý tưởng nào khác tôi có thể kiểm tra?

CẬP NHẬT : Khi chạy lsof -c httpdlệnh theo đề xuất của Gordon Davisson, tôi có thể thấy rằng có vô số mục như sau:

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

Tôi có thể nói rằng ứng dụng tôi sử dụng đang sử dụng websockets và cũng đang sử dụng dự phòng khi websockets không có sẵn hoặc đối tác không chạy trên máy chủ. Điều khiến tôi bối rối là (CLOSED)-part, tại sao nó vẫn được liệt kê?

CẬP NHẬT : Sau một thời gian tôi đã tra cứu cổng cslistener, thực sự là 9000, một lần nữa đó là cổng xdebug đang nghe để gỡ lỗi từ xa. Vì vậy, tôi đoán rằng tôi đã có một số cấu hình sai ở đó hoặc đó là một lỗi trong xdebug (Tôi đang sử dụng XDebug 2.2.5, được cài đặt bởi brew)

Câu trả lời:


14

Bạn có đang sử dụng PHPStorm với XDEBUG trên Mac không?

Tôi có cùng một vấn đề. Tôi đã tìm thấy một lỗi mở được nộp với XDEBUG tại đây:

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

Cập nhật

Lỗi này đã được sửa:

Tôi vừa hợp nhất một bản vá của Sean Dubois, cần sửa lỗi này \ o /! Bản vá sẽ có trong 2.3.4 và 2.4.0.

Tôi tin rằng đây là cam kết: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

Hãy chắc chắn rằng bạn đang sử dụng một phiên bản cập nhật với bản vá này.


Không thực sự là một giải pháp, nhưng tôi nghĩ nó trả lời câu hỏi
Daniel Rotter

Về cơ bản, Xdebug đang rò rỉ các mô tả tệp cho người nghe kết nối (xin lỗi nếu điều này không đúng về mặt kỹ thuật, đó là ý tưởng) khi ứng dụng gỡ lỗi không mở. Để giải quyết vấn đề, đảm bảo máy khách gỡ lỗi được mở khi trình gỡ lỗi từ xa bắt đầu phiên gỡ lỗi. Tất nhiên, một giải pháp tốt hơn sẽ là sửa lỗi cho các nhà phát triển.
mcdado

Điều này cũng xảy ra với một số trình gỡ lỗi mở (ví dụ PhpStorm). Hy vọng họ sẽ sửa nó :)
Steve Tauber

Điều này là khá lớn, tôi hy vọng một bản sửa lỗi sẽ được ban hành sớm.
Hubert Perron

1
Cách giải quyết khác là thiết lập xdebug.remote_enable=0trong php.inibiến của các kết nối từ xa Xdebug khi không sử dụng chúng. Yêu cầu khởi động lại Apache.
Gregory Cosmo Haun

7

Tôi khá chắc chắn rằng bạn có một cái gì đó đang chạy trong apache (có thể là mô-đun PHP, nhưng thật khó để chắc chắn) đó là mô tả tệp bị rò rỉ. Đó là, nó đang mở các tệp và sau đó chỉ để chúng mở vô thời hạn. Nếu đây là trường hợp, tăng giới hạn tệp mở chỉ làm cho mất nhiều thời gian hơn để đạt giới hạn. Những gì bạn thực sự cần làm là theo dõi những gì mở tất cả các tệp và để chúng mở.

Bạn có thể có một số ý tưởng những gì đang xảy ra với lsof ("LiSt Open Files"):

sudo lsof -c httpd

Chạy nó khi apache đã không chạy trong thời gian dài để xem những gì bình thường, sau đó một lần nữa khi nó đạt đến giới hạn. Nhìn vào đầu ra thứ hai để biết nhiều tệp bổ sung không có trong danh sách đầu tiên. Lưu ý rằng điều này sẽ hơi phức tạp bởi thực tế là nó sẽ liệt kê các tệp được mở bởi tất cả các quy trình httpd và (tùy thuộc vào cài đặt apache và tải máy chủ của bạn) có thể có một số lượng lớn chúng; điều quan trọng là số lượng tệp được mở bởi một quy trình, không phải tổng số trên tất cả các quy trình máy chủ. Bạn cũng có thể sử dụng sudo lsof -p someprocessIDđể liệt kê chỉ một quy trình máy chủ tại một thời điểm.

Hy vọng rằng việc xem các tệp mở thêm là gì sẽ cho bạn ý tưởng tốt về những gì mở chúng và để chúng mở.


Đã thử nó, tôi đã cập nhật câu hỏi.
Daniel Rotter

Tôi không quen lắm với ý nghĩa chính xác của các trạng thái ổ cắm TCP, nhưng nghe có vẻ như các kết nối với đối tác không được đóng đúng cách. Có phải đang chạy trên cổng cslistener (số 9000)? Làm thế nào chính xác ứng dụng của bạn đóng các kết nối với đối tác của nó? Có thể nó đóng phiên TCP, nhưng không phải là mô tả tệp?
Gordon Davisson

1
Tôi phát hiện ra rằng 9000 là cổng xdebug đang nghe, vậy có khả năng là lỗi trong phần mở rộng này không?
Daniel Rotter

3

Thêm dòng sau vào xdebug.ini cũng giải quyết được vấn đề cho tôi

xdebug.remote_autostart = 0

1

Tôi đang nhận được điều tương tự với OSX 10.9.4 và cả Apache 2.2 và PHP 5.3 từ Brew.

Mặc dù điều này không thực sự khắc phục được sự cố, nhưng bạn có thể chứa nó bằng cách đặt cài đặt Apache MaxRequestsPerChild thành thứ gì đó giống như 10 - sẽ rất tốt cho việc phát triển.

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

Điều đó sẽ giúp bạn tiết kiệm ít nhất là phải thường xuyên khởi động lại apache để loại bỏ các tệp bị rò rỉ đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.