PHP, MySql, уроки PHP, SEO статьи - Arts-UP.ru

Мини профиль

Регистрация | Забыли?

Наша кнопка

Arts-UP.ru - создание и продвижение

Пользователи онлайн

Пользователи: 
- нет
Гости: 

Роботы: 
- нет
Всего: 1

Друзья

Оптимизация - кеширование на php

Оптимизация - кеширование на php

Всё равно когда нибудь придётся всё таки учится уменьшать нагрузку на базу данных mysql используя файловое кеширование на php. Расскажу и покажу что как делать чтобы работало.

Разберёмся с частью конфигурации

//настроки кеша
$cfg = array(
'base_dir' =>'./cache/',
'cache_name' => '.tmp'
);

Ключ base_dir содержит в себе путь в папке с кешироваными данными.
cache_name содержит расширение файла.


Напишем функцию которая будет создавать и заносить в кеш данные
function set_cache ( $folder = '' , $file = '' , $cache = '' ) {
    global $cfg;
    $error = 'ok';
     // Если переменная $folder содержит несуществующие папку, создадим её
     if( !@file_exists($cfg['base_dir'].$folder) ){
    @mkdir($cfg['base_dir'].$folder);
     }
     // открываем файл для записи, если нет то создаём выставив маркер "w"
     $openTmp = @fopen( $cfg['base_dir'].$folder."/".$file.$cfg['cache_name'] , "w" );
     if (!$openTmp) {
        $error = "fopen" ;
     }
     // записываем наши данные в файл открытый ранее
     $writeCache = @fwrite($openTmp, $cache);
     if (!$writeCache) {
        $error = "fwrite" ;
     }
     // Сохраняем и закрываем файл кеша
     @fclose($openTmp);

     return $error;
}


Функция PHP для чтения данных из кеша.
function get_cache ( $folder = '' , $file = '' ) {
     global $cfg;
     // Если кеш файла или папки не существует, покажим ошибку
     if( !@file_exists($cfg['base_dir'].$folder) || !@file_exists($cfg['base_dir'].$folder."/".$file.$cfg['cache_name']) ){
         return 0;
     }else{
       return file_get_contents( $cfg['base_dir'].$folder."/".$file.$cfg['cache_name'] );
     }
}

И функция PHP для удаления кеш (Выполняется для обновления данных).
function del_cache( $folder = '' , $file = '' ){
    global $cfg;
     $error = 'ok';
     // Полное удаление каталога и кеш файла
     if( !@unlink($cfg['base_dir'].$folder."/".$file.$cfg['cache_name']) ){
    $error = "no delete file cache" ;
     }elseif( !@rmdir($cfg['base_dir'].$folder) ){
    $error = "no delete folder" ;
     }
     return $error;
}


Теперь всё это мы соберём вместе и вставим в созданный файл cache.php
<?php
//настроки кеша
$cfg = array(
'base_dir' =>'./cache/',
'cache_name' => '.tmp'
);
// напишем пользовательскую функцию создания кеша
function set_cache ( $folder = '' , $file = '' , $cache = '' ) {
    global $cfg;
    $error = 'ok';
     // Если переменная $folder содержит несуществующие папку, создадим её
     if( !@file_exists($cfg['base_dir'].$folder) ){
    @mkdir($cfg['base_dir'].$folder);
     }
     // открываем файл для записи, если нет то создаём выставив маркер "w"
     $openTmp = @fopen( $cfg['base_dir'].$folder."/".$file.$cfg['cache_name'] , "w+" );
     if (!$openTmp) {
        $error = "fopen" ;
     }
     // записываем наши данные в файл открытый ранее
     $writeCache = @fwrite($openTmp, $cache);
     if (!$writeCache) {
        $error = "fwrite" ;
     }
     // Сохраняем и закрываем файл кеша
     @fclose($openTmp);

     return $error;
}
function get_cache ( $folder = '' , $file = '' ) {
     global $cfg;
     // Если кеш файла или папки не существует, покажим ошибку
     if( !@file_exists($cfg['base_dir'].$folder) || !@file_exists($cfg['base_dir'].$folder."/".$file.$cfg['cache_name']) ){
         return 0;
     }else{
       return file_get_contents( $cfg['base_dir'].$folder."/".$file.$cfg['cache_name'] );
     }
}
function del_cache( $folder = '' , $file = '' ){
    global $cfg;
     $error = 'ok';
     // Полное удаление каталога и кеш файла
     if( !@unlink($cfg['base_dir'].$folder."/".$file.$cfg['cache_name']) ){
    $error = "no delete file cache" ;
     }elseif( !@rmdir($cfg['base_dir'].$folder) ){
    $error = "no delete folder" ;
     }
     return $error;
}

// создадим тестовый кеш файл
//set_cache( 'test_folder' , 'name_file_cache' , 'содержимое файлового кеша' ); // создание кеша
//echo get_cache( 'test_folder' , 'name_file_cache' ); // чтение кеша
//del_cache( 'test_folder' , 'name_file_cache' ); // Удаление
?>


Для использования можно просто подключить его с помощью include.
include "./cache.php" ;

Примеры использования пользовательский функций PHP.

Создание кеша и занесение в него данных
set_cache( 'папка' , 'файл' , 'данные' );

Если кеш создан функция вернёт "ok", если нет то вернёт текст ошибки.

Чтение кеша
get_cache( 'папка' , 'файл' );

Если кеш найден функция вернёт данные из этого кеш файла, если нет то вернёт 0.

Полное удаление кешированых данных
set_cache( 'папка' , 'файл' , 'данные' );

Если кеш удалён функция вернёт "ok", если нет то вернёт текст ошибки.
Внимание! При удалении функция удаляет папку и файл.





Примеры использования кеширования на PHP.

Кеширование данных из базы данных mysql.

Кешировать данные разумно использовать на сильно нагруженных проектах.
Для примера взял таблицу с курсом валют.
Запроса в базу данных и вывод в браузер пользователю без кеширования выглядит так.
<?php
// Запрос в базу данных
        $result = @mysql_query( "SELECT * FROM currency" );
        // Сбор данных в одну переменную
        $echo .= "<table><tr><td>Название</td><td>Сокр.</td></tr>\n" ;
        while( $value = @mysql_fetch_assoc( $result ) ) {
            $echo .= "<tr><td>{$value['name']}</td><td>{$value['code']}</td></tr>\n" ;
        }
        $echo .= "</table>" ;
        // Вывод информации в браузер
        echo $echo;
?>

При этом один запрос уже сделан и если одновременно на сайте будут запрашивать информацию сразу 10 пользователей, то это значит что в базу попадает 10 запросов.
Правильно ли это?
Думаю что нет. Совершенно малость подправив код он начал кешировать данные из базы данных.

Вот пример уже кешированого запроса к базе данных.
<?php
// Подключаем наш файл кеша для работы с функциями
    @include_once "./cache.php" ;
  
    // Проверяем есть ли кешированые данные
    $cache_date = get_cache( 'modules' , 'currency' );

    // проверка условием. Если данных нет в кеше получаем данные из базе
    if($cache_date == "0"){
        // Запрос в базу данных
        $result = @mysql_query( "SELECT * FROM currency" );
        // Сбор данных в одну переменную
        $echo .= "<table><tr><td>Название</td><td>Сокр.</td></tr>\n" ;
        while( $value = @mysql_fetch_assoc( $result ) ) {
            $echo .= "<tr><td>{$value['name']}</td><td>{$value['code']}</td></tr>\n" ;
        }
        $echo .= "</table>" ;
        // Вывод информации в браузер
        echo $echo;
        // Заносим данные в кеш
        set_cache( 'modules' , 'currency' , $echo );
    }else{
        // Если кеш есть то получаем данные из него и выводим их
        echo get_cache( 'modules' , 'currency' );
    }
?>


Скачать исходники урока [1.9 Kb]

Свои мысли и предложения отправляйте комментарии.
Урок PHP "Оптимизация - кеширование на php" подготовлен сайтом Arts-UP.ru



Теги: error, folder, return, global, cache, get_cache, функция, delete, result, writeCache, fopen, openTmp, file_exists, файл кеша, php, кеширование на php, кеширование, файловое кеширование, mysql, функция, функция PHP

Раздел: Уроки PHP
Дата: 18-01-2012, 20:20 | Добавил: WorldPad | Читали: 404  |  

Другие новости по теме:

Комментарии:

Оставить комментарий
Имя:*
E-Mail:
Введите код: *

Опрос

Как давно вы программируете на PHP?

только начал
около месяца
больше года
очень давно

 

Поисковая статистика

↓ Апдейты Яndex тИЦ
13.04.2012
16.02.2012
04.02.2012
↓ Апдейты выдачи Яndexa
17.05.2012
15.05.2012
12.05.2012
↓ Апдейты ЯКаталога
18.05.2012
16.05.2012
11.05.2012