簡體   English   中英

Apache PHP / OSX Mavericks: - 無法打開流:打開的文件過多

[英]Apache PHP/OSX Mavericks: - failed to open stream: Too many open files

我最近升級到OSX Mavericks,從那時起,我開始在我的開發機器上得到上述錯誤。 代碼中沒有明顯的問題(它是一個自動生成的Yii示例應用程序)。 作為升級到小牛隊的一部分發生的事情是:

  1. PHP從與OSX Lion捆綁在一起的5.2.x升級到5.4.x.
  2. 我必須通過安裝Zend Server獲取Zend Debugger for PHP 5.4,拿起ZendDebugger.so並卸載Zend Server(所有這一切都是因為Zend沒有為php 5.4.x提供獨立版本的調試器)。

從那時起,我在加載和重新加載網站幾次之后就遇到了這個問題。 發生此錯誤后,我的Web服務器將繼續為localhost上托管的任何其他應用程序返回相同的錯誤。 我必須提到靜態網頁服務很好。

我見過幾個線程關於這一主題。 大多數人都指出代碼中的問題是文件句柄未正確關閉,從而超過了打開文件限制閾值。 我也發現這個線程似乎暗示這可能是一個zend調試器問題。 還有針對php 5.2.x提交的錯誤報告 這里的帖子之后,我嘗試了以下內容:

$ ulimit -a

報道:

open files (-n) 256

也,

sysctl -a | grep files

回報,

kern.maxfiles = 12288
kern.maxfilesperproc = 10240
kern.maxfiles: 12288
kern.maxfilesperproc: 10240
kern.num_files: 3248

另一個有趣的線程建議使用以下方法提高此限制(目前為256):

ulimit -n 1024

我已經嘗試了一切,但似乎沒有任何工作。 問題也不能始終如一地重現。

我想知道是使用ulimit -n 1024會影響apache,因為從我讀過的內容來看,它會影響shell可以打開的文件數量。

任何幫助表示贊賞。

編輯:

  1. 重新啟動apache有所幫助,直到再次遇到錯誤。
  2. 讓Web服務器空閑一點(沒有確定的間隔)也有幫助。

http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X無恥地偷走

要檢查Mac OS X系統上的當前限制,請運行:

$ launchctl limit maxfiles

最后兩列分別是軟限制和硬限制。

要調整OS X 10.7(Lion)或更高版本中的最大打開文件限制,請編輯/etc/launchd.conf並根據需要增加這兩個值的限制。

例如,要將軟限制設置為16384文件,將硬限制設置為32768文件,請執行以下步驟:

驗證當前限制:

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

編輯(或創建) /etc/launchd.conf並增加限制。 添加如下所示的行(使用適合您環境的值):

limit maxfiles 16384 32768

保存文件,然后重新啟動系統以使新限制生效。 重新啟動后,使用launchctl limit命令驗證新限制:

$ 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    16384          32768

如果您在運行Apache時遇到此問題,可以配置apache以增加限制:

$ sudo vi /usr/sbin/apachectl

找到: ULIMIT_MAX_FILES=""

並將此行更改為:

ULIMIT_MAX_FILES="ulimit 4096"

然后: sudo apachectl restart

這不適用於CLI腳本。 但是直接向~/.bash_profile (或等效的)添加ulimit應該可以用於此目的。

這樣做的好處是可以為apache和終端設置特定限制,而不會影響其他應用程序。

此外,您應該能夠通過將ulimit替換為適用於該環境的命令來使此方法適用於其他操作系統。

我在El Capitain遇到了同樣的問題。 在這里找到一篇文章我應該歸功於解決方案。 請按照以下操作:

調整打開文件限制要在Yosemite及更高版本的系統范圍內調整打開文件限制,您需要創建兩個配置文件。 第一個是/Library/LaunchDaemons/limit.maxfiles.plist中的屬性列表(aka plist)文件,其中包含以下XML配置:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>65536</string>
          <string>65536</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

這會將打開文件限制設置為65536.第二個plist配置文件應存儲在/Library/LaunchDaemons/limit.maxproc.plist中,其中包含以下內容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

兩個plist文件必須由root:wheel擁有並具有權限-rw-r-r-。 重啟系統。

還建議在.bashrc中為用戶會話設置它們並添加:

ulimit -n 65536
ulimit -u 2048

希望這可以幫助。

我可能正在遭受信息超載。 這里提供一個可能的解釋,我在原帖中也提到過。 我想我錯過了OP提到他在Mac OSX 10.8.x上工作的小細節。 我在10.9,所以我從頁面下載了zenddebugger.so,看起來很不錯。 沒有一整天too many open files

所以,也許這是一個ZendDebugger問題。

關於上面的調試器補丁答案。 不幸的是,上面提供的答案對我不起作用,因為它適用於php版本5.4,我必須限制自己到php 5.3。

Zend發布了他們的服務器版本6.3,它支持5.3的php。 我已經玩了一段時間的安裝(在將我的ulimit放回到Apple的默認值之后)來測試它並且沒有遇到任何問題。 在升級之前,我無法在不提高限制的情況下進行任何php調試。

根據http://forums.zend.com/viewtopic.php?t=110823&start=10#p219438我認為這實際上只是在6.2中修復的Zend Server中的一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM