Время ожидания шлюза 504 для нескольких запросов. апаш

У меня есть 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 изображений, они отображаются просто отлично.

2

Решение

Поскольку вы получаете доступ к контенту на сервере, который вы не можете контролировать, только администраторы сервера знают действующие правила блокировки.

Но у вас есть несколько вариантов, а именно:

  • Запускайте партии по 1000 штук или около того, затем спите несколько часов.
  • Разделите запрос между компьютерами, которые запрашивают информацию.
  • Может быть, даже что-то столь же простое, как изменение запрашивающей информации пользовательского агента каждые 1000 или около того изображений, будет достаточно, чтобы обойти механизм блокировки.
  • Или какая-то комбинация всего вышеперечисленного.
2

Другие решения

Я бы предложил вам попробовать следующее
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
  1. Если изображения доступны через https и http, попробуйте вместо этого использовать http. (это как минимум ускорит загрузку)
  2. Проверяйте заголовки ответа при возврате 504, а также при загрузке URL вашего браузера. Убедитесь, что нет заголовков X-RateLimit- *. Кстати, каковы заголовки ответа на самом деле?
0

По вопросам рекламы [email protected]