Yüklemeler ile sorun: yavaş ve / veya başarısız

3 Cevap php

Ben bir ziyaretçi bir dosya indirmek izin aşağıdaki script var:

header( 'Content-Type: application/octet-stream' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Disposition: attachment; filename=' . $fileName );
header( 'Content-Length: ' . filesize( $filePath ) );
header( 'Content-Description: Download' );
header( 'Cache-Control: private' );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );

readfile( $filePath );
exit();

O çok iyi çalışmıyor. (Ben de tırnak, aynı sonucu dosya koyduk).

Bu çok yavaş davranır, bazen indirme hatta durdurmak. Opera özellikle, bu indirme% 99 durur. Bazen bile hemen% 99 tamamlanmış gösterir, o zaman indirmeye başlar ve çevresinde% 34 de durur.

Sunucu paylaşılan bir bilgisayar, Mac OS X sunucusudur.

Firefox'un Live HTTP başlıklarını add-on kullanarak, ben sunucu yanıt aditional başlıkları ekler fark ettik:

HTTP/1.1 200 OK
Date: Thu, 18 Feb 2010 09:27:25 GMT
Server: Apache
X-Powered-By: PHP/5.2.12
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename=test.psd
Content-Length: 398635
Content-Description: Download
Cache-Control: private
Pragma: no-cache
Expires: 0
Content-Encoding: gzip // <-- expecially this one,
Vary: Accept-Encoding // <-- this one,
MS-Author-Via: DAV // <-- and this one
Keep-Alive: timeout=10, max=100
Connection: Keep-Alive
Content-Type: application/octet-stream

Bu sorunun nedeni ne olabilir?

Benim localhost komut dosyasını çalıştırdığınızda her şey çalışıyor. Ben doğrudan bu ana bilgisayardan dosya indirmek, ayrıca, hız da gayet iyi ve akıcı olduğunu.

Bu sefer gerçekten oldukça clueless değilim. Senin yardım appeciated edilir. Şimdiden teşekkür ederim.

UPDATE:

Ben darboğaz sorunu daralmış düşünüyorum. Webserver otomatik gzip çıkışını sıkıştırır. Ben kaldırıldı ne zaman PHP komut her şeyi Content-Length başlık pürüzsüz indirme başladı. Bu mantıklı: değeri Content-Length Artık gerçek gzip'li çıktı eşleşmiyor. PHP ben Content-Length başlığı ayarlamak için sıkıştırılmamış dosya boyu okumak, ama daha sonra, Apache sıkıştırır ve tarayıcılar kısık nerede bu muhtemelen.

Ben webserver otomatik gzip çıkışını sıkıştırır zaman doğru Content-Length başlık boyutunu ayarlamak için nasıl bir soru ile bu soruyu takip edeceğiz.

3 Cevap

Ben darboğaz sorunu daralmış. Webserver otomatik gzip çıkışını sıkıştırır. Benim PHP komut dosyası Content-Length üstbilgisi kaldırılır zaman her şey düzgün indirme başladı. Bu mantıklı: Content-Length değeri artık gerçek gzip'li çıktı eşleşmiyor. PHP ben Content-Length üstbilgisi ayarlamak için sıkıştırılmamış dosya boyu okumak, ama daha sonra, Apache sıkıştırır ve tarayıcılar kısık nerede bu muhtemelen.

Gzip-Content-Encoding unsetting sahipsiniz.

Use ob_start() at the very beginning of your script; before setting your headers, use @ob_end_clean(); and right after it, explicitely set header("Content-Encoding:"); to try to unset any gzip-Encoding that might come in. At the end of your file place @ob_end_flush();.

Çıktı tamponlama işlevleri başlık ayar daha Hataya karşı güvenli hale getirmek için kullanışlı, ama muhtemelen sorunu ile ilgili değil. Ben sadece kapsayan PHP kodu ob_gzhandler kullanılan ve onu yoketmek için gerekli bir kurulum sorunları koştu unutmayın.

Ben aşağıdaki kodu kullanabilirsiniz ve o inşaat. Size ben henüz düzgün ben göndermek tüm başlık undersyand vermedi doğruyu söylüyor, ben hala araştırmak için zaman yoktu, ben de açıklamalarda bulundu:

Kaynaklar:

http://www.opendesigns.org/forum/discussion/1437/php-download-counter/#pgbottom http://www.webdeveloper.com/forum/showthread.php?t=115815&highlight=PHP+download+counter http://php.net/manual/en/function.header.php#83384

yine de çalışır:

   /*
   TODO: still to be read and better understood.
   */

   //no caching (I don't uderstand what is this part useful for)
   header("Pragma: public"); //?
   header("Expires: 0"); //?
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); //?
   header("Cache-Control: private", false); //?

   //sending download file
   header("Content-Type: application/octet-stream"); //application/zip can use application/octet-stream that is more generic it works because in now days browsers are able to detect file anyway
   header("Content-Disposition: attachment; filename=\"" . basename($file_serverfullpath) . "\""); //ok
   header("Content-Transfer-Encoding: binary"); //?
   header("Content-Length: " . filesize($file_serverfullpath)); //ok
   readfile($file_serverfullpath);