2010-05-05 3 views
0

HI, я загружаю свой скрипт тестирования php на онлайн-сервер vps только сейчас. Сценарий, используемый для анализа XML-файла большого размера (около 4M, 7000Lines). Но мой проводник IE показывает онлайн-сообщение об ошибке ниже.Неустранимая ошибка: допустимый размер памяти исчерпан

Фатальная ошибка: Разрешены памяти размером 16777216 байт исчерпаны (пытались выделить 77 байт) в /var/www/test/result/index.php на линии 26

Я уверен, что я уже тестировал php на локальном хосте успешно.

Нужно ли включать или изменять конфигурацию на моем VPS? Например, php.ini или некоторые настройки для сервера Apache? Я просто подтвердил, что для моего VPS доступно около 200 Мб памяти. Как я могу это исправить?

...... 
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

+1

какая библиотека вы используете для разбора файла? Если это большой файл, вы можете захотеть использовать XMLReader над любой другой библиотекой, потому что ему не нужно сначала загружать весь документ в память. – Gordon

+0

@ Gordon, я не использовал какую-то библиотеку, я только что нашел учебник «codehelp.co.uk/php/xmlparse1.php» и практиковал его с помощью моего XML-файла. И я узнал бы XMLReader позже. Благодарю. –

ответ

3

Ваша конфигурация PHP ограничивает PHP только 16 мегабайтами памяти. Вам необходимо изменить директиву конфигурации memory_limit в php.ini, чтобы увеличить ее.

Посмотрите на строку в php.ini, который выглядит следующим образом:

memory_limit = 16M 

... и изменения в большое значение (16M = 16 мегабайта, вы можете увеличить его на что-то вроде 64M для 64 мегабайт и т. д.). Если вы не можете найти такую ​​строку, добавьте ее.

Если вы предпочитаете увеличивать его только для каждого сценария, вы также можете использовать ini_set(), чтобы изменить значение только для этого скрипта.

+0

Я думаю, что было бы лучше установить его больше только для этого файла, но оставьте более низкое значение для конфигурации по умолчанию. –

+0

@Dav, я изменил значение до 64M, и он работает хорошо. Позже я узнал больше знаний о PHP и XML и ввел свой код. @Все, спасибо. –

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

пожалуйста обратите внимание, что некоторые серверы предотвратить это работает (хотя в VPS это не должно быть проблемой, это в основном веб-хостинга проблемы).

редактировать: вместо "XX" писать фактический размер, такие как 128M

+0

+1 Если вы можете использовать это только для кода, который нуждается в дополнительной памяти, а не для глобального. –

+0

@ Lo'oris, я попытался вставить 'ini_set (" memory_limit "," 128M ");' в файл index.php. Но он все еще не может работать. показало то же сообщение об ошибке. Возможно, мой VPS не поддерживает эту функцию. Я могу только выбрать изменить php.ini и перезагрузить мой веб-сервис :-(Спасибо. ' –

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

Вы также можете использовать memory_get_peak_usage(), чтобы выяснить, какая часть программы ест память.

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"); 
Смежные вопросы