XML PHP MYSQL - Verimli Dosya Üretimi

3 Cevap php

Biz oldukça ciddi performans sorunları çalışan pek çok veri toplama im gibi ben bir fiyat karşılaştırma veri motoru çalıştırın ve. Biz çeşitli XML dosyalarını, ürün başına bir ve ürün veri içindeki her Online alışveriş biz vb kendi fiyat, bağlantı, açıklama ile, veri kapmak olduğunu üretmek

Her ürün için fiyat bilgileri toplamak çoklu besleme ayrıştırıcılarda / kazıyıcılar var. Ürün verileri bir MySQL db yüklenir, daha sonra bir PHP dosyası sunucu üzerinde oturur ve her ürün için XML üretir.

Biz içine çalışan Sorun, 10.000 ürünler için, XML nesil hemen hemen 25 dakika alıyor olmasıdır! DB tamamen normalleştirilmiş ve i PHP Dom aracılığıyla XML üreten duyuyorum.

XML oluşturma süreci herhangi bir veri aslında değişip değişmediğini dikkate almaz ve bu ben bakıyorum sorundur. Herhangi bir veri bir değişiklik yok XML dosyaları nesil atlama en etkili yolu nedir?

I bir bayrak sistemini kullanıyor musunuz? Ama bu sonuç daha db bakmak up db maliyetleri artırabilir neden olan? Geçerli sorguları yalnızca ~ ürün başına 0.1 saniye sürer.

XML dosyası içinde 1 dükkan değişiklikleri için sadece 1 fiyat, çünkü bu tekrar tüm dosya yazmak için bir atık gibi görünüyor, ama kesinlikle bir preg_replace sadece zaman alıcı gibi olurdu da, ne olur?

Eğer ayırdığınız için teşekkürler, gerçekten takdir!

3 Cevap

Bir giriş veritabanı MD5 içine gönderdi zaman başka bir alana içeriğini karma. Eğer bir güncelleştirme için yoklamak Sonra sunucudaki dosyanın bir karma veritabanından MD5 karşılaştırın. Onlar bir şey yapmıyoruz maç ve daha sonra farklı sizin güncelleştirme bilgileri yaparsanız. Eğer

Ben sunucuya MD5 hash üzerinde dosya yapabilirsiniz zaman ben bile az sunucu işi yapmak zorunda - Ben sadece DB karma dosya karşılaştırın.

İç güncelleme için muhtemelen regex çeşit kullanmak gerekir, ama bir şey dosyasında değiştirdiğinde bilecek beri daha az sıklıkla değiştirilmesi yapıyor olacak.

Bir diğer şey. Düz dosya önbelleği biraz yaparken ben veri depolama birkaç farklı şekilde Benchmarking var ve o hemen hemen her zaman daha hızlı gzencode etmek gibi depolama öncesi) (dosyalarını arar ve sonra bunları okumak için gerektiğinde bunları çözmek. Bu sunucu alanı kazandırır ve (donanım ve depolama ihtiyaçları farklı olsa, beri kendi yapmak) benim testlerde daha hızlı olmuştur

EDIT:

Eğer DB karşılaştırmak için kazıyıcı gelen verileri karma olacak gibi yazınızı yeniden okuma geliyor. Hala aynı temel fikir ama ben yine de işe yarayacağını düşünüyorum açıklamak istedim. Sadece çok özel bir sorguda DB 32 karakter çekerek olacağını beri sorgu havai hala lite olmalı - dizinler doğru ayarlanmış ÇOK hızlı olmalıdır.

Ayrıca, ben asla kullanılmış olsa - PHP yerli simplexml gibi bir şey içine bakmak - bu Regex'in kullanmak zorunda kalmadan, iyi biçimlendirilmiş XML verileri değiştirmek için hızlı ve kolay bir şekilde vermek ve olabilir kendiniz yazmak.

Bir preg_replace çok daha kötü olacak. I daha az yük olduğunu düşünüyorum SimpleXMLElement uzakta DOMDocument taşımak isteyebilirsiniz, ama düğümleri kaldırmak için gerekiyorsa, aynı zamanda o zaman aklı korumak amacıyla karışımı içine DOMDocument getirmek zorunda.

Db veri kazınmış veri sağlamalarının karşılaştırma hakkında ben de ikinci Shane öneri. Bu değişiklikleri ayıklamak ve ardından seçtiğiniz DOM kütüphane ile işleyebilir bir iyi bir yol gibi görünüyor.

25mins yazılmış 10000 dosya saniyede yaklaşık 6 dosyaları. HD XGB / sn desteklemiyor olsa bile, birden fazla dosya bir ikinci veri X gösterilerin yazamaz, havai FAT endekste yeni bir dosya oluşturarak orada yer almaktadır.

Imho, temel sorun size performans açısından kötü bir seçimdir statik dosyaları ile uğraşıyoruz edilir. Akıllı çözüm, tabii ki yerine yanı sıra veritabanı sorguları yok gibi bu statik dosyaları kullanarak durdurmak için. Bir şey bu dosyaları doğrudan ayrıştırma ise, belki, MOD_REWRITE Apache ve bunun yerine gerçek XML dosyalarını yazma kullanarak içine bakmak gerekir url canlı veritabanı sorgusu ve çıkış talebi üzerine dosyayı çalıştırmak. Bu şekilde elle tüm XML dosyaları oluşturmak zorunda değilsiniz.

Bu alt-optimal yöntem ile devam edersek, bunun için ayrı bir sunucu / depolama oluşturmak zorunda olacak. Şans eseri, aynı kutusunda veritabanı ve web sunucusu konut değil mi? Eğer öyleyse, onları ayırmak zorunda. Muhtemelen yüksek performanslı bir raid 0 kurulumunda, bu XML dosyalarını saklamak için ayrı bir sunucu veya NAS gerekebilir.

Özetle, ben çok tüm bu küçük dosyaları kaydetme hareketidir, veritabanı darboğaz şüpheliyim.