Время ожидания шлюза 504 для нескольких запросов. апаш - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 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) после каждого 100-го изображения, но все равно выдает ту же ошибку (sleep(180) - same). Когда я попробовал локальное изображение, но с полным путем, он не дал никаких ошибок. Пробовал второй сервер (не локальный) произошло то же самое.

Я использую функцию PHP copy() для перемещения изображения с этого сервера. Я только что использовал file_get_contents() для тестирования, но получил ту же ошибку.

у меня

set_time_limit(300000);
ini_set('default_socket_timeout', 300000);

тоже, но не повезло.

Есть ли способ сделать это без частичных запросов?

Эта ошибка возникает на каком-то одном изображении? Было бы здорово отловить эту ошибку или просто отслеживать задержку ответа, чтобы через некоторое время отправить другой запрос, если это можно сделать?

Есть ли какое-то постоянное время в секундах, в течение которого мне приходится ждать, пока эти запросы не будут обработаны?

И, если возможно, дайте мне ответы без скручивания.

UPDATE

Curl и exec (wget) также не работали. Они оба пошли на ту же ошибку.

Можно ли настроить удаленный сервер, чтобы он не блокировал меня? (Если это так).

p.s. если я сделаю: echo "<img src = 'https://anotherserver.com/image1.jpg'" /> в цикле для всех 12 000 изображений, они отображаются просто отлично.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я бы предложил вам попробовать следующее 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 голосов
/ 01 ноября 2018

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

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

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