2013-11-04 45 views
20

我最近升級到OSX小牛,從那以後,我開始在我的開發機器上得到上述錯誤。代碼中沒有明顯的問題(這是一個自動生成的Yii示例應用程序)。作爲升級到小牛的一部分發生了什麼:Apache PHP/OSX小牛: - 未能打開流:太多打開的文件

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

從那以後,我在加載和重新加載網站幾次後出現此問題。發生此錯誤後,我的Web服務器不斷爲本地主機上託管的任何其他應用程序返回相同的錯誤。我不得不提到,靜態網頁服務很好。

我在這個主題上看過幾個threads。大多數代碼指出文件句柄未正確關閉的代碼中的問題,從而超過了打開的文件限制閾值。我也發現這thread似乎暗示這可能是一個zend調試器問題。還有一個bug report爲php 5.2.x提交。繼線程here,我試過如下:

$ 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 

另一個有趣thread建議提高這一限制使用(目前爲256):

ulimit -n 1024 

我用盡了一切辦法,但似乎沒有奏效。這個問題也不一致可重現。

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

任何幫助表示讚賞。

編輯:

  1. 重啓apache幫助了一會兒,直到再次遇到錯誤。
  2. 使Web服務器空閒一段時間(沒有確定的時間間隔)也有幫助。

回答

1

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

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

+0

這爲我解決了這個問題。自從我再次看到該錯誤以來,已經過去了一個多月。 –

16

無恥地從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 
+0

感謝您的努力。我提到過我已經嘗試增加最大打開文件限制。這對我來說無能爲力,因爲最終每一個限制都會受到打擊。 –

+1

嗨,我試過,但即使重新啓動我的mac,launchctl限制仍然返回原始值。 /etc/launchd.conf似乎沒有考慮到。我在小牛隊10.9跑動。有任何想法嗎 ? – BoilingLime

+0

在小牛隊中,'maxfiles'的硬限制應該是「無限的」。無論如何,你仍然應該能夠在'/ etc/launchd.conf'中設置不同的限制和其他環境。但要小心:如果在這個文件中有語法錯誤,所有的東西都會被忽略(儘管拒絕啓動或登錄仍然會更好)。 – okket

0

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

Zend發佈了6.3版本的服務器,它支持5.3的php。我一直在玩安裝一段時間(將我的ulimit放回到Apple的默認設置後)進行測試,但沒有遇到任何問題。在升級之前,我無法進行任何的php調試而不提高這個限制。

+0

是的,錯誤在Zend Server 6.2中修復http://forums.zend.com/viewtopic.php?t=110823&start=10 – drewish

2

如果您遇到了這個問題,同時運行Apache你可以配置Apache以增加限制:

$ sudo vi /usr/sbin/apachectl

定位: ​​

並將此行更改爲:

ULIMIT_MAX_FILES="ulimit 4096"

然後: sudo apachectl restart

這不會對CLI腳本。但直接添加一個ulimit到你的~/.bash_profile(或同等版本)應該可以達到這個目的。

這具有爲apache和您的終端設置特定限制而不影響其他應用的優勢。

此外,您應該可以將此方法適用於其他操作系統,只需將ulimit替換爲適用於該環境的命令即可。

1

我在El Capitain遇到了同樣的問題。發現一篇文章here我欠解決方案的應有的功勞。請按照以下操作:

調整打開文件限制 要調整優勝美地及更高版本在系統範圍內的打開文件限制,您需要創建兩個配置文件。第一種是屬性列表(又名的plist)文件中/Library/LaunchDaemons/limit.maxfiles.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擁有:車輪和有權限-rw-R-R - 。重新啓動系統。

也是其推薦設置它們的用戶會話中的.bashrc並添加:

ulimit -n 65536 
ulimit -u 2048 

希望這有助於。