Самый простой способ кэшировать результаты запросов 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);
}