1. Пользователь ввел id.
2. Делаю к API другого сервиса запрос с этип id.
3. Получаю к примеру общее количество записей 19000.
Теперь мне нужно пройтись по каждой записи с этих 19000, получить значение этой записи и после определить максимальное значение из этих 19000.
API за один запрос дает максимально 200 записей.
Я сделал так:
1. Цикл for от 1 до 19000/200
2. За каждый проход цикла, записываю в массив максимальное значение из 200.
3. Когда for дошел до конца, выбираю максимальное значение из записанного массива.
Работает, но работает долго.
Каким образом это улучшить или нужно по другому это делать?
Messi: Если API позволяет указать какую порцию данных хотите получить, то запускаете получение данных в несколько потоков.
Например, при помощи curl_multi_*
документации на сайте пхп достаточно.
Есть более сложные решения. Это сформировать некий пул воркеров на вашей стороне. Общение с ними производить посредством очереди (например Gearman, RabbitMQ etc ). То есть воркеры слушают определенную очередь. При получении задачи в ней выполняют каждый свой запрос к апи, и возвращают данные.
Сайт в свою очередь должен правильным образом положить запросы в очередь и потом забрать ответы.
Есть два варианта:
1. Слать запросы асинхронно. Если Вы работаете с API по протоколу http можно использовать один из готовых http-клиентов позволяющих это делать.
2. Загружать данные из АПИ в себе к базу и работать с ними.
Какой вариант возможен в Вашей ситуации - нужно смотреть по АПИ и по Вашей системе в целом
Messi: да, лучше всего будет писать в базу, чтобы потом если пользователь повторно запросит id или другой пользователь это сделает, вы не делали запрос по API, а смотрели по базе, это будет плюс в том что у вас будет меньше квот расходоваться если они есть и в дальнейшем когда будет своя база то это все будет происходить очень быстро
Апи, который каждый раз лезет на другой апи - это неправильно.
Храните данные в своей базе с датой последнего обновления, если данные устарели - только в этом случае обновляйте их с чужого апи. Может быть даже не по запросу, а по расписанию.
ну не знаю... у меня есть апи к базе электронных компонентов... себе все миллиарды позиций все равно не вытянешь, да еще и наличие с ценой регулярно меняется.
Антон Антон: Лазить в чужой API за одним и тем же - это неправильно. Можно их хотя бы кешировать. Если у вас запросы повторяются редко - еще ладно, просто вопрос зачем тогда ваш API, если проще сразу лазить в чужой.
Но у топикстартера как раз ситуация, что часто нужно возвращать те же данные - их лучше хранить у себя.