2010-05-05 41 views
0

嗨,我上傳我的php測試腳本到在線vps服務器剛纔。該腳本用於解析一個大尺寸的XML文件(大約4M,7000線)。但我的IE瀏覽器顯示下面的在線錯誤消息。致命錯誤:允許的內存大小用盡

致命錯誤:用盡16777216個字節允許存儲器大小(試圖分配77個字節)中/var/www/test/result/index.php上線26

我確信我已經測試了本地主機上的PHP腳本成功。

是否需要在我的VPS上啓用/修改任何配置?比如php.ini或者apache服務器的一些設置?我剛剛證實,我的VPS有大約200M的內存使用量。我怎樣才能解決這個問題?

...... 
function startElementHandler ($parser,$name,$attrib){ 
    global $usercount; 
    global $userdata; 
    global $state; // Line #26; 
    //Debug 
    //print "name is: ".$name."\n"; 
    switch ($name) { 
     case $name=="_ID" : { 
     $userdata[$usercount]["first"] = $attrib["FIRST"]; 
     $userdata[$usercount]["last"] = $attrib["LAST"]; 
     $userdata[$usercount]["nick"] = $attrib["NICK"]; 
     $userdata[$usercount]["title"] = $attrib["TITLE"]; 
     break; 
     } 

     ...... 

     default : {$state=$name;break;} 
    } 
} 
+2

記住,有一天你的XML可能會因爲你的可用內存... – Axarydax 2010-05-05 10:14:31

+1

哪個庫你用來解析文件嗎?如果它是一個很大的文件,你可能會考慮在任何其他庫上使用XMLReader,因爲它不必首先將整個文檔加載到內存中。 – Gordon 2010-05-05 10:20:24

+0

@戈登,我沒有使用一些庫,我只是找到了教程'codehelp.co.uk/php/xmlparse1.php',並用我的XML文件進行練習。我將在稍後學習XMLReader。謝謝。 – 2010-05-05 11:18:55

回答

3

您的PHP配置將PHP限制爲只有16兆內存。您需要修改php.ini中的memory_limit配置指令以增加它。

查找php.ini中的線,看起來像這樣:

memory_limit = 16M 

...並更改爲一個較大的值(16M = 16兆字節,您可以將其提高到像64M 64兆字節等)。如果您找不到像這樣的任何行,請添加它。

如果您希望僅以每個腳本爲基礎增加該值,則還可以使用ini_set()來更改該腳本的值。

+0

我認爲最好將其設置爲僅對該文件更大,但保留默認配置的較低值。 – 2010-05-05 10:11:37

+0

@Dav,我將這個值修改爲64M,並且效果很好。後來我會學習更多的PHP和XML知識並保留我的代碼。 @All,謝謝。 – 2010-05-05 11:23:34

1
ini_set("memory_limit","XXM"); 

請注意,某些服務器阻止這樣做(儘管在VPS這不應該是一個問題,它主要是虛擬主機的問題)。

編輯:不是 「XX」 寫的實際尺寸,如128M

+0

+1如果你可以使用這只是爲了需要額外的內存,而不是使其全球化的代碼。 – 2010-05-05 10:16:05

+0

@ Lo'oris,我試圖在我的index.php文件中插入'ini_set(「memory_limit」,「128M」);'。但它仍然無法工作。顯示相同的錯誤消息。我想也許我的VPS不支持這個功能。我只能選擇修改php.ini並重新啓動我的web服務:-(。謝謝。 ' – 2010-05-05 10:38:24

1

確保您指定了正確接受設置:

  • file_uploads
  • upload_max_filesize
  • max_input_time
  • memory_limit
  • max_execution_time
  • post_max_size

你可以調用phpinfo()功能找到你php.ini文件的位置,它還會告訴你的當前值,你需要修改以下設置。

您可以使用ini_set函數在腳本中設置其中一些值。

SEE:

Howto optimize your PHP installation to handle large file uploads.

2

使用SAX解析器而不是DOM解析器,並且不會耗盡內存。 DOM佔用實際文檔流所佔內存的8-10倍,而SAX無論文檔大小如何都具有合理的常量開銷。

1

它很髒,但在某些情況下,使用大型XML文件時,通過正則表達式獲取值的速度更快!如果它是一個格式良好的XML,應該沒有問題!

僞代碼:

preg_match('+<title>(.*)</title>+', $xml_content, $matches); 
var_dump($matches); 
0

共享主機,就把這行到你的index.php

ini_set("memory_limit","128M"); 
相關問題