PHP cURL, запись в файл

Я хочу попробовать подключиться к удаленному файлу и записать вывод оттуда в локальный файл, это моя функция:

function get_remote_file_to_cache() { $the_site="http://facebook.com"; $curl = curl_init(); $fp = fopen("cache/temp_file.txt", "w"); curl_setopt ($curl, CURLOPT_URL, $the_site); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_exec ($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if($httpCode == 404) { touch('cache/404_err.txt'); }else { touch('cache/'.rand(0, 99999).'--all_good.txt'); } curl_close ($curl); } 

Он создает два файла в каталоге «cache», но проблема в том, что он не записывает данные в «temp_file.txt», почему?

Благодаря!
р

Related of "PHP cURL, запись в файл"

Вам нужно явно записать файл с помощью fwrite , передав ему созданный ранее дескриптор файла:

 if ( $httpCode == 404 ) { ... } else { $contents = curl_exec($curl); fwrite($fp, $contents); } curl_close($curl); fclose($fp); 

Фактически, использование fwrite частично верно. Чтобы избежать проблем с переполнением памяти большими файлами (превышен максимальный предел памяти для PHP), вам необходимо настроить функцию обратного вызова для записи в файл.

ПРИМЕЧАНИЕ. Я бы рекомендовал создать класс, специально предназначенный для обработки загрузок файлов и файлов и т. Д., А не EVER с использованием глобальной переменной, но для целей этого примера ниже показано, как получить информацию и запустить ее.

поэтому выполните следующие действия:

 # setup a global file pointer $GlobalFileHandle = null; function saveRemoteFile($url, $filename) { global $GlobalFileHandle; set_time_limit(0); # Open the file for writing... $GlobalFileHandle = fopen($filename, 'w+'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FILE, $GlobalFileHandle); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_USERAGENT, "MY+USER+AGENT"); //Make this valid if possible curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); # optional curl_setopt($ch, CURLOPT_TIMEOUT, -1); # optional: -1 = unlimited, 3600 = 1 hour curl_setopt($ch, CURLOPT_VERBOSE, false); # Set to true to see all the innards # Only if you need to bypass SSL certificate validation curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); # Assign a callback function to the CURL Write-Function curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'curlWriteFile'); # Exceute the download - note we DO NOT put the result into a variable! curl_exec($ch); # Close CURL curl_close($ch); # Close the file pointer fclose($GlobalFileHandle); } function curlWriteFile($cp, $data) { global $GlobalFileHandle; $len = fwrite($GlobalFileHandle, $data); return $len; } 

Вы также можете создать обратный вызов прогресса, чтобы показать, сколько / как быстро вы загружаете, однако это еще один пример, поскольку он может быть сложным при выводе на CLI.

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

Очень безопасный способ сделать это! Конечно, вы должны убедиться, что URL-адрес правильный (конвертировать пробелы в% 20 и т. Д.) И что локальный файл можно записать.

Привет, Джеймс.

Попробуем отправить GET-запрос на http://facebook.com :

 $ curl -v http://facebook.com
 * Восстановленный URL-адрес: http://facebook.com/
 * Имя хоста не было найдено в кеше DNS
 * Попытка 69.171.230.5 ...
 * Подключен к facebook.com (69.171.230.5) порт 80 (# 0)
 > GET / HTTP / 1.1
 > User-Agent: curl / 7.35.0
 > Хост: facebook.com
 > Принять: * / *
 > 
 <HTTP / 1.1 302 Найдено
 <Место проведения: https://facebook.com/
 <Vary: Accept-Encoding
 <Content-Type: text / html
 <Дата: Чт, 03 Сен 2015 16:26:34 GMT
 <Связь: сохранить жизнь
 <Content-Length: 0
 < 
 * Соединение # 0 для размещения facebook.com оставлено без изменений

Что случилось? Похоже, что Facebook перенаправил нас с http://facebook.com чтобы защитить https://facebook.com/ . Обратите внимание на то, что длина тела ответа:

  Контент-длина: 0 

Это означает, что нулевые байты будут записаны в xxxx--all_good.txt . Вот почему файл остается пустым.

Ваше решение абсолютно верно:

 $fp = fopen('file.txt', 'w'); curl_setopt($handle, CURLOPT_FILE, $fp); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 

Все, что вам нужно сделать, это изменить URL-адрес на https://facebook.com/ .

Что касается других ответов:

  • @JonGauthier: Нет, нет необходимости использовать fwrite() после curl_exec()
  • @doublehelix: Нет, вам не нужна CURLOPT_WRITEFUNCTION для такой простой операции, которая копирует содержимое в файл.
  • @ScottSaunders: touch() создает пустой файл, если он не существует. Я думаю, что это было намерение ОП.

Серьезно, три ответа и каждый из них недействительны?

Функция touch() ничего не делает для содержимого файла. Он просто обновляет время модификации. Посмотрите на file_put_contents() function .