Тайм-аут шлюза 504 для нескольких запросов. Apache

У меня есть файл 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> локально.

Есть про 9000 предложений и про 14 000 изображений.

Когда я просматриваю их, я вижу, что изображения копируются с этого другого сервера, но в какой-то момент он дает 504 Gateway Timeout.

Дело в том, что иногда ошибка выдается после 2000 изображений, иногда более или менее.

Я пытался получить с этого сервера только одно изображение 12000 раз (т.е. только 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);

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

Есть ли способ сделать это без запросов на фрагменты?

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

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

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

UPDATE

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

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

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

if I do: echo "<img src = 'https://anotherserver.com/image1.jpg'" /> PS здесь неверные цитаты. У вас есть двойная кавычка в атрибуте src, а не одна в конце строки, что является синтаксической ошибкой. Полагаю, это, наверное, опечатка в вопросе.
ArtisticPhoenix 04.02.2019 20:20

Обычно я обхожу подобные вещи с помощью прокси, таким образом вы можете распределять запросы по нескольким IP-адресам. Но это And pls give me non-curl answers if possible.

ArtisticPhoenix 04.02.2019 20:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
2 236
2

Ответы 2

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

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

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

Пользовательский агент не помог. Пакеты по 1000 штук не будут есть, потому что ждать несколько часов - не вариант. Когда я пытаюсь сохранить файлы, возникает ошибка, но когда я просто echo "<img src='https://anotherserver.com/image3.jpg'>", она появляется на странице браузера. Думаю, я мог бы попытаться просмотреть их все через javascript, получить base64 изображений и сохранить эти данные в виде файла изображения? Или мне не хватает чего-то очень важного?

temo 01.11.2018 09:21

Мне любопытно, почему curl вам не подходит? Будет ли он отображать ВСЕ изображения в браузере? Недавно я сделал проект, в котором я использовал wget для получения десятков тысяч HTML-страниц с одного сайта. Но это был не php, я запускал его как сценарий оболочки.

Difster 01.11.2018 09:28

Итак, я мог бы выполнить exec (), запустить wget и передать URL-адреса изображений в переменных, и все будет работать правильно? Я никогда не использовал wget, могу я его так использовать? Мне нужно, чтобы это работало как можно быстрее, и, поскольку я читал, CURL намного медленнее.

temo 01.11.2018 09:44

Дайте мне несколько, и я продезинфицирую скрипт, который использовал, и вставлю его в ответ. (это слишком долго для комментария).

Difster 01.11.2018 09:53

Я запустил другой сценарий для входа в систему и сохранения файла cookie, но вот пример. Однако он захватил целые html-страницы ... #! / Bin / bash m = 1 while [$ m -lt 20350]; do wget --load-cookies cookies.txt \ --header = "Accept: text / html" \ --user-agent = "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko ) Chrome / 69.0.3497.100 Safari / 537.36 "\ somewebsite.com/editcontactform.cfm?id=$m let m = m + 1 sleep .25 done

Difster 01.11.2018 09:57

У меня есть wget -P --cut-dirs=3 -np -nH /home/subd.mywebsite.com/images/ -A jpeg,jpg,bmp,gif,png https://anotherdomain.com/images/detailed/27/image3.png, и это создает папки. Я хочу сохранить файл изображения только в моем каталоге. Я не знаю, какие параметры мне для этого использовать. Я добавил параметры, которые нашел в stackoverflow. Ничего не работает. А также, при сохранении файла, могу ли я переименовать изображение и назвать его как захочу?

temo 01.11.2018 10:10

Да, вы можете переименовывать изображения, как хотите.

Difster 01.11.2018 10:13

Ты почти спас мне день. Я имею в виду, что у меня есть еще одна проблема. exec(wget) или exec(/usr/bin/wget) работают. Когда я запускаю ту же команду в терминале, изображение сохраняется должным образом. Но с exec я не могу запустить ни одну команду, я думаю. Вы тоже можете на это ответить? Или мне задать новый вопрос?

temo 01.11.2018 10:52

Я запускал его как команду оболочки, а не в PHP. Может, это поможет.

Difster 01.11.2018 10:56

У меня было хорошее предчувствие по этому поводу. Но это не сработало. с wget возникает такая же ошибка. Есть другие предложения?

temo 01.11.2018 13:23

Я ничего не могу придумать, кроме как использовать несколько компьютеров (IP-адресов) и делать это партиями. Сколько вы получаете за раз? Между партиями может потребоваться всего 30 минут, трудно сказать.

Difster 02.11.2018 00:00

Вот в чем дело. Один раз я просто выполнил сценарий, и все прошло хорошо. Все изображения были скопированы. Думаю, я буду использовать несколько IP-адресов. Я отправлю ответ, когда он у меня будет. Только почему изображения отображаются, когда я помещаю эхо "<img src>"? Это какой-то другой запрос? Это все еще просьба, и все равно их 12 000 ...

temo 02.11.2018 07:23

@temo вы исключили, что echo <img src> "работал в приватном режиме? Возможно, это сработало только потому, что в вашем браузере хранился файл cookie сеанса. Если это так, вы должны иметь возможность использовать этот файл cookie с curl / wget

Bolli 05.02.2019 01:25

Я бы посоветовал вам попробовать следовать 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- *. Кстати, каковы на самом деле заголовки ответов?

Я попробую.

temo 05.02.2019 12:12

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

temo 05.11.2019 13:28

Другие вопросы по теме