denblackstache
@denblackstache
Rock'n'roll Engineer

Как реализовать очень быстрый REST API на php вкупе с фреймворком?

Есть готовое REST Stateless API для мобильного приложения на стэке nginx, php-fpm 5.6 (w OPCache), yii2, redis, mysql, S3. Приложение по логике простое, общего характера как Instagram.
Задача: получить 5000-10000 RPS (кол-во запросов в секунду), больше — лучше.

Естесственно на обычном nginx+fpm цифра сейчас не впечатляет, около 3000 RPS.
Есть идеи пробовать HHVM, ReactPHP (ratchet) или даже всё переделать на Node.js (будет затратнее на переквалификацию и переноса всей логики).

Какой стэк выбрать и в какую сторону копать, чтобы получить заветные цифры и не потратить при этом много времени?
  • Вопрос задан
  • 1303 просмотра
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Найди узкие места по производительности в коде через XHProf + исправь их.
2. Пересмотри индексы в БД. Например FK могут быть слишком высокой платой за целостность.
3. Все "тяжелые" обработки, не виляющие на вывод - выноси в очередь: RabbitMQ / ZeroMQ / Gearman / ...
4. Если нет блокирующих зависимостей - попробуй на HHVM.
5. Yii-шная валидация моделей занимает довольно много времени. + Генерация моделей при выборке (используй asArray).

--

По поводу NodeJS - он вас особо не спасет. Профит, который получишь - это не stateless система (общие данные в памяти можно хранить и дергать сессию / кэш / бд для них не надо). Под ноду еще надо уметь писать, по началу у будет callback на callback-е и callback-ом погонять.

--

В любом случае рано, или поздно упрешься в железо, посему продумывай на перед возможности по горизонтальному масштабированию.
Конкретно по скорости можешь в сторону golang посмотреть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
FanatPHP
@FanatPHP
Чебуратор тега РНР
Что за шутки? Откуда цифра в 300 RPS?
К РНР там гири привязывали, что ли?
Какова доля РНР? Где тесты, показывающие, что бутылочное горлышко - РНР фреймворк, а не, скажем, база?
Ответ написан
Вам бы node.js нужен А вообще да 300 что-то маловато
Ответ написан
Комментировать
@kofon
Я человек
переквалификация - это хорошо! Думаю, лучше node.js
Я сам его знаю только поверхностно, но у меня нет задач, нет мотивации =(
Вот будет, с радостью изучу...
Ответ написан
Комментировать
Для начала нужно определить что можно выжать с сервера вообще на каком-нибудь простейшем нативном коде, эмулирующем задачу, типа подключаемся к БД, открываем файл на ФС, читаем/пишем что-то, считаем, выводим и отпрофилировать её.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы