2012-01-31 30 views
5

我想增加某些PHP腳本允許的內存。無論我做什麼,比如這個:PHP不能使用300MB的RAM

ini_set('memory_limit', '512M'); 

...劇本總是在大約300MB內存用完:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

我已經通過驗證的幾個意味着memory_limit實際上改變。這個問題似乎是PHP無法物理分配總共300 MB的內存(25165824  字節+ 343810589  字節= 352   MB)。

我都試過PHP/5.3.0和PHP/5.3.9在兩個不同的基於Windows的計算機具有以下規格:

  • 的Windows XP/Windows Server 2003中(兩臺計算機都32搭配1GB或RAM)位箱
  • 官方PHP 32位VC9二進制
  • 運行作爲Apache 2.2的模塊(第三方32位VC9二進制文件)

據我所知,物理RAM的使用一半將強制swa並將事情放緩,但我只需確保腳本實際運行,以便將其部署到實時服務器。我也嘗試了更大的值(處理相同的錯誤)和更小的值(使我的腳本達到極限或使Apache崩潰)。

什麼可以是這種明顯的硬編碼內存限制的來源?

更新#1:我已經使用Windows Server 2003框(它實際上是一個VMWare虛擬機)做了進一步的測試。我已將「物理」RAM增加到2   GB,並且我已驗證分頁文件允許增長到1152   MB。任務管理器顯示當前事務負載爲886   MB,並且有1,5 GB的空閒物理內存。不過,我收到的的數字完全相同。

更新#2:正如我所說的,memory_limit指令是好的。它出現在ini_get()phpinfo()中。你得到的錯誤信息與我的稍有不同;我的表示一個PHP 崩潰。請比較:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

我會嘗試編寫一個腳本來重現問題並報告回來。

+0

如果PHP試圖一次抓取那麼多內存,那麼我假設你正在嘗試加載一個文件....嘗試將文件加載到塊中而不是一次加載 – 2012-01-31 11:17:00

+0

«如果無法優化,購買更多內存......»呃,有時候這是錯誤的......; )你確定你需要所有的記憶嗎? 300MB已經是一個巨大的數量。也許你可以優化你的腳本有點... – Macmade 2012-01-31 11:17:22

+2

你是100%確定操作系統有超過300MB的可用內存分配? – DaveRandom 2012-01-31 11:17:45

回答

4

OOM異常與內存限制warninigs不同。

這意味着PHP無法實際分配內存,因爲操作系統內可用資源不足。

您需要檢查系統是否有足夠的內存/分頁來支持此操作。

+0

我已更新該問題。顯然,服務器有足夠的內存。 – 2012-01-31 11:37:13

0

嘗試用max_input_time設置,PHP說memory_limit的實際上就意味着max_input_time設置有時當(-1是無限的這一個)。

+0

好點。但價值已經被設定爲20分鐘,並且崩潰發生得更早。自從我提出這個問題以來,我一直沒有做過這方面的工作,但我知道遲早我需要修復代碼,所以不需要太多的內存。 – 2013-05-09 10:16:57

+0

嗯,那麼我忍不住對不起! – R01010010 2013-05-09 10:20:22