Как масштабировать PHP

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

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

Ответ 1

Примечание: это не было написано мной, но Snorkel из новостей YC

Вот короткий список:

  • Кэш вывода по краям: используйте Varnish или другой обратный прокси-кеш.
  • Байт-код кэша. Используйте кеш-код opcode APC или XCache PHP.
  • Кэш и минимизация ввода/вывода базы данных: уменьшает количество штрихов базы данных с помощью memcached, redis, кэшей файлов и кэшей уровня приложений (т.е. глобальных варов)
  • Выполнять ведение журнала событий в локальных файлах, а не в базе данных: делать все операции записи максимально простыми и быстрыми, любые данные, которые не нужны в реальном времени, могут быть записаны в простой старый файл и обрабатывается позже.
  • Использовать CDN, особенно для доставки статических активов
  • Настройка сервера: Apache, MySQL и Linux имеет множество настроек, влияющих на производительность, особенно для настроек тайм-аута, которые необходимо отклонить.
  • Определите узкие места. На системном уровне используйте такие инструменты, как strace, top, iostat, vmstat и ведение журнала запросов, чтобы узнать, какой уровень использует наибольшее время и ресурсы
  • Загрузка: DoS самостоятельно. Стресс проверить ваш стек, чтобы найти узкие места и настроить их
  • Удалить неиспользуемые модули. Для каждого компонента стека выгружайте все модули по умолчанию, которые не нужны для доставки вашей службы.
  • Не используйте ORM и другие фиктивные абстракции: снимите тренировочные колеса и напишите свои собственные запросы.
  • Сделать страницы входа быстрыми, простыми и кэшируемыми. Никто не читает этот глупый канал новостей в нижнем углу вашей первой страницы и убивает вашу базу данных, поэтому вытащите его.

В большинстве случаев PHP замедляется, потому что каждый процесс PHP блокируется, ожидая ввода-вывода с другого уровня, либо медленного диска, либо перегруженной базы данных, либо зависающего процесса memcached, либо медленного вызова API REST третьему лицу услуга... часто просто привязка к текущему процессу PHP покажет вам, что ждет... короче говоря, блокирование ввода-вывода замедляет все. Ключ к ускорению:

- прост

- максимально возможный кеш в локальной памяти

- делать как можно меньше операций ввода-вывода за каждый запрос

Ответ 2

Масштабирование до нескольких интерфейсов требует также репликации корня вашего сайта и его динамического содержимого.

GlusterFS - приятное дополнение, однако мне непонятно, насколько он масштабируется. Другой альтернативой является Lsyncd. Другие альтернативы могут включать GIT для кода и CDN для динамического содержимого.

Ответ 3

Вы должны добавить: сжать вывод с помощью gzip.