Кешируем SQL запросы

Кешируем SQL запросы, пишем в файлы и увеличиваем скорость работы скрипта, так же снижаем нагрузку на сервер MySQLПример использования кеша…

И так, стандартный запрос допустим вывода новостей выглядит так

<?
$sql="select * from tb_news order by id desc limit 1";
$res=mysql_query($sql);
$row=mysql_fetch_array($res);

echo $row["data"];
echo $row["newstext"];
?>


Ничего особого, постоянная нагрузка на MySQL, ну да ладно.

Теперь покажу как выглядит мой запрос (именно кеш):

<?
$sql="select * from tb_news order by id desc limit 1";
$res=new MySQLCache($sql, 300); // 300 это секунды кеша
$row=$res->fetch_assoc();

echo $row["data"];
echo $row["newstext"];
?>


Теперь объясняю в чем суть, если кто-то не понял.

В стандартном запросе мы имеем эту хрень (так понятней все будет):


$res=mysql_query($sql);
$row=mysql_fetch_array($res);


А в моем же мы имеем это:

$res=new MySQLCache($sql, 300); // 300 это секунды кеша
$row=$res->fetch_assoc();


Убран постоянный запрос к базе и выполнения операции намного стало быстрей.

Но для этого нужно подключить класс. И так, для начала поставьте этот инклуд в header.php:

include("cache_sql.php");


Предварительно создав сам файл.

И засунуть туда этот код для работы кеша:

<?php
class MySQLCache{
   var $CachePath = 'cache_data/'; //Папка куда будет записываться кеш запросов
   var $PeakFilename = 'speed_site.log'; //Логистика (Скорость дата)
   var $Debug = true;
   var $FromCache = false;
   var $DataDate = 0;
   var $errno = 0;
   var $error = '';
   var $Peak = array
   (
      0,
      '',
      '',
      '',
   );
   var $NextRowNo = 0;
   var $ResultData = array
   (
      'fields' => array(),
      'data' => array(),
   );
   function MySQLCache($query, $valid = 10)
   {
      if ($this->CachePath == '')
      {
         $this->CachePath = dirname(__FILE__);
      }
      $query = trim($query);

      //if (!eregi('^SELECT', $query))
      //{
      //return mysql_query($query);
      //}

      $filename = $this->CachePath . '/' . md5($query) . '.txt';
      if ((@$file = fopen($filename, 'r')) && filemtime($filename) > (time() — $valid))
      {
         flock($file, LOCK_SH);
         $serial = file_get_contents($filename);
         $this->ResultData = unserialize($serial);
         $this->DataDate = filemtime($filename);
         $this->FromCache = true;
         fclose($file);
         return true;
      }
      if ($file)
      {
         fclose($file);
      }
      $time_start = microtime(true);
      @ $SQLResult = mysql_query($query);
      $time_end = microtime(true);
      $this->DataDate = time();
      $time_exec = $time_end — $time_start;
      if (!$SQLResult)
      {
         if ($this->Debug)
         {
            die('Error from query "' . $query . '": ' . mysql_error());
         }
         else
         {
            $this->errno = mysql_errno();
            $this->error = mysql_error();
            return false;
         }
      }
      $peak_filename = $this->CachePath . '/' . $this->PeakFilename;
      if (@$file = fopen($peak_filename, 'r'))
      {
         flock($file, LOCK_SH);
         $fdata = file($peak_filename);
         foreach ($fdata as $key => $value)
         {
            $this->Peak[$key] = trim($value);
         }
         $this->Peak[0] = floatval($this->Peak[0]);
      }
      if ($file)
      {
         fclose($file);
      }
      if ($time_exec > $this->Peak[0])
      {
         $this->Peak = array
         (
            $time_exec,
            date('r'),
            $query,
            $_SERVER['SCRIPT_FILENAME'],
         );
         $file = fopen($peak_filename, 'w');
         flock($file, LOCK_EX);
         fwrite($file, implode("n", $this->Peak));
         fclose($file);
      }
      $nf = mysql_num_fields($SQLResult);
      for ($i = 0; $i < $nf; $i++)
      {
         $this->ResultData['fields'][$i] = mysql_fetch_field($SQLResult, $i);
      }
      $nr = mysql_num_rows($SQLResult);
      for ($i = 0; $i < $nr; $i++)
      {
         $this->ResultData['data'][$i] = mysql_fetch_row($SQLResult);
      }
      $file = fopen($filename, 'w');
      flock($file, LOCK_EX);
      fwrite($file, serialize($this->ResultData));
      fclose($file);
      return true;
   }
   function num_fields()
   {
      return sizeof($this->ResultData['fields']);
   }
   function field_name($num)
   {
      if (isset($this->ResultData['fields'][$num]))
      {
         return $this->ResultData['fields'][$num]->name;
      }
      else
      {
         return false;
      }
   }
   function fetch_field($num)
   {
      if (isset($this->ResultData['fields'][$num]))
      {
         return $this->ResultData['fields'][$num];
      }
      else
      {
         return false;
      }
   }
   function field_len($num)
   {
      if (isset($this->ResultData['fields'][$num]))
      {
         return $this->ResultData['fields'][$num]->max_length;
      }
      else
      {
         return false;
      }
   }
   function field_type($num)
   {
      if (isset($this->ResultData['fields'][$num]))
      {
         return $this->ResultData['fields'][$num]->type;
      }
      else
      {
         return false;
      }
   }
   function field_flags($num)
   {
      if (!isset($this->ResultData['fields'][$num]))
      {
         return false;
      }
      $result = array();
      if ($this->ResultData['fields'][$num]->not_null)
      {
         $result[] = 'not_null';
      }
      if ($this->ResultData['fields'][$num]->primary_key)
      {
         $result[] = 'primary_key';
      }
      if ($this->ResultData['fields'][$num]->unique_key)
      {
         $result[] = 'unique_key';
      }
      if ($this->ResultData['fields'][$num]->multiple_key)
      {
         $result[] = 'multiple_key';
      }
      if ($this->ResultData['fields'][$num]->blob)
      {
         $result[] = 'blob';
      }
      if ($this->ResultData['fields'][$num]->unsigned)
      {
         $result[] = 'unsigned';
      }
      if ($this->ResultData['fields'][$num]->zerofill)
      {
         $result[] = 'zerofill';
      }
      if ($this->ResultData['fields'][$num]->binary)
      {
         $result[] = 'binary';
      }
      if ($this->ResultData['fields'][$num]->enum)
      {
         $result[] = 'enum';
      }
      if ($this->ResultData['fields'][$num]->auto_increment)
      {
         $result[] = 'auto_increment';
      }
      if ($this->ResultData['fields'][$num]->timestamp)
      {
         $result[] = 'timestamp';
      }
      return implode(' ', $result);
   }
   function num_rows()
   {
      return sizeof($this->ResultData['data']);
   }
   function fetch_row()
   {
      if (($this->NextRowNo+1) > $this->num_rows())
      {
         return false;
      }
      $this->NextRowNo++;
      return $this->ResultData['data'][$this->NextRowNo — 1];
   }
   function fetch_assoc()
   {
      if (($this->NextRowNo + 1) > $this->num_rows())
      {
         return false;
      }
      for ($i = 0; $i < $this->num_fields(); $i++)
      {
         $result[$this->ResultData['fields'][$i]->name] =
            $this->ResultData['data'][$this->NextRowNo][$i];
      }
      $this->NextRowNo++;
      return $result;
   }
}
?>


И создать папку под названием cache_data и CMOD 777 на нее.

Ну вот и все вроде… Пользуйтесь на здоровье…

Автор публикации

не в сети 14 лет

kirill

Комментарии: 0Публикации: 8Регистрация: 05-04-2011

Понравилась статья? Поделись в соц. сетях:

Похожие новости

Отправить комментарий

wpDiscuz
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля