Büyük bir XML dosyası sırayla ayrıştırmak için PHP nasıl kullanılır

0 Cevap php

Ben SimpleXML kullanarak php bir orta büyük bir XML dosyası (6MB) ayrıştırmak çalışıyorum. Komut dosyası, XML dosyası her kaydı alır zaten ithal edilmiş olup olmadığını görmek için kontrol eder, ve, değil varsa, güncellemeleri / benim kendi db içine kaydı ekler.

Sorun sürekli bellek ayırma aşan hakkında bir Ölümcül hata alıyorum olduğunu:

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

Ben (dan ipucu izleyerek here) max bellek ayırmayı artırmak için aşağıdaki satırı kullanarak bu hatayı kaçınılmalıdır:

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

Ancak ben eklemeyi denerseniz (script basitçe çalışmaz, o zaman ben 60 saniye maksimum yürütme zamana karşı koşmak, ve, herhangi bir nedenle, benim sunucu (Mac OS X XAMPP) bana o zaman artış izin vermez :) gibi bir satır

set_time_limit(240);

Bu tüm Ancak, çok verimsiz görünüyor; Bazı how dosya kırmak ve sırayla işlemek mümkün olmamalı? Aşağıdaki denetleyicisi ben olduğumu ne kayıt takip etmek için bir sayım değişken ($ döngü) var ama ben yine de tüm XML dosyasını işlemek zorunda olmadığını nasıl uygulamaya anlamaya olamaz.

Denetleyici (I CodeIgniter'ı kullanıyorum) bu temel yapıya sahiptir:

    $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++;
        }
    }

Herhangi bir düşünce?

Edited

Ben ne yapıyorum üzerinde daha fazla ışık tutacak, ben her eleman ve subeelement niteliklerinden en kapma ve benim db içine koymadan ediyorum. Örneğin, benim eski kodu kullanarak, böyle bir şey var:

$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)
                                    );

(Aşağıya bakınız) XMLReader kullanarak önerileri ile, nasıl ana öğe ve alt öğeleri hem özelliklerini ayrıştırma başarmak olabilir?

0 Cevap