Как загрузить большой файл с использованием PHP (использование низкой памяти)

Мне нужно загрузить большой файл (1xx MB) с помощью PHP.

Как я могу загрузить это без потери памяти (RAM) для временного файла?

Когда я использую

$something=file_get_contents('http://somehost.example/file.zip'); file_put_contents($something,'myfile.zip'); 

Мне нужно иметь так много памяти, что размер этого файла.

Может быть, его можно загрузить любым другим способом?

Например, в частях (например, 1024b), записать на диск и загрузить другую часть, повторяющуюся до тех пор, пока файл не будет полностью загружен?

Скопируйте файл на один маленький кусок за раз

 /** * Copy remote file over HTTP one small chunk at a time. * * @param $infile The full URL to the remote file * @param $outfile The path where to save the file */ function copyfile_chunked($infile, $outfile) { $chunksize = 10 * (1024 * 1024); // 10 Megs /** * parse_url breaks a part a URL into it's parts, ie host, path, * query string, etc. */ $parts = parse_url($infile); $i_handle = fsockopen($parts['host'], 80, $errstr, $errcode, 5); $o_handle = fopen($outfile, 'wb'); if ($i_handle == false || $o_handle == false) { return false; } if (!empty($parts['query'])) { $parts['path'] .= '?' . $parts['query']; } /** * Send the request to the server for the file */ $request = "GET {$parts['path']} HTTP/1.1\r\n"; $request .= "Host: {$parts['host']}\r\n"; $request .= "User-Agent: Mozilla/5.0\r\n"; $request .= "Keep-Alive: 115\r\n"; $request .= "Connection: keep-alive\r\n\r\n"; fwrite($i_handle, $request); /** * Now read the headers from the remote server. We'll need * to get the content length. */ $headers = array(); while(!feof($i_handle)) { $line = fgets($i_handle); if ($line == "\r\n") break; $headers[] = $line; } /** * Look for the Content-Length header, and get the size * of the remote file. */ $length = 0; foreach($headers as $header) { if (stripos($header, 'Content-Length:') === 0) { $length = (int)str_replace('Content-Length: ', '', $header); break; } } /** * Start reading in the remote file, and writing it to the * local file one chunk at a time. */ $cnt = 0; while(!feof($i_handle)) { $buf = ''; $buf = fread($i_handle, $chunksize); $bytes = fwrite($o_handle, $buf); if ($bytes == false) { return false; } $cnt += $bytes; /** * We're done reading when we've reached the conent length */ if ($cnt >= $length) break; } fclose($i_handle); fclose($o_handle); return $cnt; } 

Отрегулируйте переменную $ chunksize в соответствии с вашими потребностями. Это было только слегка протестировано. Это может легко ломаться по ряду причин.

Применение:

 copyfile_chunked('http://img.ruphp.com/download/f', '/local/path/somefile.jpg'); 

вы можете выполнить команду wget с помощью exec() это приведет к наименьшему использованию памяти.

 <?php exec("wget -o outputfilename.tar.gz http://pathtofile/file.tar.gz") ?> 

Вы также можете попробовать использовать функции fopen() и fread() и fwrite() . Таким образом, вы одновременно загружаете x байтов в память за раз.