Выбор техники кэширования PHP: кэширование вывода в файлы или кеширование кода операции - PullRequest
8 голосов
/ 28 января 2011

Я слышал о двух методах кэширования для кода PHP:

  1. Когда скрипт PHP генерирует вывод, он сохраняет его в локальных файлах. Когда скрипт вызывается снова, он проверяет, существует ли файл с предыдущим выводом и возвращает ли true содержимое этого файла. В основном это делается с помощью «выходного буфера». Что-то подобное описано в этой статье.

  2. Использование своего рода плагина кэширования кода операции, в котором скомпилированный код PHP хранится в памяти. Самым популярным из них является APC, также eAccelerator.

Теперь вопрос в том, имеет ли смысл использовать оба метода или просто использовать один из них. Я думаю, что первый метод немного сложен и требует много времени для реализации, тогда как второй кажется простым, когда вам просто нужно установить модуль.

Я использую PHP 5.3 (PHP-FPM) в Ubuntu / Debian.

Кстати, есть ли другие методы для кэширования PHP-кода или вывода, о которых я здесь не упоминал? Стоит ли их рассматривать?

Ответы [ 5 ]

7 голосов
/ 28 января 2011

У вас всегда должен быть кэш кода операции, такой как APC. Его цель - ускорить синтаксический анализ вашего кода, и он будет включен в PHP в будущей версии. На данный момент это простая установка на любом сервере и не требует написания или изменения кода.

Однако кэширование кодов операций ничего не делает для ускорения фактического выполнения вашего кода. Ваши узкие места - это обычно время, потраченное на общение с базами данных или чтение с диска. Кэширование вывода вашей программы позволяет избежать ненужного использования ресурсов и может ускорить ответы на несколько порядков.

Вы можете выполнять кэширование вывода разными способами в разных местах стека. Первое, что вы можете сделать, это в своем собственном коде, как вы предложили, путем буферизации вывода, записи его в файл и чтения из этого файла при последующих запросах.

Это все еще требует выполнения вашего PHP-кода при каждом запросе. Вы можете кэшировать вывод на уровне веб-сервера, чтобы пропустить это. Создание набора правил mod_rewrite позволит Apache обслуживать статические файлы вместо кода PHP, когда они существуют, но вам придется заново создавать кэшированные версии вручную или с помощью запланированной задачи, поскольку ваш код PHP не будет работать на каждый запрос сделать это.

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

2 голосов
/ 01 мая 2013

Вы знаете, для меня optcache, filecache ... и т. Д. Используется только для сокращения вызовов базы данных. Они не могут ускорить ваш код. Однако они улучшают загрузку страницы, используя кеш для обслуживания ваших посетителей.

Со мной APC достаточно хорош для VPS или выделенного сервера, когда мне нужно кэшировать виджеты, $ object для сохранения моего сервера MySQL.

Если у меня более 2 серверов, я бы хотел использовать Memcache , они хороши при использовании памяти для кеширования. Однако это зависит от вас, не всем нравится memcached, и не всем нравится APC.

Для кэширования всей веб-страницы я запустил много WordPress и использовал APC, Memcache, Filecache на некоторых плагинах Cache, таких как W3Total Cache. И я вижу (мой собственный опыт): Filecache хорош для кэширования всего сайта, кэш памяти хорош для кэширования $ object

Filecache увеличит ваш процессор, если ваш жесткий диск медленный, и кэш памяти ужасен, если у вас недостаточно памяти на VPS.

Жесткий диск SSD будет очень хорошей скоростью для чтения / записи файла, но память всегда быстрее. Тем не менее, человек не может видеть, в чем разница между этими скоростями. Вы выбираете только один метод для вашего проекта и вашего сервера (RAM, HDD) или вы используете общий веб-хостинг?

Если я на общем хостинге, без прав root, без php.ini, мне нравится использовать phpFastCache , это простой метод кеширования файлов с set, get, stats, delete only.

Кроме того, мне нравится использовать .htaccess для кэширования статических файлов, таких как изображения, js, css или заголовки html. Они помогут посетителям ускорить вашу страницу и сохранить пропускную способность вашего сервера.

И если вы можете использовать .htaccess для перенаправления в статический .html кеш, если вы кешируете целую страницу, это отличная вещь.

В будущем APC или некоторый Optcache будут включены в версию PHP, но я уверен, что весь кэш не может ускорить ваш код, они используют для:

  1. Сокращение вызовов базы данных / запросов.
  2. Повышение скорости загрузки страницы за счет использования кэша.
  3. Сохраните ваши транзакции API (например, Bing) или запрос cURL ...

и т.д ...

0 голосов
/ 09 марта 2012

Я не знаю, сработает ли это на самом деле, но я столкнулся с проблемой производительности при наличии скрипта PHP, который у меня был.У меня есть простой текстовый файл, в котором хранятся данные в виде заголовка и вкладка URL, разделенная каждой записью, разделенной новой строкой.Мой скрипт захватывает файл с каждого URL-адреса и сохраняет его в своей собственной папке.
Затем у меня есть другая страница, которая фактически отображает локальные файлы (в данном случае изображения), и я использую preg_replace(), чтобы изменить вывод каждого из них.линия от удаленного URL к относительному, чтобы он мог отображаться сервером.Мой разделенный табуляцией файл теперь занимает более 1 МБ, и для выполнения preg_replace() требуется несколько секунд, поэтому я решил изучить кэширование вывода.Я не смог найти ничего определенного, поэтому решил, что попробую сам, и вот что у меня получилось:

Когда я запрашиваю страницу для локального просмотра, я пытаюсь прочитать ее спеременная в глобальной области видимости.Если это поле пусто, возможно, это приложение еще не запущено и что глобальные потребности заполнены.Если он был пустым, считайте из выходного файла (обычный HTML-файл, который буквально показывает все для вывода) и сохраните содержимое в глобальной переменной, а затем отобразите выходные данные из глобальной.
Теперь, когда скрипт запускается для обновленияФайл, разделенный табуляцией, обновляет выходной файл и глобальную переменную.Таким образом, часть скрипта, которая фактически выполняет то, что выполняется медленно, запускается только при обновлении данных.

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

Надеюсь, это поможет.

0 голосов
/ 28 января 2011

Да, это две разные методики кэширования, и вы правильно их поняли.

но остерегайтесь 1):

1.) Кэширование сгенерированного вывода в файлы или прокси может привести к проблемам если контент быстро меняется.

2.) X-cache также существует и его легко установить в Ubuntu.

С уважением, / Т

0 голосов
/ 28 января 2011

Часто, когда речь заходит о веб-приложениях PHP, узким местом является база данных.Таким образом, одна из лучших вещей, которую вы можете сделать, это использовать memcached для кэширования результатов в памяти.Вы также можете использовать что-то вроде xhprof для профилирования своего кода и действительно набрать то, что занимает больше всего времени.

...