v2.5.2
Giriş yap

Php ile büyük xml dosyasını parçalara bölme ve insert etme

Anonim
457 defa görüntülendi

Merhabalar,
Elimde çok büyük bir XML dosyası var ve benim bu dosyanın içindeki içerikleri veritabanına kaydetmem gerekiyor.
Fakat baya araştırdım bir sonuca varamadım. Şu an XML Dosyamda 3000 adet ürün ve 83579 satır data var.
Insert işlemi başlattığımda dosyayı okuması yaklaşık yarım saat sürüyor.
Bu dosyayı nasıl parçalara bölüp daha performanslı bir şekilde veritabanına kaydettirebilirim ?

Teşekkürler

ebykdrms
954 gün önce
1) PHP'de tüm dosyayı tek seferde okumak yerine stream şeklinde okuyarak işlem yapabilirsiniz.

Sorunuza benzer bir soru stackoverflow'da sorulmuş.
Kabul edilen cevapta özetle demiş ki:
"Büyük dosyaları işlemek için gerçekten uygun sadece 2 tane PHP API vardır: expat API ve daha yeni olan XMLReader. Bunlar tüm verileri belleğe yükleyip okumaya çalışmak yerine sürekli bir akış şeklinde okurlar."
Sonra da bir örnek vermiş.
Yine de dosyanız çok büyük ve burada MySQL'in de hızı devreye giriyor. Bu işlem muhakkak uzun sürecektir.

2) Yükü server (PHP) ve client (javascript) arasında paylaştırabilirsiniz.

Başka bir yol olarak belki XML'i javascript ile parçalayıp PHP'ye parça parça post ederek de işlem sağlamayı deneyebilirsiniz. Dosyayı javascript'in domParser sınıfı yardımıyla parçalamayı deneyebilirsiniz. Tarayıcınızda 100 elemanlı diziler halinde xml satırlarınızı json formatında PHP'ye post edip PHP'ye de yalnızca veritabanına yazma işlemi yapmasını söyleyebilirsiniz. PHP veritabanına yazmayla ilgilenirken siz bir sonraki 100 satırı json'a çevirtirsiniz. PHP'den "tamam yazdım" sonucu dönünce hazırladığınız 100 satırı gönderirsiniz. Hata döndürürse önceki 100 satırı tekrar gönderirsiniz. Böyle bir döngü... Ekrana da PHP'nin o ana kadar kaç satırı eklediğini yazdırırsanız, olası bir kopma halinde nerede kaldığınızı bilir, tekrar başlayınca kaldığınız yerden devam edersiniz. Burada yükü sunucuyla istemci arasında paylaştırmış olursunuz ama tarayıcının bu boyutta bir xml'i ne kadar hızlı okuyabileceğini bilemiyorum tabi. Alternatif olarak bu yöntem de kenarda dursun.

3) Dosyayı doğrudan MySQL'e aktarmayı deneyebilirsiniz.

XML dosyasını doğrudan MySQL'e aktarmayı deneyebilirsiniz. HeidiSQL gibi bir programla veritabanınıza bağlanıp dosyanızı import etmeye çalışabilirsiniz. Sanırım databasejournal.com sitesindeki The Import Process başlığı altında bu konu anlatılmış. Bu doküman güncel midir bilmiyorum.