Скачивание файлов с сайтов при помощи PHP и CURL
CURL является отличным инструментом, для подключения к удаленным сайтам, что упрощает возможность отправки форм, загрузку целых страниц, или, как в нашем случае, загрузку файлов.
CURL является отличным инструментом, для подключения к удаленным сайтам, что упрощает возможность отправки форм, загрузку целых страниц, или, как в нашем случае, загрузку файлов. В этом сниппете я покажу вам, как вы можете скачать файл прямо на диск с помощью CURL.
Примечание: чтобы упростить пример, в этой статье мы не будем выполнять проверку CURL запросов на ошибки. Вы же всегда должны делать это, функция curl_getinfo() главное подспорье в этом деле.
Вы можете прочитать ответ и записать его на диск, как показано в следующем листинге. $path место на сервере, где вы хотите, чтобы записать файл.
<?php
$url
=
'http://www.example.com/a-large-file.zip'
;
$path
=
'/path/to/a-large-file.zip'
;
$ch
= curl_init(
$url
);
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, true);
$data
= curl_exec(
$ch
);
curl_close(
$ch
);
file_put_contents
(
$path
,
$data
);
?>
Существует, однако, проблема с этим кодом. В данном примере, файл пишеться на диск не напрямую, а сперва целиком загружается в оперативную память. Я думаю здесь понятно, что можно запросто умереться в предел памяти для исполнения скрипта и схлопотать fatal error. Так что данный способ годиться если вы скачиваете маленькие файлы, мегабайт до 20-30.
Примечание: Даже если ваш лимит памяти установлен очень высоко, грузить сервер лишний раз тоже не хорошо.
В таком случае опять возложим всю черную работу на CURL и заставим его писать данные прямо в файловый поток. Сделать это можно с помощью директивы CURLOPT_FILE.
Для этого вы должны сначала создать новый указатель файла с помощью fореn(). Далее мы передаем этот указатель на файл для выполнения запроса. Наконец, мы закрываем файл.
<?php
$url
=
'http://www.example.com/a-large-file.zip'
;
$path
=
'/path/to/a-large-file.zip'
;
$fp
=
fopen
(
$path
,
'w'
);
$ch
= curl_init(
$url
);
curl_setopt(
$ch
, CURLOPT_FILE,
$fp
);
$data
= curl_exec(
$ch
);
curl_close(
$ch
);
fclose(
$fp
);
?>
Вот и все, что нужно сделать, теперь можно не бояться о превышение лимита памяти для исполнения скрипта.