PHP на самом деле не тот язык, где вы можете выполнять микрооптимизацию или просто работать над одним кодом. Там действительно нет смысла. Хотя PHP не особенно быстр, сам PHP редко является узким местом на данном веб-сайте.
Вам нужно выяснить, где находится это узкое место, прежде чем вы сможете это исправить. Есть много общих узких мест, с общими решениями. Это сложно обобщить, учитывая так мало деталей, но есть много подсказок по производительности, которые применимы к большинству веб-сайтов.
Первое хорошее место для поиска - на стороне клиента, а не на стороне сервера. Насколько велики ваши страницы (включая изображения, CSS, JavaScript и т. П.)? Сколько HTTP-запросов требуется для просмотра одной страницы? Используйте что-то вроде Firebug (и надстройку YSlow для Firebug), чтобы увидеть, сколько времени фактически занимает загрузка вашей страницы и какие биты вашей страницы вызывают проблему. Некоторые общие советы:
- Разработайте способы сокращения CSS и JavaScript - удалите все, что вам не нужно, и запустите все остальное с помощью такого инструмента, как YUI Compressor.
- Если у вас есть несколько файлов CSS и JavaScript, попробуйте объединить их в один файл.
- Оптимизируйте все свои изображения, насколько это возможно, и посмотрите, сможете ли вы объединить любое из них в один файл, используя спрайты CSS или аналогичные. PunyPNG хорош для изображений без потерь. Приличный кодер JPEG (НЕ Photoshop) хорош для фотографий.
- Переместите CSS в верхнюю часть страницы, а JavaScript - в нижнюю, чтобы браузер мог отобразить страницу до завершения загрузки JavaScript.
- Убедитесь, что все ваши CSS, JavaScript и HTML обслуживаются в сжатом виде.
- Убедитесь, что вы используете соответствующее кэширование - если файл не изменился, нет смысла повторно загружать его.
После того, как вы ушли со стороны клиента, вам, возможно, придется обратить свое внимание на сторону сервера.
Установите кэш кода операции, такой как APC, XCache или Zend Optimizer. Это очень легко сделать и всегда обеспечит некоторое улучшение. Как только вы это сделаете, профилируйте свои страницы, чтобы узнать, где на самом деле тратится время.
Скорее всего, вы будете тратить большую часть времени на ожидание, пока база данных выдаст результаты. Итак, как минимум:
- Определите, какие запросы занимают больше всего времени, и работайте над ними в первую очередь. Впрочем, будьте осторожны - запрос, который занимает пять секунд на странице администратора, на который никто не смотрит, не так важен, как запрос, который занимает одну секунду на первой странице.
- Убедитесь, что в вашем запросе используются соответствующие индексы. Ни один общий запрос не должен выполнять полное сканирование таблицы. Некоторые виды сортировки или группировки могут не использовать индексы - старайтесь избегать их или измените запрос, чтобы он мог использовать индексы.
- Убедитесь, что ваши запросы не используют временные таблицы.
- Используйте ключевое слово EXPLAIN - это очень полезно.
- Настройте сам сервер базы данных. MySQL, как правило, не оптимизирован для производительности.
Как только вы это сделаете, обычно лучше начать понимать, как использовать кэширование. Лучший способ ускорить работу PHP-кода - это сократить объем выполняемой им работы.
- Убедитесь, что кеш запросов вашей базы данных работает правильно.
- Используйте что-то вроде Memcached для хранения часто используемых результатов вместо того, чтобы получать их из базы данных.
- Если у вас достаточно памяти, попробуйте сохранить все в Memcached, прибегая к базе данных, только когда чего-то нет в кэше.
- Если у вас есть фрагменты страниц, которые являются динамическими, но одинаковыми для всех пользователей, попробуйте кэшировать эти фрагменты. Например, если два пользователя просматривают статью, сама статья будет одинаковой для каждого пользователя, даже если остальная часть страницы - нет. Сгенерируйте HTML-код статьи и поместите его в кеш.
- Если у вас много неаутентифицированных пользователей, вполне возможно, что все они будут видеть одну и ту же страницу. Два неаутентифицированных пользователя, просматривающие вышеупомянутую статью, не увидят просто идентичную статью - они увидят идентичную страницу, вплоть до ссылок для входа в систему. Настройте свои PHP-скрипты так, чтобы вы могли использовать заголовки кэширования HTTP (проверьте дату последнего изменения и верните 304 Не изменено, если оно не было изменено) После этого установите обратный прокси-сервер Squid перед веб-сервером и разрешите Squid обслуживать страницы из своего кэша.
После этого общий подход заключается в том, чтобы начать использовать больше серверов, и проблема становится проблемой масштабирования, а не необработанной скорости. Общий план состоит в том, чтобы ваш веб-сайт имел архитектуру без общего доступа - все постоянные данные хранятся в базе данных. Затем вы устанавливаете несколько веб-серверов, перемещаете сервер базы данных на отдельный компьютер и запускаете все это за обратным прокси-сервером кэширования. Чтобы увеличить емкость, добавьте больше машин.