Оптимизация

Cache Engine

Один из способов оптимизации работы сервера - это кэширование,оно позволяет пропускать код в некоторых маршрутах ,а также не обрабатывать шаблоны повторно. Вы можете включить кэширование, указав третий аргумент методу $f3→route(). Просто задайте количество секунд до истечения срока действия кэшированной веб-страницы:

$f3->route('GET /my_page','App->method',60);

В этом примере, когда F3 видит, что к URL /my_page обращаются в первый раз, он выполняет обработчик маршрута, представленный вторым аргументом, и сохраняет все выходные данные браузера во встроенный кэш фреймворка (на стороне сервера). Аналогичная инструкция автоматически отправляется в веб-браузер пользователя (на стороне клиента), так что вместо отправки идентичного запроса на сервер в течение 60-секундного периода браузер может просто получить страницу локально. Фреймворк использует кэш для совершенно другой цели - для обслуживания кэшированных фреймворком данных другим пользователям, запрашивающим ту же веб-страницу в течение 60 секунд. Он пропускает выполнение обработчика маршрута и обслуживает ранее сохраненную страницу прямо с диска. Когда кто-то пытается получить доступ к тому же URL-адресу по истечении 60-секундного таймера, F3 обновит кэш с новой копией.

Веб-страницы со статическими данными нужно кэшировать в первую очередь. Fat-Free не будет кэшировать веб-страницу по указанному URL-адресу, если третий аргумент в $f3→route() методе равен нулю или не указан . F3 следует правилам HTTP: кэшировать можно только запросы GET и HEAD.

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

Например, вы проектировали свой сайт таким образом , что все веб-страницы имеют опции меню: «Home», «About Us» и «Login»,которые отображаются , когда пользователь не вошел в ваше приложение. Вы также хотите поменять пункты меню на: «Home», «About Us», и «Logout», как только пользователь вошел в систему. Если вы прописали команду кэшировать содержимое страницы «About Us» , F3 кэширует страницу , а также передает ту же самую инструкцию HTTP-клиенту, независимо от состояния сеанса пользователя ,т.е. находится пользователь в учетной записи на сайте или нет, браузер пользователя сделает снимок страницы в том состоянии сеанса, в котором он находился. Последующие запросы пользователя на страницу «About Us» ,до истечения тайм-аута кеша , будут отображать те же пункты меню, которые были в момент записи кэша. Теперь пользователь, возможно, уже вошел в систему, но пункты меню остаются такими же. Это явно не то что мы хотим от нашего приложения.

Более того, при использовании включенных файлов в кэшированных файлах, например require_once('../inc/account_header.php'), используемые относительные пути больше не будут работать, поскольку кэшированные файлы не хранятся в каталоге исходных файлов. Вам нужно будет либо указать полный путь к вашим включенным файлам; или скажите F3 хранить кэшированные файлы в каталоге, который может найти php; или добавьте путь, по которому хранятся кэшированные файлы, в путь включения php (это можно сделать в файле php.ini).

Некоторые рекомендации:

  • Не кэшируйте динамические страницы. Совершенно очевидно, что вы не хотите кэшировать часто меняющиеся данные. Однако вы можете активировать кэширование на страницах, которые содержат данные, обновляемые ежечасно, ежедневно или даже ежегодно. В целях безопасности структура ограничивает использование механизма кэширования GET только маршрутами HTTP . Он не будет кэшировать отправленные формы! Не активируйте кэш на веб-страницах, которые на первый взгляд выглядят статичными. В нашем примере контент «About Us» может быть статичным, а меню - нет.
  • Активируйте кэширование на страницах, которые доступны только в ОДНОМ состоянии сессии. Если вы хотите кэшировать страницу «About Us», убедитесь, что она доступна только тогда, когда пользователь не вошел в систему.
  • Если у вас RAM диск или SSD диск, настройте CACHE так, чтобы он указывал на этот диск. Это многократно увеличит производительность сайта.

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

Для правильной работы механизма кэширования F3 необходимо правильно настроить PHP. Часовой пояс вашей операционной системы должен быть синхронизирован с параметром date.timezone в php.ini файле.

Подобно маршрутам, Fat-Free также позволяет кэшировать запросы к базе данных. Прирост скорости может быть весьма значительным, особенно при использовании сложных операторов SQL, которые включают поиск статических данных или содержимого базы данных, которое редко изменяется. Пример активации кэширования запросов к базе данных,время жизни кэша устанавливается в 3 параметр:

$db->exec('SELECT * from sizes;',NULL,86400);

Если мы ожидаем, что результат запроса к базе данных , будет всегда Small, Medium и Large в течение 24-часового периода, мы задаем второй аргумент - 86400,таким образом F3 не будет выполнять запрос более одного раза в сутки. Вместо этого платформа сохранит результат в кэше и будет извлекать его из кеша каждый раз, когда поступает запрос в течение указанного 24-часового периода, и повторно выполнять запрос, когда таймер истечет.

SQL mapper также использует механизм кэширования для оптимизации синхронизации структур таблиц с объектами, которые отображаются в них. По умолчанию - 60 секунды. Если вы вносите какие-либо изменения в структуру таблицы в ядре базы данных, вам придется подождать, пока истечет время таймера кэширования, прежде чем вы увидите изменения в своем приложении. Вы можете изменить это , указав третий аргумент конструктору mapper'а. Установите большое значение, если вы не ожидаете дальнейших изменений в структуре таблицы.

$user=new DB\SQL\Mapper($db,'users',NULL,86400);

По умолчанию механизм кэширования Fat-Free отключен. Вы можете включить его и позволить ему автоматически определять APC, WinCache или XCache. Если не удается найти подходящий бэкэнд, F3 будет использовать файловую систему, то есть tmp/cache/папку:

$f3->set('CACHE',TRUE);

Отключить кэш просто:

$f3->set('CACHE',FALSE);

Если вы хотите переопределить функцию автоопределения, вы можете сделать это - как в случае с серверной частью Memcached, которую также поддерживает F3:

$f3->set('CACHE','memcache=localhost:11211');

Вы также можете использовать механизм кэширования для хранения ваших собственных переменных. Эти переменные будут сохраняться между HTTP-запросами и оставаться в кэше, пока движок не получит инструкции по их удалению. Чтобы сохранить значение в кэше:

$f3->set('var','I want this value saved',90);

Третий аргумент метода $f3→set() указывает платформе сохранить переменную в кэше на 90 секунд. Если ваше приложение выполняет $f3→get('var')в течение этого периода, F3 автоматически извлечет значение из кэша. Таким же образом $f3→clear('var') очистит значение как из кэша, так и из ОЗУ. $f3→ exists ('var') возвращает TRUE или FALSE, когда переменная установлена в кэше или не установлена.

Javascript и CSS

Fat-Free также имеет compressor Javascript и CSS, доступный в веб-плагине . Он может объединить все ваши файлы CSS в одну таблицу стилей и все ваши файлы Javascript в один скрипт, чтобы значительно сократить количество HTTP-запросов, необходимых для веб-страницы. Уменьшение количества HTTP-запросов к вашему веб-серверу приводит к более быстрой загрузке страницы и лучшему UX.

Для реализации этого, вам сначала нужно подготовить шаблоны HTML.

Для CSS вы можете сделать так:

<link rel="stylesheet" type="text/css" href="/minify/css?files=typo.css,grid.css" />

И сделайте то же самое с вашими файлами Javascript:

<script type="text/javascript" src="/minify/js?files=dialog.js,main.js"></script>

Также,нам нужно настроить маршрут для обработки необходимого вызова compressor Fat-Free CSS / Javascript:

$f3->route('GET /minify/@type',
	function($f3, $args) {
		$path = $f3->get('UI').$args['type'].'/';
		$files = preg_replace('/(\.+\/)/','',$_GET['files']); // close potential hacking attempts  
		echo Web::instance()->minify($files, null, true, $path);
	},
	3600*24
);
 
// @type will make `PARAMS.type` variable base point to the correct path
// make sure you organize your files to be minified into sub-folders, per type, i.e. /ui/css/ /ui/js
// minify will grab each file specified in the querystring var named 'files' and combine into 1 output
// Save the minified file in F3 cache for 24 hours. future requests for this route will use cached version

Предупреждение! Вы должны убедиться, что $_GET['files'] проверен и не содержит символов ../, которые потенциально могут открыть брешь безопасности в вашем приложении. Это было исправлено в v3.5.2, но в любой более ранней версии вам придется следить за этим самостоятельно.

Что будет делать наша программа: minify() читает каждый файл ( typo.css и grid.css в нашем примере CSS, dialog.js и main.js в нашем примере Javascript), удаляет все ненужные пробелы и комментарии, объединяет все связанные элементы в один компонент веб-страницы и прикрепляет дату истечения срока действия , чтобы веб-браузер пользователя кэшировать данные и не трогал сервер при каждом URL запросе. Важно, чтобы PARAMS.type указывала правильный путь. Иначе, механизм перезаписи URL внутри compressor'а не найдет файлы CSS / Javascript.

Кэширование на стороне клиента

В наших примерах платформа отправляет дату истечения срока действия в веб-браузер клиента, поэтому любой запрос того же файла CSS или Javascript будет использовать кэшированную версию из памяти компьютера пользователя. Когда на веб-сервер делается запрос файла, F3 проверяет, был ли уже кэширован маршрут (в этом примере файлы CSS или Javascript). В приведенном выше примере, указанный нами маршрут , имеет период обновления кеша в 3600 секундах (1 час), умноженный на 24, что составляет 24 часа. Кроме того, если веб-браузер отправляет заголовок If-Modified-Since , а платформа видит, что кэш не изменился, F3 просто отправляет ответ HTTP 304 Not Modified, поэтому пропускная способность не тратится, и содержимое загружается быстрее. Без заголовка If-Modified-Since Fat-Free отправляет кэшированный файл, если он доступен. В противном случае код маршрута выполняется с каждым запросом.

Совет: если вы не часто изменяете свои файлы Javascript / CSS (как это было бы, если бы вы использовали библиотеку Javascript, такую как jQuery, MooTools, Dojo и т. Д.), подумайте о добавлении таймера кэширования к маршруту, который ведет к Javascript/CSS (3-й аргумент F3::route()), так Fat-Free не должен будет сжимать и объединять эти файлы каждый раз при получении запроса.

Ускорение кода PHP

Хотите, чтобы ваш сайт работал еще быстрее? Fat-Free лучше всего работает с альтернативным PHP Cache (APC), XCache или WinCache. Эти расширения PHP повышают производительность вашего приложения за счет оптимизации ваших скриптов PHP (включая код фреймворка).

Настройка полосы пропускания

Быстрое приложение, которое обрабатывает все HTTP-запросы и отвечает на них в кратчайшие сроки, не всегда хорошая идея, особенно если ваша пропускная способность ограничена или трафик на вашем веб-сайте очень большой. Быстрое обслуживание страниц также делает ваше приложение уязвимым для DDoS-атак. F3 имеет функцию регулирования полосы пропускания, которая позволяет вам контролировать скорость обслуживания ваших веб-страниц. Вы можете указать полосу пропускания, которая будет использоваться при обслуживании запроса, с такими определениями маршрута:

$f3->route('GET /login','\Backoffice\Login->handler', 0, 64);

В этом примере платформа будет обслуживать запросы GET /login для входа в систему с максимальной скоростью 64 КБ / с ( 64 * 1024байтов в секунду).

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

Печать/экспорт