Неустранимая ошибка: допустимый объем памяти исчерпан - PullRequest
0 голосов
/ 05 мая 2010

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

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

Я уверен, что уже успешно протестировал php-скрипт на localhost.

Нужно ли включать / изменять конфигурацию на моем 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;}
    }
}

Ответы [ 7 ]

3 голосов
/ 05 мая 2010

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

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

memory_limit = 16M

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

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

2 голосов
/ 05 мая 2010

Используйте SAX-парсер вместо DOM-парсера, и вам не хватит памяти. DOM занимает в 8-10 раз больше памяти, чем фактический поток документов, тогда как SAX имеет разумные постоянные издержки независимо от размера документа.

2 голосов
/ 05 мая 2010

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

1 голос
/ 05 мая 2010

Это грязно, но в некоторых случаях с большими XML-файлами быстрее получить значения с помощью регулярных выражений! И если это хорошо отформатированный XML, проблем не должно быть!

псевдокод:

preg_match('+<title>(.*)</title>+', $xml_content, $matches);
var_dump($matches);
1 голос
/ 05 мая 2010

Убедитесь, что вы указали правильные допустимые настройки для:

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

Вы можете вызвать функцию phpinfo(), чтобы найти местоположение файла php.ini, он также сообщит вам текущие значения для следующих параметров, которые необходимо изменить.

Вы также можете использовать функцию ini_set для установки некоторых из этих значений в вашем скрипте.

СМ:

Как оптимизировать установку PHP для обработки больших файлов.

1 голос
/ 05 мая 2010
ini_set("memory_limit","XXM");

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

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

0 голосов
/ 07 марта 2015

для виртуального хостинга поставьте эту строку вам index.php

ini_set("memory_limit","128M");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...