2016-05-12 2 views
1

Я пытаюсь загрузить большой файл с помощью PHP и CURL. Если вы откроете ссылку, следующий код должен инициировать загрузку.Неустранимая ошибка при загрузке большого файла с curl

$download = $downloadFolder.$result['file']; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $download); 
curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); 
curl_setopt($ch, CURLOPT_TIMEOUT, 300); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$output = curl_exec($ch); 
curl_close($ch); 

header('Content-Description: File Transfer'); 
header("Content-Type: video/mp4"); 
header("Content-Disposition: attachment; filename=".str_replace(" ", "_", $result['file'])); 
header("Content-Length: " . strlen($output)); 
header("Content-Transfer-Encoding: binary"); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Connection: close'); 

echo $output; 
exit; 

Он отлично работает с небольшими файлами (например, 35MB), но и на крупных, я получаю следующее сообщение об ошибке: PHP

Allowed memory size of 134217728 bytes exhausted (tried to allocate 63981406 bytes) in /var/www/typo3conf/ext/...

memory_limit в php.ini уже установлен на 128, но это все еще не работает. Нужно ли мне установить это значение еще выше?

ответ

3

По умолчанию cURL сохраняет ответ в памяти, поэтому, если у вас есть файл большего размера, вы можете попасть в потолок. Решение состоит в том, чтобы сообщить cURL, чтобы напрямую записывать данные сервера:

<?php 
if ($fh = fopen('file.tmp', 'wb+')) { 

    curl_setopt($ch, CURLOPT_URL, $download); 
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 300); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    // tell it you want response written to file 
    curl_setopt($ch, CURLOPT_FILE, $fh); 

    curl_exec($ch); 
    curl_close($ch); 

    fclose($fh); 

    ... output the file you just downloaded ... 
} 
+0

Если я так делаю, я получу файл с 1 байтом, в котором есть только «1». – martinavk

Смежные вопросы