2011-01-25 13 views
14

मेरे पास एक PHP स्क्रिप्ट है जिसे कभी-कभी डिस्क पर बड़ी फ़ाइलों को लिखने की आवश्यकता होती है। file_put_contents() का उपयोग करना, यदि फ़ाइल काफी बड़ी है (इस मामले में लगभग 2 एमबी), PHP स्क्रिप्ट मेमोरी से बाहर हो जाती है (PHP घातक त्रुटि: ######## बाइट थक गया है)। मुझे पता है कि मैं सिर्फ स्मृति सीमा को बढ़ा सकता हूं, लेकिन यह मेरे लिए एक पूर्ण समाधान की तरह प्रतीत नहीं होता है - एक बेहतर तरीका होना चाहिए, है ना?PHP में डिस्क पर बड़ी फ़ाइल लिखने का सबसे अच्छा तरीका क्या है?

PHP में डिस्क पर बड़ी फ़ाइल लिखने का सबसे अच्छा तरीका क्या है? लाइन (या पैकेट बाइनरी फ़ाइलें के मामले में पैकेट द्वारा) द्वारा

+1

आंकड़ों का स्रोत क्या है? इसके अलावा, अधिकांश PHP कॉन्फ़िगरेशन बिना किसी समस्या के 2 एमबी को संभालने में सक्षम होना चाहिए। आपकी मेमोरी सीमा नीचे हो सकती है। – webbiedave

+1

फ़ाइल कहां से आती है? यदि यह पहले से डिस्क पर मौजूद है, तो 'कॉपी() 'सबसे उपयुक्त होगा। – mario

+0

इस मामले में, मुझे कर्ल का उपयोग कर दूरस्थ सर्वर से फ़ाइल मिल रही है। तो, मेरे पास एक चर में है। –

उत्तर

15

कार्यों का उपयोग कर आप जिसमें आप स्रोत फ़ाइल के टुकड़े डाल प्लस क्या संलग्न किया जा करने के लिए एक अस्थायी फ़ाइल की आवश्यकता होगी:

$sp = fopen('source', 'r'); 
$op = fopen('tempfile', 'w'); 

while (!feof($sp)) { 
    $buffer = fread($sp, 512); // use a buffer of 512 bytes 
    fwrite($op, $buffer); 
} 

// append new data 
fwrite($op, $new_data);  

// close handles 
fclose($op); 
fclose($sp); 

// make temporary file the new source 
rename('tempfile', 'source'); 

इस तरह, source की पूरी सामग्री स्मृति में पढ़ा नहीं कर रहे हैं। cURL उपयोग करते समय, आप CURLOPT_RETURNTRANSFER की स्थापना को छोड़ सकता है और इसके बजाय, एक निर्गम बफर है कि एक अस्थायी फ़ाइल के लिए लिखता है जोड़ें:

function write_temp($buffer) { 
    global $handle; 
    fwrite($handle, $buffer); 
    return ''; // return EMPTY string, so nothing's internally buffered 
} 

$handle = fopen('tempfile', 'w'); 
ob_start('write_temp'); 

$curl_handle = curl_init('http://example.com/'); 
curl_setopt($curl_handle, CURLOPT_BUFFERSIZE, 512); 
curl_exec($curl_handle); 

ob_end_clean(); 
fclose($handle); 

यह हालांकि मैं हमेशा स्पष्ट याद आती है के रूप में लगता है। जैसा कि मार्क द्वारा इंगित किया गया है, डिस्क पर प्रतिक्रिया लिखने के लिए CURLOPT_FILE है।

+0

का उपयोग कर उन्हें एक साथ चला सकता हूं, लेकिन इस मामले में मैंने कर्ल का उपयोग करके एक अलग सर्वर से फ़ाइल पुनर्प्राप्त की है, इसलिए यह पहले से ही स्मृति में है। –

+0

@ जो मैंने जवाब अपडेट किया। एक और सुझाव आपको रास्ता आ रहा है। पहले समाधान के लिए –

+0

आपने ['stream_copy_to_stream'] (http://php.net/stream_copy_to_stream) भी उपयोग किया होगा ;-) – arnaud576875

1

लेखन लाइन की तरह fwrite()

0

this answer का प्रयास करें:

$file = fopen("file.json", "w"); 

    $pieces = str_split($content, 1024 * 4); 
    foreach ($pieces as $piece) { 
     fwrite($file, $piece, strlen($piece)); 
    } 

    fclose($file); 
संबंधित मुद्दे

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