2011-02-14 22 views
7

Bir müşterim, web sitesini güzel bir sunucudan bir şeye taşımayı kararlaştırdı ... daha az güzel sunucu olarak adlandırın.Dosya yükleme php, bellek sınırı sorunu?

sorundur

, Ayrıca daha da zor benim için, onlar fopen izin vermez hale getirmek için 32'dir ...

indirilecek 40MBs taşıyan bir dosya ve sunucuda bellek sınırı var Dosya boyutunu 20MB'ye indirirseniz, iyi çalışır.

Yani, sorum şu; bu dosyayı yapmak için dosya boyutunu küçültmenin yanı sıra ne yapabilirim?

size

EDIT ederiz: `

 $fsize = filesize($file_path); 
     $path_parts = pathinfo($file_path); 
     $ext = strtolower($path_parts["extension"]); 


     switch ($ext) { 
      case "pdf": $ctype = "application/pdf"; 
       break; 
      case "exe": $ctype = "application/octet-stream"; 
       break; 
      case "zip": $ctype = "application/zip"; 
       break; 
      case "doc": $ctype = "application/msword"; 
       break; 
      case "xls": $ctype = "application/vnd.ms-excel"; 
       break; 
      case "ppt": $ctype = "application/vnd.ms-powerpoint"; 
       break; 
      case "gif": $ctype = "image/gif"; 
       break; 
      case "png": $ctype = "image/png"; 
       break; 
      case "jpeg": 
      case "jpg": $ctype = "image/jpg"; 
       break; 
      default: $ctype = "application/force-download"; 
     } 

     header("Pragma: public"); // required 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private", false); // required for certain browsers 
     header("Content-Type: $ctype"); 
     header("Content-Disposition: attachment; filename=\"" . basename($file_path) . "\";"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: " . $fsize); 
     ob_clean(); 
     flush(); 
     readfile($file_path);` 

i php.net

// If it's a large file, readfile might not be able to do it in one go, so: 
$chunksize = 1 * (1024 * 1024); // how many bytes per chunk 
if ($size > $chunksize) { 
    $handle = fopen($realpath, 'rb'); 
    $buffer = ''; 
    while (!feof($handle)) { 
    $buffer = fread($handle, $chunksize); 
    echo $buffer; 
    ob_flush(); 
    flush(); 
    } 
    fclose($handle); 
} else { 
    readfile($realpath); 
} 
+0

Phpinfo'unuzun çekirdek bölümü nasıl görünür? Yapıştırır mısın? Hızlı bir düzeltme arıyorsanız, php ayarlarınızı bir .htaccess dosyası kullanarak değiştirebilirsiniz. Onlar drupal doktorlar, ama drupal spesifik değiller. http://drupal.org/node/29268 ve http://drupal.org/node/97193 – KyleWpppd

+0

Özellikle herhangi bir kısmı? (Burada her şeyi göndermek için biraz büyük) php.net'in yapması gereken kodun iyi olması gerektiğini söyleyen –

+0

. Sadece ob_ dışarı çıkar .. eğer kullanılmazsa. Eğer ob ise, daha hızlı indirme için gz eklemeyi düşünün. – Teson

cevap

3

Kullanım readfile() yerine gördüğümüz kodu. Dosyayı küçük parçalar halinde akıtacak ve bellek kullanımını en aza indirmek için tüm arka plan işlerini halledecek.

+0

iyi zaten readfile() işlevini kullanıyorum. :/Ben fopen işlevinden bahsettim çünkü php.net'de benimki gibi bir durumu işlemek için fopen işlevini kullanmalıyım ve bir arabellek kullanmalıyım ... Kodumu göndereceğim –

+0

Belgedeki hiçbir şeyi bulamıyorum Bu readfile' arabellekleri dosya parçaları önerir. Detaylandırmaya özen gösterilsin mi? – Phil

+0

Cevabımı "kabul edemiyorum" çünkü sorunumu gerçekten çözmüyor, ancak yararlı buldum. Teşekkür ederim. –