What is the best way to write a large file to disk in PHP?

后端 未结 3 1527
温柔的废话
温柔的废话 2020-12-14 10:49

I have a PHP script that occasionally needs to write large files to disk. Using file_put_contents(), if the file is large enough (in this case around 2 MB), the

相关标签:
3条回答
  • 2020-12-14 10:56

    You'll need a temporary file in which you put bits of the source file plus what's to be appended:

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

    That way, the whole contents of source aren't read into memory. When using cURL, you might omit setting CURLOPT_RETURNTRANSFER and instead, add an output buffer that writes to a temporary file:

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

    It seems as though I always miss the obvious. As pointed out by Marc, there's CURLOPT_FILE to directly write the response to disk.

    0 讨论(0)
  • 2020-12-14 11:05

    Try this answer:

        $file   = fopen("file.json", "w");
    
        $pieces = str_split($content, 1024 * 4);
        foreach ($pieces as $piece) {
            fwrite($file, $piece, strlen($piece));
        }
    
        fclose($file);
    
    0 讨论(0)
  • 2020-12-14 11:15

    Writing line by line (or packet by packet in case of binary files) using functions like fwrite()

    0 讨论(0)
提交回复
热议问题