2013-10-03 2 views
0

У меня странная ошибка при использовании xml_parse. Мой скрипт возвращает ошибку «Нет памяти» в последней строке файла XML с помощью функции xml_parse. Это происходит только тогда, когда размер файла больше 10 МБ. Меньше допустимо. Но у меня есть 3Gb avilable для PHP-скрипта, а общая память - 32Gb.xml_parse Ошибка памяти Ошибка в PHP

Этот скрипт работал, работая на другом сервере (с 2Gb для PHP и 16Gb), и он работал с еще большими файлами. Но это была FreeBSD, теперь она находится под CentOS 6.4.

Может быть, у кого-то такая же ситуация?

ответ

2

Существует лимит, закодированный в libxml "LIBXML_PARSEHUGE" Для получения более подробной информации отметьте http://php.net/manual/en/libxml.constants.php.

Но вам не нужно понижать libxml. Просто измените способ, которым вы называете xml_parse.

Например, с файлом, который превышает 10 МБ, этот способ не работает:

$fileContent = file_get_contents("/tmp/myFile.xml"); 
if (!xml_parse($this->xmlParser, $fileContent, true)) 
{ 
    $xmlErreurString = xml_error_string(xml_get_error_code($xmlParser)); 
} 

Но если вы читаете файл 5 по 5МБ, это нормально:

$xmlParser = xml_parser_create(); 
$fp = fopen("/tmp/myFile.xml", "r"); 
while($fileContent = fread($fp, 1024*1024*5)) 
{ 
    if (!xml_parse($xmlParser, $fileContent, feof($fp))) 
    { 
     $xmlErreurString = xml_error_string(xml_get_error_code($xmlParser)); 
    } 
} 
0

Проблема решена путем понижения libxml. Из-за нашей структуры - Symfony 1.4 нам нужно использовать PHP 5.2.17, а libxml - последняя версия. После понижения все в порядке.

0

Eсть лучший ответ на этот вопрос, по-видимому, как описано здесь XML_PARSE_HUGE on function simplexml_load_string()

Вы должны установить постоянную LIBXML_PARSEHUGE обойти ограничение:

$xmlDoc->loadXML($xml , LIBXML_PARSEHUGE); 

Благодарим @Vaclav Kohout за это использование.

Смежные вопросы