2011-02-14 18 views
7

मेरा एक ग्राहक ने वेबसाइट को कुछ हद तक अच्छे सर्वर से स्थानांतरित करने का निर्णय लिया ... इसे कम अच्छा सर्वर कहने दें।PHP में फ़ाइल डाउनलोड, स्मृति सीमा समस्या?

समस्या है, वहाँ 40MBs के साथ एक फ़ाइल को डाउनलोड करने की और सर्वर पर स्मृति सीमा है है 32. यह और भी मुश्किल है मेरे लिए, वे fopen की अनुमति नहीं देते बनाने के

... इसके अलावा, अगर मैं फ़ाइल आकार को 20 एमबी तक कम करता हूं तो यह ठीक काम करता है।

तो, मेरा सवाल यह है कि, मैं क्या कर सकता हूं - फ़ाइल आकार को कम करने के अलावा - यह काम करने के लिए?

धन्यवाद

संपादित करें: `

 $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);` 

कोड मैं 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 का मुख्य भाग कैसा दिखता है? क्या आप इसे पेस्ट कर सकते हैं? यदि आप एक त्वरित फिक्स की तलाश में हैं, तो आप एक .htaccess फ़ाइल का उपयोग कर अपनी PHP सेटिंग्स को बदलने में सक्षम हो सकते हैं। वे ड्रोपल डॉक्स हैं, लेकिन वे ड्रूपल विशिष्ट नहीं हैं। http://drupal.org/node/29268 और http://drupal.org/node/97193 – KyleWpppd

+0

विशेष रूप से कोई भी हिस्सा? (यहां सब कुछ पोस्ट करने के लिए यह बहुत बड़ा है) –

+0

php.net से कोड ठीक करना चाहिए। बस ob_ बाहर पट्टी .. अगर इस्तेमाल नहीं किया जाता है। यदि ओबी, तेजी से डाउनलोड के लिए gz जोड़ने पर विचार करें। – Teson

उत्तर

3

उपयोग readfile() बजाय पर देखा। यह फ़ाइल को छोटे टुकड़ों में स्ट्रीम करेगा और मेमोरी उपयोग को कम रखने के लिए सभी पृष्ठभूमि कार्यों को संभालेगा।

+0

अच्छी तरह से मैं पहले से ही readfile() फ़ंक्शन का उपयोग कर रहा हूं। :/मैंने fopen फ़ंक्शन का उल्लेख किया क्योंकि मैंने php.net में पढ़ा है कि मेरी तरह की स्थिति को संभालने के लिए मुझे फॉपेन फ़ंक्शन और बफर का उपयोग करना चाहिए ... मैं अपना कोड –

+0

पोस्ट करूंगा, मुझे दस्तावेज़ में कुछ भी नहीं मिला जो 'readfile' बफर फ़ाइल भाग का सुझाव देता है। विस्तृत करने के लिए परवाह? – Phil

+0

मैं उत्तर को "स्वीकार नहीं कर सकता" क्योंकि यह वास्तव में मेरी समस्या का समाधान नहीं करता है, लेकिन मुझे यह उपयोगी लगता है। धन्यवाद। –

संबंधित मुद्दे