Кэширование PHP | Losst

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

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

Содержание статьи:

Кэширование PHP

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

  • Кэширование готовых страниц — страница генерируется php, а потом пользователю отдается готовая страница без обращения к php. Я расскажу как это сделать через fastcgi, но не рекомендую применять такой метод для wordpress или других движков, их лучше кэшировать с помощью специальных плагинов;
  • Кэширование байт кода и инструкций — а это уже интересно, кэшируется не вся страница, а только некоторые инструкции, и куски байт кода, которые не изменяются при вызовах скрипта. Перед тем как выполнять скрипт, интерпретатор должен преобразовать его в понятный для него формат, при кэшировании такое преобразование выполняется только первый запуск, а дальше берется версия из кэша;
  • Кэширование сессий — по умолчанию php сохраняет сессии пользователей в файлы и мы можем немного ускорить его работу, если будем сохранять сессии в оперативную память.

Дальше рассмотрим более подробно, как настроить каждый вид кэширования для вашего сервера. Начнем с кэширования opcode php.

Кэширования байткода в PHP

Начиная с PHP 5.5 в интерпретатор языка была добавлена поддержка кэширования байткода из ZendFramework. В новых версиях этот кэш позволяет очень сильно увеличить производительность вашего ресурса, например, есть сведения, что на PHP 7 Wordpres и другие движки работают чуть ли не в два раза быстрее. Перед тем как настраивать кєширование opcode php, нужно установить его пакет:

sudo apt install php-opcache

Или для Red Hat дистрибутивов:

sudo yum install php-opcache

Затем, чтобы включить кэширование нужно добавить несколько строк в php.ini, можно также создать отдельный файл в /etc/php/conf.d/

vi /etc/php.d/opcache.ini

zend_extension=opcache.so;
opcache.error_log=/var/log/php-fpm/opcache-error.log
opcache.enable=1;
opcache.memory_consumption=256;
opcache.interned_strings_buffer=8;
opcache.max_accelerated_files=4000;
opcache.revalidate_freq=180;
opcache.fast_shutdown=0;
opcache.enable_cli=0;
opcache.revalidate_path=0;
opcache.validate_timestamps=2;
opcache.max_file_size=0;
opcache.file_cache= /var/www/losst.ru/opcache;

Рассмотрим что означают эти строки, чтобы вы знали какие значения установить. Первая строка загружает расширение, здесь ничего менять не нужно.

  • opcache.error_log — указывает файл для записи лога ошибок, будет полезно при отладке;
  • opcache.log_verbosity_level — указывает насколько подробным должен быть лог файл, значение от 1 до 4;
  • opcache.enable — включает кэширование;
  • opcache.enable_cli — включает кэширование страниц php для консольной версии;
  • opcache.memory_consumption — количество оперативной памяти для хранения кэша;
  • opcache.max_accelerated_files — число скриптов/файлов, которые нужно кэшировать;
  • opcache.validate_timestamps — проверять время изменения данных в файле скрипта;
  • opcache.revalidate_freq — частота проверки для предыдущего параметра;
  • opcache.revalidate_path — установите в 0 чтобы выполнять проверку при include только первый раз;
  • opcache.enable_file_override — кэширует запросы к атрибутам файлов, например, существование и т д;
  • opcache.blacklist_filename — список файлов, которые не нужно кэшировать;
  • opcache.max_file_size — максимальный размер файла скрипта для кэширования, 0 — не ограниченно;
  • opcache.interned_strings_buffer — допустимое количество строк в буфере;
  • opcache.fast_shutdown — использовать быстрый способ освобождения памяти.

После сохранения всех настроек вам останется только перезапустить php или ваш веб-сервер:

systemctl restart php-fpm

Для того чтобы убедиться, что все работает вы можете захотеть посмотреть какие скрипты уже закэшированы. Для этого можно использовать скрипт opcache-status. Просто сохраните скрипт в директорию веб-сервера, а затем дайте ему права:

chmod 777 /var/www/losst.ru/opcode.php

Дальше можно открыть скрипт в браузере для просмотра статистики:

http://localhost/opcache.php

Здесь можно видеть подробную статистику по кєширвоанию, настройки и количество занятой памяти.

Хранение сессий в memcached

По умолчанию php хранит сессии в файловой системе, в некоторых случаях, вы можете достаточно сильно ускорить работу php, если перенесете хранение сессий из файлов в оперативную память, например, memcached. Сначала нужно установить memcached и php библиотеку для работы с ней:

sudo apt install memcached php-memcached

Или для систем на базе Red Hat:

sudo yum install memcached php-memcached

Сначала нам нужно настроить memcached, откройте файл /etc/sysconfig/memcached и найдите строку CACHESIZE, здесь нужно указать объем оперативной памяти, которая выделяется под кэш:

vi /etc/sysconfig/memcached

CACHESIZE=256

Дальше осталось указать php использовать memcached для хранения сессий:

vi /etc/php.ini

session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

Осталось перезапустить ваш php интерпретатор:

systemctl restart php-fpm

Если вы хотите проверить все ли правильно кэшируется и есть ли вообще что-либо в кэше, можно использовать phpmemcacheadmin.

Кэширование страниц fastcgi

Я не советую использовать кэширование fastgci для сайтов WordPress, потому что там есть специальные плагины, которые могут точно контролировать кэш, очищать его когда нужно и вовремя обновлять. Но во всех остальных случаях кэш fastcgi может очень сильно ускорить работу сайта. Настраивается он в конфиге, где вы включаете fastgci, например, в конфигурации веб-сервера Nginx. Минимально для настройки кэша fastgci достаточно добавить в блок server такие строки:

vi /etc/nginx/vhosts/site.conf

fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

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

Теперь нужно настроить блок обработки php:

location ~ \.php$ {
fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;
}

Здесь мы обращаемся к уже настроенной зоне памяти MYAPP, а также указываем время жизни кэша в один час. Для проверки кэширования можно посмотреть содержимое папки:

ls -lR /var/nginx/cache/

С помощью таких методов ваши страницы будут загружаться намного быстрее. Если вам понадобится отключить кєширование php для отдельных страниц, то сначала создаем переменную no_cache со значением 0:

set $no_cache 0;

Затем проверяем нужные параметры, и если соответствует, то устанавливаем значение в 1:

if ($request_method = POST)
{
set $no_cache 1;
}

И на завершение передаем значение этой переменной таким директивам, это отключит кэширование когда не нужно:

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

Не забудьте перезапустить Nginx перед тем как проверять:

systemctl restart nginx

Выводы

В этой статье мы рассмотрели как настроить кэширование php скриптов, разобрали виды кэширования, кэширование opode php, а также как все это работает. Надеюсь, эта информация была полезной для вас.

Оцените статью:

Загрузка…

losst.ru

Методы кэширования объектов PHP в файл? PHP Lang

Сериализация вполне безопасна и широко используется. Однако есть альтернатива, и это необходимо для кэширования в память. Проверьте memcached и APC , они оба свободны и высокоэффективны. Эта статья о различных методах кэширования в PHP также может представлять интерес.

Re: Есть ли другой метод persist-to-file, который я забываю?

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

Re [2]: Сохраняется ли файл в безопасности? и дешевый общий хостинг-аккаунт)

Печальный факт – дешевый общий хостинг не безопасен. Насколько вы доверяете 100 500 или 1000 другим людям, имеющим доступ к вашему серверу? По историческим и (по иронии) причинам безопасности в общедоступных средах хостинга PHP / Apache работает как непривилегированный пользователь (с PHP работает как модуль Apache). Рациональность безопасности здесь заключается в том, что если мир сталкивается с процессом apache, он становится уязвимым, эксплуататоры имеют доступ только к непривилегированной учетной записи, которая не может подключаться к важным системным файлам.

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

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

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

ruphp.com

выходное кэширование в кеширование файлов и операций PHP Lang

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В будущем APC или некоторые Optcache будут связаны с PHP-версией, но я увере

ruphp.com

php — Методы кэширования объектов PHP в файл?

Re: Есть ли еще один метод persist-to-file, который я забыл?

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

Re: Сохраняется ли файл в безопасности? и дешевый общий хостинг-аккаунт)

Печальный факт — дешевый общий хостинг не безопасен. Насколько вы доверяете 100 500 или 1000 другим людям, имеющим доступ к вашему серверу? По историческим и (по иронии) причинам безопасности в общедоступных средах хостинга PHP/Apache работает как непривилегированный пользователь (с PHP работает как модуль Apache). Радикальность безопасности заключается в том, что если мир сталкивается с процессом apache, он становится уязвимым, эксплуататоры имеют доступ только к непривилегированной учетной записи, которая не может вставлять важные системные файлы.

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


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

Наконец, вы можете думать, что неизвестность спасает вас. «Там нет способа узнать, где мои секретные файлы кеша», но вы ошибаетесь. Общий хостинг настраивает пользователей в одной группе, и большинство файлов по умолчанию для файлов будут давать пользователям вашей группы разрешение на просмотр создаваемых вами файлов. SSH в свою учетную запись хостинга, перейдите по каталогу, и обычно вы можете начать просмотр других файлов пользователей в системе. Это можно использовать для обнуления записываемых файлов.

Решения не очень хороши. Некоторые хосты будут предлагать CGI Wrapper, который позволяет запускать PHP как CGI. Преимущество здесь заключается в том, что PHP будет работать как владелец script, что означает, что он будет работать как вы вместо непривилегированного пользователя. Проблема была предотвращена! Новая проблема! Традиционный CGI медленный, как меласса в феврале.

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

qaru.site