70000 GET запросов быстро.

nebosklon

Новичок
Ой, ребятки, помогите.
Задача такова:
Есть удаленное апи, которое по гет запросы ввиде ссылки возвращает объект.
И вроде все просто, но...
Надо сделать 70 000 таких запросов ежедневно. Каждый запрос с разными гет параметрами.
Попробовал через file_get_content (очень долго).
Попробовал через fsockopen - тоже страшное какое-то время получаеться...

Подскажите, как правильно на практике реализовывать подобные задачи.
У меня была конечно мысль запустить скрипт 100 раз одновременно.... и вроде как нагрузка не очень большая (все это на мощном выделенном сервере), но что-то мне подсказывает, что это костыль сделанный из костылей.

Может курлы какие.. я в них не очень.. но может они быстрей?
 

WMix

герр M:)ller
Партнер клуба
70000 это же реже чем 1 в секунду там и 2х-4х параллельных процессов теоретически хватит. curl я бы использовал но и file_get_content не медленнее.
 

nebosklon

Новичок
Конечно, очень бы не хотелось, чтобы скрипт работал прям целые сутки. идеально ночью 2-3 часа. или работать целые сутки это нормально?
Но скрипты запущенные фоново из планировщика не распространяеться время выполнение скрипта execute_time ?
 

nebosklon

Новичок
@Hello, Я не торопился тебя благодарить - хотел проверить. и да!!!
1000 запросов меньше, чем за 10 секунд!!!
Спасибо. Действительно, я в цикле открывал и закрывал сокет. Перенес открытие и закрытие вне цикла и вуаля! Спасибо еще раз.

@WMix, как показала практика file_get_content медленней. примерно в 2 раза. Может конечно и я там , что напутал, но с сокетами летает будь здоров. спасибо и тебе.

ПОПРАВКА: на 1000 запросов 1.2 секунды))))
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
@nebosklon, после fsockopen не делай fclose, а отсылай ещё запросы в этот коннект.
Какой интересный совет. Надо полагать, что автор сможет полноценно реализовать загрузку с chunked encoding или хотя бы с проверкой content-length, если там одна статика.
 

nebosklon

Новичок
@Вурдалак, Ты видимо предугадал то, с чем я столкнусь.
Данные одинановые почему то.
Я шлю в один сокет разные заголовки и гет запросы, а на выходе не меняеться нефига.
И циклы работают как надо, а выход не меняется. Можешь пояснить?
для справки: получаю json объект От одного гет запроса.


А еще прочитал, что второй запрос шлеться уже в пустой $fp (открытый сокет) и ничего не возвращает. Вот у меня походу эта проблема.
Как запихнуть в один сокет много запросов?
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
воспользйся мультикурлом, обёрток валом. только естественно не 1000 окнектов одновременно делай, а разбей на чанки.
 

Hello

Новичок
@Вурдалак, Ты видимо предугадал то, с чем я столкнусь.
Данные одинановые почему то.
Я шлю в один сокет разные заголовки и гет запросы, а на выходе не меняеться нефига.
И циклы работают как надо, а выход не меняется. Можешь пояснить?
для справки: получаю json объект От одного гет запроса.


А еще прочитал, что второй запрос шлеться уже в пустой $fp (открытый сокет) и ничего не возвращает. Вот у меня походу эта проблема.
Как запихнуть в один сокет много запросов?
Каждый запрос должен оканчиваться двойным переводом строк (\r\n\r\n).
Данные нужно получать с помощью feof и fgets
В документации есть примеры https://secure.php.net/manual/ru/function.fsockopen.php#refsect1-function.fsockopen-examples
 

Вурдалак

Продвинутый новичок
Каждый запрос должен оканчиваться двойным переводом строк (\r\n\r\n).
Данные нужно получать с помощью feof и fgets
В документации есть примеры https://secure.php.net/manual/ru/function.fsockopen.php#refsect1-function.fsockopen-examples
А теперь ты нам расскажешь как ты распарсишь такой ответ.

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

AnrDaemon

Продвинутый новичок
Какой интересный совет. Надо полагать, что автор сможет полноценно реализовать загрузку с chunked encoding или хотя бы с проверкой content-length, если там одна статика.
Вроде же Keeep-Alive требует обязательного указания Content-Length?
 

Вурдалак

Продвинутый новичок
Вроде же Keeep-Alive требует обязательного указания Content-Length?
В этом и смысл chunked, он позволяет не указывать content-length.
Ты не сможешь указать content-length у динамически создаваемой страницы без предварительной буферизации всего контента этой страницы.
С chunked сервер буферизует только чанки и позволяет не ждать до генерации всей страницы.
 

fixxxer

К.О.
Партнер клуба
Вообще-то curl прекрасно умеет реюзать соединение и использует keepalive по умолчанию. Достаточно повторно использовать тот же curl handle, а url задавать через CURLOPT_URL - curl достаточно умен, чтобы увидеть, что protocol/hostname/port не изменились. Это, конечно, при условии, что сервер поддерживает keepalive.

Впрочем, и ручками распарсить chunked encoding невелика проблема, но зачем?
 
Сверху