Кеширование и ваши запросы к базе данных


Если у вас большая посещаемость на сайте, то значит, множество людей читают ваши статьи (это хорошо). Это приводит к тому, что к базе идёт огромное количество запросов (это не очень хорошо). И что же мы будем с этим делать? Лучший способ – это кеширование результатов, которые достаются из базы. Таким образом, когда первый пользователь откроет статью, она извлечётся из базы, а вот в последующие разы она будет показываться из кэша. Эта техника позволит MySQL серверу немного отдохнуть или сконцентрировать свою мощь на другие дела. Существует большое количество кэш-механизмов, но мы создадим свой. В большинстве случаев, его будет достаточно. Создадим специальный класс: 01 class Cache { 02 03 function read($fileName) { 04 $fileName = '/path/to/cache/folder'.$fileName; 05 if (file_exists($fileName)) { 06 $handle = fopen($fileName, 'rb'); 07 $variable = fread($handle, filesize($fileName)); 08 fclose($handle); 09 return unserialize($variable); 10 } else { 11 return null; 12 } 13 } 14 15 function write($fileName,$variable) { 16 $fileName = '/path/to/cache/folder'.$fileName; 17 $handle = fopen($fileName, 'a'); 18 fwrite($handle, serialize($variable)); 19 fclose($handle); 20 } 21 22 function delete($fileName) { 23 $fileName = '/path/to/cache/folder'.$fileName; 24 @unlink($fileName); 25 } 26 } Сохраните этот код в файле cache.php Код довольно-таки прост, поэтому я не буду объяснять его работу. Разве что, отмечу, что мы используем функции serialize и unserialize, которые превращают любой объект в строку и наоборот. Вот как мы можем использовать наш класс: 01 // подключаем класс 02 require_once('cache.php'); 03 // создаём объект 04 $cache = new Cache(); 05 // проверяем существование кэша 06 $data = $cache->read('test_17.tmp'); //17 это например id статьи 07 // допустим, такого кэша нет. Достаём статьи из базы 08 if (empty($data)) { 09 $sql = "SELECT image, user_id, content FROM table WHERE id = 17"; 10 $data = $db->select_list($sql); // просто для примера 11 $cache->write('test_17.tmp', $data); 12 } 13 // дальше используем данные как всегда 14 foreach($data as $row) { 15 ........ 16 } Этот код позволит значительно сократить количество запросов к базе данных. Но тут есть нюанс! При любом изменении в статье, необходимо сбросить кэш (удалить его) для того, чтобы создался новый. Для обновления можете использовать этот код: 1 require_once('cache.php'); 2 $cache = new Cache(); 3 //обновляем статью 4 $data = 'some array for updating'; 5 $db->update_record('table', $data); 6 $cache->delete('test_17.tmp'); Когда вы удалите кэш, то новая версия статьи появится на сайте. И всё будет хорошо!