Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Ошибка при разборе XML-файла - No memory
Форумы портала PHP.SU » » XML и его обработка » Ошибка при разборе XML-файла - No memory

Страниц (1): [1]
 

1. Good_luck - 25 Февраля, 2013 - 15:31:35 - перейти к сообщению
При разборе xml файла весом больше 10 Мб функция xml_parse возвращает ошибку: No memory. На сервере стоит версия php 5.3, раньше стояла php 5.2 - ошибок не возникало.

memory_limit в php.ini - 3000 Mb

Подскажите в чем может быть проблема?

PHP:
скопировать код в буфер обмена
  1.  
  2.   $parser = xml_parser_create();
  3.  
  4.     xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8").
  5.    
  6.     xml_set_object($parser, $this);
  7.     xml_set_element_handler($parser, 'start_element', 'end_element');
  8.    
  9.     if (!xml_parse($parser, $content)) {
  10.       $parse_error = 'Line '.xml_get_current_line_number($parser).': '.(xml_get_error_code($parser)?xml_error_string(xml_get_error_code($parser)):'Unknown error'); // Line 205454: No memory    
  11.     }
  12.  
  13.     xml_parser_free($parser);
2. esterio - 25 Февраля, 2013 - 15:33:44 - перейти к сообщению
simplexml пробовали?
3. Good_luck - 25 Февраля, 2013 - 15:48:32 - перейти к сообщению
esterio пишет:
simplexml пробовали?


Нужно именно через xml_parse (придется уже многое переписывать). Ведь на php 5.2 все работало отлично. И ещё заметил, что строка на которой происходит ошибка является последней в xml-файле.
4. webbear - 01 Октября, 2013 - 09:45:57 - перейти к сообщению
У меня такая же проблема. Пи переезде на новый сервер на CentOS 6.4. проявилась (на FreeBSD таких глюков с этим скриптом не было). С памятью там всё в порядке (3 гига для PHP) - такое ощущение что не работает именно библиотека.

Может удалось выяснить в чём проблема?
5. Zuldek - 01 Октября, 2013 - 09:57:57 - перейти к сообщению
Ну в чем ваша проблема понятно.
Суть в том, — какой парсер вы используете. Если у вас нет возможности увеличить объемы памяти до уровня, требуемого парсеру для хранения всего DOM документа, то вам нужен тот, который не хранит все дерево в памяти, то есть один из SAX-парсеров для последовательного разбора документа большого объема. Либо, — вы можете разбирать его ручками, не забывая "удалять" (для пыхи в кавычках) из памяти уже разобранные и ненужные сущности, хранящие элементы документа.
esterio пишет:
simplexml пробовали?

Плохой неправильный совет даете. Simplexml точно также хранит в памяти всё дерево DOM xml-документа.
6. armancho7777777 - 01 Октября, 2013 - 10:35:29 - перейти к сообщению
Zuldek пишет:
то есть один из SAX-парсеров

DOM*
7. webbear - 03 Октября, 2013 - 09:15:07 - перейти к сообщению
Это точно проблема не с памятью. При доступном объёме 3Гб и общем 32Гб, файл размером 10 Мб как бы его в памяти не хранить - это сущий пустяк. Скрипт валится на последней строке XML файла и во время выполнения xml_parse. Но малые файлы затягивает нормально...
8. webbear - 04 Октября, 2013 - 18:40:31 - перейти к сообщению
Проблема решилась даунгрейдом libxml библиотеки. У нас используется PHP 5.2.17 (выше не позволяет устанавливать фреймворк) а версия libxml была из последних, после даунгрейда заработало.

 

Powered by ExBB FM 1.0 RC1