Недавно я некоторое время работал над оптимизацией производительности программы, и у меня есть интересная идея, которой я хотел бы поделиться с вами.
Кэш — это типичный режим применения стратегии «пространство-время» и важный метод повышения производительности системы. Использование кэша позволяет значительно сократить количество операций с базой данных в случае больших объемов доступа, существенно снижая нагрузку на систему и повышая ее производительность. По сравнению с кэшированием страниц результирующий набор представляет собой своего рода «необработанные данные», которые не содержат информации о формате. Объем данных относительно невелик и может быть снова отформатирован, поэтому он достаточно гибок. Поскольку PHP — это язык сценариев, который «компилируется и выполняется одновременно», он также предоставляет в определенной степени очень удобный метод использования кэширования набора результатов — использование кэша путем динамического включения соответствующего сегмента кода определения данных. Если кеш построен на «RamDisk», эффективность должна быть повышена еще больше. Ниже приведен небольшой пример кода для справки.
// загружаем данные из кеша
функция load_data($id,$cache_lifetime) {
// возвращаемые данные
$данные = массив();
// создаем имя файла кэша
$cache_filename = 'cache_'.$id.'.php';
// проверяем время последнего изменения файла кэша
$cache_filetime = filemtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** срок действия кеша не истек
включить ($cache_filename);
} еще {
//** срок действия кеша истек
// загружаем данные из базы данных
// ...
while ($dbo->nextRecord()) {
// $данные[] = ...
}
// форматируем данные как файл php
$data_cache = "
while (список($ключ, $val) = каждый($данные)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NAME'=>"".qoute($val['NAME'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// сохраняем данные в файл кэша
if ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
вернуть $данные;
}
?>
Применимые ситуации:
1. Данные относительно стабильны, в основном операции чтения.
2. Операции с файлами выполняются быстрее, чем операции с базой данных.
3. Сложный доступ к данным, доступ к большим объемам данных, интенсивный доступ к данным и чрезвычайно большая нагрузка на базу данных системы.
4. Структура разделения Интернет/БД или структура единой базы данных с несколькими веб-сайтами.
Неподтвержденный вопрос:
1. Приведет ли чтение и запись файлов во время одновременного доступа к проблемам блокировки.
2. Какова производительность, если задействовано слишком много файлов данных?
Идеи расширения:
1. Создайте код определения данных JavaScript и вызовите его на клиенте.
2. Еще не подумал об этом…
Надеюсь обсудить вместе.
кэш
Если вы хотите повысить производительность своего огромного PHP-приложения, использование кэширования также является хорошим способом. Доступно множество решений для кэширования, в том числе Zend Cache, APC и Afterburner Cache.
Все эти продукты представляют собой «модули кэширования». Когда впервые происходит запрос файла .php, они сохраняют промежуточный код PHP в памяти веб-сервера, а затем отвечают на последующие запросы «скомпилированной» версией. Такой подход действительно может улучшить производительность приложения, поскольку сводит к минимуму доступ к диску (код читается и анализируется), а код выполняется непосредственно в памяти, благодаря чему сервер реагирует на запросы намного быстрее. Конечно, модуль кэширования также будет отслеживать изменения в исходных файлах PHP и при необходимости повторно кэшировать страницу, тем самым не позволяя пользователю получать страницы, которые все еще сгенерированы устаревшим кодом PHP. Поскольку модули кэширования позволяют значительно снизить нагрузку на сервер и повысить эффективность отклика PHP-приложений, они очень подходят для веб-сайтов с большой нагрузкой.
Как выбрать эти продукты для кэширования
Zend Cache — это коммерческое программное обеспечение от Zend Technologies, компании, упомянутой ранее, которая предоставляет нам движок PHP и бесплатный оптимизатор Zend. Zend Cache действительно заслужен! Для больших страниц PHP вы можете почувствовать, что скорость увеличится после первого запуска, и у сервера будет больше доступных ресурсов. К сожалению, этот продукт не бесплатен, но в некоторых случаях он все же может оказаться очень полезным.
Afterburner Cache — бесплатный модуль кэширования от Bware Technologies. В настоящее время этот продукт находится в бета-версии. Afterburner Cache похож на Zend Cache, но он не повышает производительность так сильно, как Zend Cache (пока), и не работает с Zend Optimizer.
APC — это аббревиатура Alternative PHP Cache, еще одного бесплатного модуля кэширования от Community Connect. Продукт уже достаточно стабилен для формального использования и, похоже, значительно повышает скорость ответа на запросы.
О сжатии
Бесплатный модуль Apache mod_gzip от Remote Communications позволяет сжимать статический веб-контент для браузеров, поддерживающих этот тип кодирования контента. Для подавляющего большинства статического веб-контента mod_gzip работает очень хорошо. mod_gzip можно легко скомпилировать в Apache, а также использовать в качестве DSO. По данным Remote Communications, mod_gzip также может сжимать динамический контент из mod_php, mod_perl и т. д. Я пробовал снова и снова, но, похоже, это не сработало. Я прочитал много форумов и статей о mod_gzip, и кажется, что эта проблема будет решена в следующей версии mod_gzip (вероятно, 1.3.14.6f). До тех пор мы можем использовать mod_gzip в статических частях сайта.
Однако иногда нам действительно не хочется сжимать динамический контент, поэтому приходится искать другие способы. Один из способов — использовать class.gzip_encode.php, класс PHP, который можно использовать для сжатия содержимого страницы путем вызова определенных функций класса в начале и конце сценария PHP. Если вы хотите реализовать это решение на уровне веб-сайта, вы можете вызвать эти функции из директив auto_prepend и auto_append в файле php.ini. Хотя этот метод эффективен, он, несомненно, увеличивает нагрузку на веб-сайты с высокой нагрузкой. Подробные инструкции по использованию этого класса см. в его исходном коде. Описание исходного кода довольно полное, и автор рассказывает вам все, что вам нужно знать.
В PHP 4.0.4 появился новый обработчик выходного кэша ob_gzhandler, который похож на предыдущий класс, но имеет другое использование. При использовании ob_gzhandler в php.ini необходимо добавить следующее содержимое:
выходной_обработчик = ob_gzhandler;
Эта строка кода заставляет PHP активировать кэширование вывода и сжимать все, что он отправляет. Если по какой-то причине вы не хотите добавлять эту строку кода в php.ini, вы также можете изменить поведение сервера по умолчанию (без сжатия) через файл .htaccess в каталоге, где находится исходный файл PHP. Синтаксис. заключается в следующем:
php_value output_handler ob_gzhandler
Или вызовите его из PHP-кода следующим образом: ob_start("ob_gzhandler");
Метод использования дескрипторов выходного кэша действительно очень эффективен и не создает особой нагрузки на сервер. Однако следует отметить, что Netscape Communicator плохо поддерживает сжатую графику, поэтому, если вы не можете гарантировать, что все пользователи используют браузер IE, вам следует отключить сжатую графику JPEG и GIF. В целом такое сжатие работает для всех остальных файлов, но рекомендуется тестировать его отдельно для каждого браузера, особенно если вы используете специальные плагины или просмотрщики данных. Это особенно важно.