У меня есть скрипт для веб-приложения Laravel 5.4, который должен загружать большое количество изображений (10 КБ). Мне интересно, как лучше всего справиться с этим. В настоящее время я беру данные base64_encode()
из удаленного образа и записываю их в локальную папку с помощью функции file_put_contents()
. Это работает нормально, но некоторые изображения могут загружаться/записываться более 10 секунд, а изображение умножается на 10 тысяч. Честно говоря, эти изображения довольно большие, но я хотел бы, чтобы этот процесс происходил быстрее, поэтому я прошу совета!
Мой текущий процесс подобен этому;
- Я прочитал файл JSON, содержащий все ссылки на изображения, которые мне нужно скачать.
- Я преобразовываю данные JSON в массив с помощью
json_decode()
, перебираю все ссылки с помощью циклаforeach()
и позволяю curl обрабатывать все остальное.
Все соответствующие части кода выглядят так:
<?php
// Defining the paths for easy access.
$__filePath = public_path() . DIRECTORY_SEPARATOR . "importImages" . DIRECTORY_SEPARATOR . "images" . DIRECTORY_SEPARATOR . "downloadList.json";
$__imagePath = public_path() . DIRECTORY_SEPARATOR . "importImages" . DIRECTORY_SEPARATOR . "images";
// Decode the json array into an array readable by PHP.
$this->imagesToDownloadList = json_decode(file_get_contents($__filePath));
// Let's loop through the image list and try to download
// all of the images that are present within the array.
foreach ($this->imagesToDownloadList as $IAN => $imageData) {
$__imageGetContents = $this->curl_get_contents($imageData->url);
$__imageBase64 = ($__imageGetContents) ? base64_encode($__imageGetContents) : false;
if( !file_put_contents($__imagePath . DIRECTORY_SEPARATOR . $imageData->filename, base64_decode($__imageBase64)) ) {
return false;
}
return true;
}
А функции curl_get_contents выглядят так:
<?php
private function curl_get_contents($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
Я надеюсь, что кто-то может просветить меня возможными улучшениями, которые я мог бы применить к нынешнему способу обработки этой массовой загрузки.
Массовая загрузка — посмотрите здесь: Позволяет асинхронно обрабатывать несколько дескрипторов cURL php.net/manual/en/function.curl-multi-init.php — person CarrotCake schedule 31.01.2017
Возможный дубликат запросов PHP Multiple Curl — person CarrotCake schedule 31.01.2017
И напишите файлы с помощью cUrl stackoverflow.com/questions/25081667/ — person CarrotCake schedule 31.01.2017
Ах, как ни странно, я не наткнулся на эту функцию во время поиска в Google. Я собираюсь реализовать ее и запустить через несколько тестов, чтобы увидеть разницу, которую она делает. Спасибо за быстрые ответы! — person CarrotCake schedule 31.01.2017