HTTP yoluyla büyük dosyalar gönderme

11 Cevap php

Ben (yani URL üzerinden bir XML dosyası yükler) HTTP üzerinden bir XML dosyasını ister bir PHP istemci var. Şu an itibariyle, XML dosya boyutu sadece birkaç KB. Ben öngörebiliriz bir sorun XML boyutta birkaç MB'ları ya da GBS haline olmasıdır. Ben bu büyük bir soru ve çözümleri orada sayısız muhtemelen, ancak istemci bu verileri taşımak için ne fikirler var olduğunu biliyor musun?

Teşekkürler!

11 Cevap

kullanımı durumda dayanarak ben kesinlikle ilk verileri sıkıştırma öneririm. Buna ek olarak, dosyayı karma ve indirme (dosya herhangi bir değişiklik varsa güncellemeye gerek) başlatmadan önce karşılaştırmak md5 isteyebilirsiniz, bu nokta # 2 ile yardımcı olacaktır.

Ayrıca, sadece yerine tüm dosyayı olmuştur XML bir segment göndermek mümkün olurdu?

Bir tarayıcı veya değil olabilir GB büyüklüğünde bir XML dosyası, tüm XML oluşturmak için yürütme zamanı herhangi yürütme zamanı eşik büyükse ben benim başın üst kapalı düşünebilirsiniz tek gerçek endişe işleyebilir ne kadar iyi almamak ortamınızda ayarlanır.

XML sizin PHP ile dinamik olarak oluşturulan göz önüne alındığında, aklıma basit bir şey gibi açıklanan dosya here, bir Apache'yi genel PHP yaklaşım sunuyor ve web sunucusu tarafından otomatik olarak gzip'li sağlamak için httpd-özel çözüm.

Başka bir yerde çok basit bir çözüm olmalı gibi Bunun yanı sıra, bir tarayıcı (başka ne bir PHP-istemci olabilir?) Sahip olan böyle bir işi yapmak, bazı veri synchonizing için her gece geliyor.

Ve, tabii ki, bir noktada, zaman "çok fazla" sürecekse veri "bir sürü" aktarması ...

Sorun o iki veri kadar senkronize olmasıdır. Sorun tamamen yanlış beyan edilir.

Sen a) veri kümesi B o günlüğü gönderebilirsiniz A verisetine değişiklik diferansiyel günlük tutmak, ya da b) kümesi iki kopyasını (son gece ve güncel veri kümesi) tutmak, ve sonra bunu size bunları karşılaştırmak için ya da gerek Daha sonra B. A diferansiyel günlüğü gönderebilirsiniz

Çoğaltma dünyasına hoş geldiniz.

(A) ile sorun bir RDBMS'yi kullanıyorsanız eğer veritabanı / güncellemeleri / siler ekler izlemek için tetikler yoluyla belki bazı günlük yapmak ve için bilgi yazmak olabilir ama bu, kodunuzun tüm potansiyel invaziv olmasıdır Bir masa, sonra diferansiyel günlüğü olarak ilgili satırları ihracat. Ama, bu çok kötü olabilir.

Ile sorun (b) bir kerede "veritabanını karşılaştırarak" bütündür. 100 satır için iyi. 10 ^ 9 satırlar için kötü. Pis pis.

Aslında, tüm kötü olabilir. Çoğaltma pis.

Daha iyi bir planı (bir veritabanı çalıştıran varsayarak) çalıştırdığınız belirli veritabanları için tasarlanmış bir "gerçek" çoğaltma sistemi içine bakmaktır. Belki de daha çok kendi rulo çalışırken daha senkronizasyon için veritabanı log kayıtlarını üzerinden gönderdiği bir şeydir.

Modern DBMS sistemlerinin çoğu çoğaltma sistemleri var.

Eğer http üzerinden fotoğraf yüklemelerine olanak tanıyor Gallery2, büyük yüklenenler izin vermek, size post_max_size ve upload_max_filesize, php parametrelerin bir çift kurmak yapar. Bunu içine bakmak isteyebilirsiniz.

Bu büyük dosyaları gönderme tarayıcı zaman aşımı ve benzeri sorunları var gibi geliyor bana, ama artı tarafta daha iyi, farklı bir dosya yükleme protokolü çalışırken daha proxy sunucuları ve güvenlik duvarları ile çalışır.

Yanıt için teşekkürler. Ben dosyayı aktarmak nispeten hızlı olması gerektiğini söz başarısız (birkaç mintues max, bu bile mümkündür?). Istenen XML çözümlü ve her gece bir veritabanına eklenecektir. XML önceki gece aynı olabilir ya da farklı olabilir. Önerilmiş bir çözüm xml zip dosyasını ve daha sonra transfer etmektir. Yani iki gereksinimleri temelde vardır:. 1 o 2 nispeten hızlı olan bu veritabanına yazma sayısını en aza indirmek gerekir..

Önerilmiş bir çözüm xml zip dosyasını ve daha sonra transfer etmektir. ama bu sadece tatmin (1)

Diğer fikirler?

Ben XML sıkıştırmak için geçerli olabilecek herhangi bir algoritma var mı? Nasıl böyle bir MP3 birkaç saniye içinde indirilmiş olarak büyük dosyalar nelerdir?

PHP receiving GB's of data will take long and is overhead. Even more perceptible to flaws.

Ben istiyorum - yürütme zaman rahatsız değil ve başarısızlık hatta kendi liyakat yeniden olabilecek bir shellscript için atama (basit hata alıcı ile wget) gönderir.

Bu deneyimli, ama değilim, bir exec() veya benzeri, bu ne yazık ki koşmak modal kullanabilirsiniz gerçi.

**./test.sh &** ile bir komut dosyası arayarak arka planda çalıştırabilirsiniz yapar ve sorunu çözer / sanırım. Komut kolayca PHP wget `http://yoursite.com/continue-xml-stuff.php?id=1049381023&status=0 ile geri onu almak izin verebilir. Kayıp istekleri sarfınazar gerek yoksa kimliği, bir dosya adı olabilir. Durumu komut isteği işleme sona erdi nasıl işaret eder.

Bu işlemek için sürüm kontrol sistemi çeşit kullanarak düşündünüz mü? Dosyaların sadece farkları hesaplamak ve gönderme yeteneğini kaldıraç olabilir, artı size dosyanın sürüm geçmişi sürdürmenin ekledi faydaları olsun.

Senin durumun ayrıntılarını bilmiyorum çünkü ben orada soru atacağım. Tartışmanın uğruna HTTP olmak zorunda? FTP büyük veri aktarımı için çok daha uygundur ve PHP veya Perl ile kolayca otomatik hale getirilebilir.

Apache kullanıyorsanız, aynı zamanda Apache mod_gzip düşünebilirsiniz. Bu, otomatik olarak dosyayı sıkıştırmak için izin vermelidir ve dekompresyon da sürece her iki taraf da gzip sıkıştırmasını kabul gibi, otomatik olarak gerçekleşmesi gerekir.