У меня есть XML-файл локально. Он содержит данные с рынка.
Это выглядит примерно так:
<offer id="2113">
<picture>https://anotherserver.com/image1.jpg</picture>
<picture>https://anotherserver.com/image2.jpg</picture>
</offer>
<offer id="2117">
<picture>https://anotherserver.com/image3.jpg</picture>
<picture>https://anotherserver.com/image4.jpg</picture>
</offer>
...
Я хочу сохранить эти изображения в <picture>
узел локальный.
Есть около 9 000 предложений и о 14 000 изображений.
Когда я перебираю их, я вижу, что изображения копируются с этого другого сервера, но в какой-то момент это дает 504 Gateway Timeout
,
Дело в том, что иногда ошибка выдается после 2000 изображений, иногда более или менее.
Я пытался получить только одно изображение 12 000 раз с этого сервера (т.е. только https://anotherserver.com/image3.jpg
) но все равно выдает ту же ошибку.
Как я прочитал, чем другой сервер блокирует мои запросы после некоторого количества.
Я пытался с помощью PHP sleep(20)
после каждого сотого изображения, но оно все равно выдало мне ту же ошибку (sleep(180) - same
). Когда я попробовал локальное изображение, но с полным путем, он не дал никаких ошибок. Пробовал второй сервер (не локальный) то же самое произошло.
я использую PHP copy()
функция для перемещения изображения с этого сервера.
Я только что использовал file_get_contents()
в целях тестирования, но получил ту же ошибку.
я имею
set_time_limit(300000);
ini_set('default_socket_timeout', 300000);
но не повезло.
Есть ли способ сделать это без частичных запросов?
Эта ошибка возникает на каком-то одном изображении? Было бы здорово отловить эту ошибку или просто отслеживать задержку ответа, чтобы через некоторое время отправить другой запрос, если это можно сделать?
Есть ли какое-то постоянное время в секундах, в течение которого мне приходится ждать, чтобы эти запросы прокручивались?
И, пожалуйста, дайте мне ответы без скручивания, если это возможно.
ОБНОВИТЬ
Curl и exec (wget) не сработали. Они оба пошли на ту же ошибку.
Можно ли настроить удаленный сервер, чтобы он не блокировал меня? (Если это так).
постскриптум если я сделаю: echo "<img src = 'https://anotherserver.com/image1.jpg'" />
в цикле для всех 12 000 изображений, они отображаются просто отлично.
Поскольку вы получаете доступ к контенту на сервере, который вы не можете контролировать, только администраторы сервера знают действующие правила блокировки.
Но у вас есть несколько вариантов, а именно:
Я бы предложил вам попробовать следующее
1. повторно использовать ранее открытое соединение, используя CURL
$imageURLs = array('https://anotherserver.com/image1.jpg', 'https://anotherserver.com/image2.jpg', ...);
$notDownloaded = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
foreach ($imageURLs as $URL) {
$filepath = parse_url($URL, PHP_URL_PATH);
$fp = fopen(basename($filepath), "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_URL, $URL);
curl_exec($ch);
fclose($fp);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) == 504) {
$notDownloaded[] = $URL;
}
}
curl_close($ch);
// check to see if $notDownloaded is empty