Самый простой способ кэшировать результаты запросов MySQL с помощью PHP?
Каждый раз, когда кто-то приземляется на моей странице list.php?id=xxxxx
, он запрашивает некоторые запросы MySQL, чтобы вернуть это:
$ids = array(..,..,..); // not big array - not longer then 50 number records
$thumbs = array(..,..,..); // not big array - not longer then 50 text records
$artdesc = "some text not very long"; // text field
Поскольку база данных, из которой я делаю запросы, довольно велика, я хотел бы кэшировать эти результаты в течение 24 часов в файле, например: xxxxx.php
в каталоге /cache/, поэтому я могу использовать его в include("xxxxx.php")
, если он настоящее. (или txt файлы!? или любым другим способом)
Поскольку есть очень простые данные, я считаю, что это можно сделать, используя несколько строк PHP, и не нужно использовать memcached или другие профессиональные объекты.
Becasuse мой PHP очень ограниченный, может кто-то просто разместить основные строки (или код) PHP для этой задачи?
Я действительно был бы очень благодарен!
Ответы
Ответ 1
Кэширование массива PHP довольно просто:
file_put_contents($path, '<?php return '.var_export($my_array,true).';?>');
Затем вы можете прочитать его обратно:
if (file_exists($path)) $my_array = include($path);
Вы также можете посмотреть в ADOdb, который обеспечивает внутреннее кэширование.
Ответ 2
Попробуйте использовать serialize;
Предположим, что вы получаете свои данные в двух массивах $array1
и $array2
. Теперь вам нужно сохранить эти массивы в файле. Хранение строки (третья переменная в вашем вопросе) в файл легко, но для хранения массива вам нужно сначала преобразовать его в строку.
$string_of_array1 = serialize( $array1 );
$string_of_array2 = serialize( $array2 );
Следующая проблема - это именование файлов кеша, чтобы вы могли легко проверить, доступен ли соответствующий массив в кеше. Лучший способ сделать это - создать хеш MD5 вашего запроса mysql и использовать его как имя файла кэша.
$cache_dir = '/path/cache/';
$query1 = 'SELECT many , fields FROM first_table INNER JOIN another_table ...';
$cache1_filename = md5( $query1 );
if( file_exists( $cache_dir . $cache1_filename ) )
{
if( filemtime( $cache_dir . $cache1_filename ) > ( time( ) - 60 * 60 * 24 ) )
{
$array1 = unserialize( file_get_contents( $cache_dir . $cache1_filename ) );
}
}
if( !isset( $array1 ) )
{
$array1 = run_mysql_query( $query1 );
file_put_contents( serialize( $array1 ) );
}
Повторите описанное выше с другим массивом, который должен быть сохранен в отдельном файле с MD5 второго запроса, используемого как имя второго файла кэша.
В конце концов, вам нужно решить, как долго ваш кеш останется в силе. Для этого же запроса в таблице mysql могут быть изменены записи, которые могут привести к устареванию кеша файловой системы. Таким образом, вы не можете просто полагаться на уникальные имена файлов для уникальных запросов.
Важно:
- Файлы старого кэша должны быть удалены. Возможно, вам придется написать процедуру, которая проверяет все файлы каталога и удаляет файлы старше n секунд.
- Храните кеш-каталог вне веб-узла.
Ответ 3
Просто напишите новый файл с именем $_GET ['id'] и содержимым материала, который вы хотите кэшировать, и каждый раз проверяйте, существует ли этот файл, иначе создайте его. Что-то вроде этого:
$id = $_GET['id']
if (file_exists('/a/dir/' . $id)) {
$data = file_get_contents('/a/dir/' . $id);
} else {
//do mysql query, set data to result
$handle = fopen('/a/dir/' . $id, 'w+');
fwrite($handle, $data);
fclose($handle);
}