Сделать cURL записывать данные по мере их получения

У меня есть следующий код php, который я нашел здесь :

function download_xml() { $url = 'http://tv.sygko.net/tv.xml'; $ch = curl_init($url); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $data = curl_exec($ch); echo("curl_exec was succesful"); //This never gets called curl_close($ch); return $data; } $my_file = 'tvdata.xml'; $handle = fopen($my_file, 'w'); $data = download_xml(); fwrite($handle, $data); 

Я пытаюсь загрузить xml по указанному URL-адресу и сохранить его на диске. Однако он останавливается примерно на 80% и не достигает echo сигнала после вызова curl_exec . Я не уверен, почему, но я верю, что это потому, что у него заканчивается память. Поэтому я хотел бы спросить, можно ли заставлять завиток записывать данные в файл каждый раз, когда скачал скажем 4kb. Если это невозможно, знаете ли кто-нибудь, как получить xml-файл, хранящийся на URL-адресе, загруженный и сохраненный на моем диске с помощью php?

Большое спасибо, BEN.

EDIT: Это код сейчас, он не работает. Он записывает данные в файл, но все еще только около 80% документа. Может быть, это не потому, что оно превышает память, а какая-то другая причина? Я действительно не могу поверить, что это трудно скопировать файл с URL-адреса на диск …

  <? $url = 'http://tv.sygko.net/tv.xml'; $my_file = fopen('tvdata.xml', 'w'); $ch = curl_init($url); $timeout = 300; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FILE, $my_file); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096); curl_exec($ch) OR die("Error in curl_exec()"); echo("got to after curl exec"); fclose($my_file); curl_close($ch); ?> 

Related of "Сделать cURL записывать данные по мере их получения"

Ваш тайм-аут устанавливается в 5 секунд, что может быть слишком коротким в зависимости от размера файла документа. Попробуйте увеличить его до 10-15, чтобы убедиться, что у него достаточно времени для завершения передачи.

Здесь приведен полный рабочий пример:

 public function saveFile($url, $dest) { if (!file_exists($dest)) touch($dest); $file = fopen($dest, 'w'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback'); curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024*512)); curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 15); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt($ch, CURLOPT_FILE, $file); curl_exec($ch); curl_close($ch); fclose($file); } ?> 

Секрет заключается в настройке CURLOPT_NOPROGRESS на FALSE, а затем CURLOPT_BUFFERSIZE сделает отчет обратного вызова для каждого байта CURLOPT_BUFFERSIZE. Чем меньше значение, тем чаще будет сообщаться. Это также зависит от скорости загрузки и т. Д., Поэтому не рассчитывайте на то, чтобы он сообщал каждые X секунд, так как он будет отчитываться за каждый полученный X переданный / переданный байт.

Существует опция CURELOPT_FILE, которая позволяет вам указать обработчик файла, который должен записывать завиток. Я уверен, что он будет делать «правильную» вещь и «писать», как она читает, избегая проблемы с памятью

 $file = fopen('test.txt', 'w'); //<--------- file handler $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://example.com'); curl_setopt($ch, CURLOPT_FAILONERROR,1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 15); curl_setopt($ch, CURLOPT_FILE, $file); //<------- this is your magic line curl_exec($ch); curl_close($ch); fclose($file); 

curl_setopt CURLOPT_FILE – файл, в который должна быть записана передача. По умолчанию используется STDOUT (окно браузера)

http://us2.php.net/manual/en/function.curl-setopt.php