Как использовать PHP для синтаксического анализа большого XML-файла последовательно

Я пытаюсь разобрать умеренно большой XML-файл (6mb) в php, используя simpleXML. Скрипт берет каждую запись из XML-файла, проверяет, уже ли он импортирован, а если нет – обновляет / вставляет, записывая в свой собственный db.

Проблема в том, что я постоянно получаю Неустранимая ошибка о превышении распределения памяти:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 256 bytes) in /.../system/database/drivers/mysql/mysql_result.php on line 162 

Я избегал этой ошибки, используя следующую строку, чтобы увеличить максимальное выделение памяти (следующий совет отсюда ):

 ini_set('memory_limit', '-1'); 

Однако, я столкнулся с максимальным временем выполнения 60 секунд, и по какой-то причине мой сервер (XAMPP в Mac OS X) не позволит мне увеличить это время (сценарий просто не будет работать, если я попытаюсь включить строка вроде 🙂

 set_time_limit(240); 

Однако все это кажется очень неэффективным; не следует ли мне разрывать файл каким-то образом и обрабатывать его последовательно? В контроллере ниже у меня есть переменная count ($ cycle), чтобы отслеживать, на какой записи я нахожусь, но я не могу понять, как ее реализовать, что ей все еще не нужно обрабатывать весь XML-файл.

Контроллер (я использую CodeIgniter) имеет эту базовую структуру:

  $f = base_url().'data/data.xml'; if($data = file_get_contents($f)) { $cycle = 0; $xml = new SimpleXMLElement($data); foreach($xml->person as $p) { //this makes a single call to db for single field based on id of record in XML file if($this->_notImported('source',$p['id'])) { //various process here, mainly breaking up the data for inserting into four different bales } $cycle++; } } 

Есть предположения?

отредактированный

Чтобы пролить свет на то, что я делаю, я хватаю большинство атрибутов каждого элемента и субэлемента и вставляю их в свой db. Например, используя мой старый код, у меня есть что-то вроде этого:

 $insert = array('indiv_name' => $p['fullname'], 'indiv_first' => ($p['firstname']), 'indiv_last' => ($p['lastname']), 'indiv_middle' => ($p['middlename']), 'indiv_other' => ($p['namemod']), 'indiv_full_name' => $full_name, 'indiv_title' => ($p['title']), 'indiv_dob' => ($p['birthday']), 'indiv_gender' => ($p['gender']), 'indiv_religion' => ($p['religion']), 'indiv_url' => ($url) ); 

С предложениями по использованию XMLReader (см. Ниже), как я мог бы выполнить синтаксический анализ атрибутов как основного элемента, так и подэлементов?