Ne bu işlemek için en iyi yoldur: PHP + istemci yavaş bağlantısı aracılığıyla geniş indir = komut dosyası zaman aşımı dosya önce tamamen indirilmeden

0 Cevap php

Müvekkilim kullanıcılara indirme sunmak için bir yol istedi, ama onlar bir kayıt formu (temelde isim ve e-mail) doldurun sonra. Bir e-posta için indirilebilir içerik bağlantıları ile kullanıcıya gönderilir. Bağlantıları paketi, dosya ve kullanıcı için benzersiz bir kayıt karma içeren ve aslında her download günlükleri ve (uygun başlıklarıyla birlikte Stdout'a yazarak dosyayı dışarı iter bir PHP sayfasına gidin. Bu çözüm doğal kusurları vardır , ama bu onlar bunu yapmak istedim nasıl olduğunu. Ben 1'e zor onları itti söyledi gerekir.) indirilebilir dosyalar ve 2 boyutlarını sınırlamak.) uluslararası müşterileri var ama barındırılan (bir CDN kullanarak düşünmek ABD 2 sunucularına ve yapışkan IP'leri) kullanan bir yük dengeleyici yansıtılmış. Neyse, o "benim için çalışıyor" ama onların uluslararası müşterilerinin bazıları gerçekten yavaş bağlantılarda (~ 60kB/sec d / l oranları) üzerinde ve bu dosyaların bazılarını (150 MB) oldukça büyük. Bu bu dosyaları hizmet veren bir PHP komut dosyası olduğundan, komut dosyası zaman aşımı ayarı ile bağlıdır. İlk başta ben 300 saniye (5 dakika), bu batmıştı, ama bu beta bazı kullanıcılar için yeterli bir zaman değildi. Öyleyse ben bir 100kb/sec bağlantı bölü dosyasının boyutuna göre komut dosyası zaman aşımı hesaplanması çalıştı, ancak bu bazı kullanıcılar bile daha yavaştır.

Şimdi müşteri sadece zaman aşımı değerine kadar istiyor. Ben komut bir şekilde sonsuz bir döngü içine alır durumda hep birlikte zaman aşımı kaldırmak istemiyorum. Ben de (çoğu insan 100kb/sec daha hızlı indirirken) bazı catch-all düşük ortak payda bağlantı hızı için keyfi aşımını dışarı iterek tutmak istemiyorum. Ve ben de "Bak, bu dosyalar bu şekilde işlemek için çok büyük. Bu 40 artı dakikalık bağlantıları ile web sitesinin kalanı performansını etkileyen bazı noktada müşteri söylemek mümkün olmak istiyorum. Biz de gerek onlar teslim edilir ne yeniden düşünmek ya da çok daha küçük dosyaları kullanın. "

Ben aşağıdaki gibidir akılda çözümleri, bir çift var:

  1. CDN - Böyle Amazon veya Google gibi bir CDN servisine dosyaları taşıyın. Biz hala PHP dosyası ile indirme girişimlerini oturum ama sonra gerçek dosyaya tarayıcı yönlendirebilirsiniz. Bu bir dezavantajı bir kullanıcı could komut atlamak ve onlar (HTTP başlıklarını izleyerek panoda olabilir) URL aldıktan sonra CDN doğrudan indirebilirsiniz olmasıdır. Bu kötü değil, ama bu arzu değil.
  2. Expand the server farm - 4 + sunucularına 2'den sunucu çiftliği genişletin ve yük dengeleyici yapışkan IP kuralı kaldırmak. Dezavantajı: onlar pahalı bu yüzden bu Windows sunucuları vardır. Orada Linux kutuları olamazdı hiçbir neden olduğunu, ancak tüm yeni kutular kurma istemci sağlayacak daha fazla zaman alabilir.
  3. Setup 2 new servers strictly for serving these downloads - en azından bu özel süreçte (ve ince ayar yeni sunucular için) gelen web sitesinin geri kalanından izole olabilir haricinde 2. Temelde aynı yararları ve sakıncaları,. Biz de oldukça kolay bu Linux kutuları yapabilir.
  4. Detect the users connection rate - O zaman gönderme, akılda bilinen bir dosya boyutu ile statik bir dosya indirme için ne kadar uzun bir süre için indirme açılış sayfasında AJAX kullanarak kullanıcının mevcut hızını algılamak için bir yol olduğunu bu bilgi tabanlı sunucu ve zaman aşımını hesaplarken bilgi. İdeal değil, ama çok yüksek veya çok düşük bağlantı hızını tahmin iyidir. Ben şu anda sunucudan gönderilen bir yönlendirme başlığı kullanmak beri geri olsa sunucuya hızlı bilgi almak istiyorum nasıl emin değilim.

Şansı # 'ın 1-3 reddedildi ya da en azından kapalı itti edilecek. Yani 4 bu konuda gitmek için iyi bir yoldur, ya da ben kabul değil başka bir şey var mı?

(Orijinal bir çözüm meydan çekinmeyin.)

0 Cevap