更新

更新

我正在運行 Mac OS X 10.9.4,包括內建的 apache2 Web 伺服器和來自brew 的 PHP 5.5.14(軟體包: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,但一段時間後問題仍然存在。知道我還可以檢查什麼嗎?

更新:當按照 Gordon Davisson 的建議運行lsof -c httpd命令時,我可以看到有大量如下條目:

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

我可以說我使用的應用程式正在使用 websockets,並且當 websockets 不可用或對應的應用程式未在伺服器上運行時,也會使用後備。讓我困惑的是(CLOSED)- 部分,為什麼它仍然列出來?

更新:過了一段時間,我查找了 cslistener 端口,實際上是 9000,這又是 xdebug 正在偵聽遠端偵錯的端口。所以我想我那裡有一些錯誤的配置,或者是 xdebug 中的一個錯誤(我正在使用 XDebug 2.2.5,由brew 安裝)

答案1

您是否在 Mac 上將 PHPStorm 與 XDEBUG 一起使用?

我也有同樣的問題。我在這裡發現了一個用 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

確保你是使用更新版本有了這個補丁。

答案2

我很確定你在 apache 中運行的某些東西(可能是 PHP 模組,但很難確定)正在洩漏檔案描述符。也就是說,它打開文件,然後無限期地保持打開狀態。如果是這種情況,增加開啟檔案限制只會使達到限制所需的時間更長。您真正需要做的是追蹤是什麼打開了所有文件並讓它們保持打開狀態。

您可能可以了解lsof(“LiSt Open Files”)命令發生了什麼:

sudo lsof -c httpd

當 apache 沒有運行很長時間時運行它,看看什麼是正常的,然後當它達到限制時再次運行。在第二個輸出中尋找第一個清單中不存在的許多其他檔案。請注意,這會有點複雜,因為它將列出由全部httpd 進程,並且(取決於您的 apache 設定和伺服器負載)可能有大量進程;重要的是單一進程開啟的檔案數,而不是所有伺服器進程的總數。您也可以sudo lsof -p someprocessID一次只列出一個伺服器進程。

希望看到額外打開的文件是什麼能讓您很好地了解是什麼打開了它們並讓它們保持打開狀態。

答案3

將以下行加入 xdebug.ini 也解決了我的問題

xdebug.remote_autostart = 0

答案4

我在 OSX 10.9.4 以及 Brew 的 Apache 2.2 和 PHP 5.3 上也得到了相同的結果。

雖然這實際上並不能解決問題,但您可以透過將 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 來清除那些洩漏的文件

相關內容