Як кешувати важкі операції (наприклад, запити до бази даних) у PHP?
PHP є дуже популярною мовою програмування для Інтернету. Це зручна та потужна мова програмування з вільною типізацією, яку ви можете вибрати та використовувати протягом короткого періоду часу. Він набуває такого широкого розповсюдження та популярності, можливо, завдяки WordPress, блогу чи CMS (системі керування вмістом). Багато веб-сайтів, таких як facebook, спочатку базуються на PHP.
Однак PHP зазвичай вважається повільно інтерпретуючою мовою сценаріїв, хоча існує багато методів для його прискорення, наприклад Zend Optimiser, встановлений за замовчуванням. HHVM допомагає скомпілювати PHP під час виконання в щось на кшталт байт-коду, який потім можна перевести у рідний код, що покращує продуктивність.
Запити до бази даних займають багато часу, особливо для великих таблиць або таблиць без належного індексування. Іноді такі операції сповільнюють швидкість завантаження/обробки сторінки, а потім погіршують взаємодію з користувачем. Досить часто для виконання таких запитів потрібен час, але результати змінюватимуться не так часто, тобто змінюватимуться раз на день. У цьому випадку краще кешувати ці результати у файли та отримати їх від читання файлів наступного разу, якщо вони вже будуть кешовані.
База даних MySQL добре обробляє запити з належним індексуванням. Однак коли таблиця стає великою, це дещо впливає на продуктивність. Ми можемо кешувати будь-які обчислювальні операції та зберігати їх у файлах на дисках і отримати їх наступного разу, зчитуючи безпосередньо з файлів, що буде набагато швидше.
Ми надали клас PHP, який можна легко використовувати для додавання до вашої програми.
class Cache {
private $folder = '';
// constructor takes an optional path for storing the cache files
public function __construct($path = '') {
$path = trim($path);
if ((strlen($path) && is_dir($path))) {
$this->setFolder($path);
} else {
$this->setFolder('/tmp/'); // tmp folder if empty
}
}
public function getFolder() {
return $this->folder;
}
public function setFolder($path) {
$path = trim($path);
$len = strlen($path);
if ($len) {
if (is_dir($path)) {
if ($path[$len - 1] != '/') {
$path .= '/'; // adds a forward slashes at the end
}
$this->folder = $path;
}
}
}
// read from caches, if not found, return null
public function read($fileName) {
$fileName = $this->folder.$fileName;
if (is_file($fileName)) {
$handle = fopen($fileName, 'rb'); // open as binary
$variable = fread($handle, filesize($fileName));
fclose($handle);
return unserialize($variable);
} else {
return null;
}
}
// write $variable to $fileName
public function write($fileName, $variable) {
$fileName = $this->folder.$fileName;
$handle = fopen($fileName, 'a');
fwrite($handle, serialize($variable));
fclose($handle);
}
// delete cache entry $fileName
public function delete($fileName) {
$fileName = $this->folder.$fileName;
@unlink($fileName); // put a @ to avoid file-not-found warning
}
}
Отже, зауваження до місця. Наведений вище клас простий і простий у використанні. Наприклад, я використав наступне, щоб кешувати один запит для свого веб-сайту.
require('class.cache.php');
$cache = new Cache('cache/1/');
$entry = md5($url);
$data = $cache->read($entry);
$blogtitle = "";
if ($data !== null) { // found cache
$blogtitle = $data; // read the data
} else {
$query = "select `title` from `blog` where `path`='$url'";
$result = mysql_query($query, $link);
if (mysql_num_rows($result))
{
$blogtitle = mysql_result($result, 0, 0);
}
$cache->write($entry, $blogtitle); // save the cache for next read
}
Отже, якщо ми хочемо очистити кеш, ми можемо просто видалити його за допомогою:
// suppose we run here the query ("update `blog` set `title` = 'test' where `path` = '$url'");
require('class.cache.php');
$cache = new Cache('cache/1/');
$entry = md5($url);
$cache->delete($entry);
Онлайн – інструмент запиту заголовка CURL використовує цю техніку кешу, щоб зменшити навантаження на ЦП веб-сервера, і ці файли кешу очищатимуться кожні кілька днів, щоб запобігти перевантаженню дискового простору веб-сервера.
Пам’ятайте, що швидкість завантаження сторінки є одним із факторів, які впливають на ваш рейтинг SEO. Пошукові системи віддають перевагу швидшим веб-сайтам.