Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: XML парсинг по частям
 
 автор: aetern   (29.07.2012 в 19:33)   письмо автору
 
 

Делаю парсинг из удаленного xml-файла с помощью
$data = "http://site.ru/file.xml";
$xml = file_get_contents($data);
$yrl = simplexml_load_string($xml); 

а затем разбираю его.

Но последнее время xml-файл стал очень большим и не хватеает времени на его обработку (хотя, через крон работает).

Подскажите как мне сделать, чтобы парсинг файла шел по частям, не меняя весь скрипт под такую функцию как xml_parse (узнал о ней уже после того как написал скрипт)?

  Ответить  
 
 автор: cheops   (30.07.2012 в 08:11)   письмо автору
 
   для: aetern   (29.07.2012 в 19:33)
 

Загружайте его отдельным скриптом и дробите на части, с сохранением шапки, мета-информации, чтобы сохранить валидность.

  Ответить  
 
 автор: aetern   (30.07.2012 в 19:22)   письмо автору
 
   для: cheops   (30.07.2012 в 08:11)
 

Спасибо за идею, попробую.
...
Вот я скачиваю свой xml файл (около 25 мб), а затем как лучше поступить?
Дробить этот файл на 10 других файлов и обрабатывать по очереди?
И какой размер файла для simplexml_load_string() считать приемлеммым?
Спасибо.

  Ответить  
 
 автор: cheops   (31.07.2012 в 07:37)   письмо автору
 
   для: aetern   (30.07.2012 в 19:22)
 

Сильно зависит от того, какое ограничение по памяти для скрипта выставлено на вашем сервере (можно посмотреть в отчете функции phpinfo()). Если 8 Мб, лучше разбивать на фрагменты в 4Мб, если 16 - 10Мб.

  Ответить  
 
 автор: aetern   (31.07.2012 в 22:52)   письмо автору
 
   для: cheops   (31.07.2012 в 07:37)
 

стоит
memory_limit 128M
или нужно смотреть другой параметр (Directive)?

Я разбиваю на части и обрабатываю файлы в цикле for():
for($i=1; $i<=$fcount;$i++) {
    if (file_exists('out/part'.$i.'.xml')) {        
        $yrl = simplexml_load_file("out/part".$i.".xml");
// и т.д....
, но все равно времени не хватает. Он обрабатывает сколько успевает и заканчивает по окончанию лимита времени.
Нужно, видимо, делать какие-то стопы между каждым файлом...
Подскажите, как мне нужно построить работу?

  Ответить  
 
 автор: ONYX   (01.08.2012 в 04:45)   письмо автору
 
   для: aetern   (31.07.2012 в 22:52)
 

set_time_limit(0)

  Ответить  
 
 автор: aetern   (01.08.2012 в 19:11)   письмо автору
 
   для: ONYX   (01.08.2012 в 04:45)
 

Решил задачу так:
1) делю xml на 5мб файлы и записываю их у себя
2) проверяю наличие файлов в директории и обрабатываю первый
3) если файлов в директории нет возвращаюсь к п.1)
Поставил все это на крон на каждый час.

Как вы думаете, если я переделаю парсер с SimpleXML,на потоковый (XMLReader), моя проблема решиться? Или XMLReader берет столько же времени?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования