На нашем сервере около 80 тыс. (Только основных) изображений продуктов, которые являются копиями изображений поставщиков.Поставщик постоянно меняет их, но мы не знаем, что было изменено, а что нет (имя файла все время одно и то же), и нам нужны изображения, чтобы оставаться свежими.
Моя идея - взять последнее изменение значение заголовка каждого изображения на сервере поставщика и сравнение с нашим последним изменением времени.Затем, если у нас меньше времени, загрузите новый образ с сервера.
Я создал скрипт консоли php, который использует curl multi request , сделанный с этой библиотекой: ParallelCurl - github .
Мой код PHP:
function setComparatorData( $model, $filetime ) {
global $comparator;
if ( file_exists(DIR_IMAGE . "catalog/" . $model . ".jpg") ) {
$localFileTime = filemtime(DIR_IMAGE . "catalog/" . $model . ".jpg");
if ( $localFileTime > $filetime ) return;
}
$comparator[$model] = $filetime;
}
function onReceived($content, $url, $ch, $request) {
$data = curl_getinfo($ch);
setComparatorData($request['model'], $data['filetime']);
}
function request($limit = 100) {
$products = array(); // This is array of products from database
$curl_options = array(
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
CURLOPT_NOBODY => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_HEADER => TRUE,
CURLOPT_FILETIME => TRUE,
CURLOPT_TIMEOUT => 5,
CURLOPT_FRESH_CONNECT => TRUE // For test!
);
$parallel_curl = new ParallelCurl($limit, $curl_options);
foreach ($products as $product) {
$parallel_curl->startRequest("http://supplierImageUrlBasedOnProductVariable",'onReceived', array("model" => $product['model'], "source" => "remote"));
}
$parallel_curl->finishAllRequests();
}
$comparator = array();
request(100);
print_r($comparator);
Это разделяет мультизапрос на 100 параллельных запросов, и после завершения одной "группы" запускается следующая.Моя проблема в том, что это медленно, как ад.Для 600 запросов (изображений продуктов) это заняло 8 секунд, а для 5000 - полчаса (затем я остановил его).
Я считаю, что самой большой проблемой является PHP, но, возможно, я ошибаюсь.У кого-нибудь есть идеи, как решить эту проблему со скоростью?Должен ли я переписать его на Python или Bash скрипт?Это поможет?Или есть небольшая ошибка в коде, которая вызывает медленный ответ?
Возможно, мое решение совершенно неверно, если у кого-то есть другая идея, запишите как.
Спасибо