Каждый раз, когда кто-то приземляется на моей странице 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
в xxxxx.php
/ cache /, поэтому я могу использовать его в include("xxxxx.php")
если он присутствует. (или txt-файлы!? или любым другим способом)
Поскольку есть очень простые данные, я считаю, что это можно сделать, используя несколько строк PHP, и не нужно использовать memcached или другие профессиональные объекты.
Becasuse мой PHP очень ограниченный может кто-то просто разместить основные строки PHP (или код) для этой задачи?
Я действительно был бы очень благодарен!
Кэширование массива PHP довольно просто:
file_put_contents($path, '<?php return '.var_export($my_array,true).';?>');
Затем вы можете прочитать его обратно:
if (file_exists($path)) $my_array = include($path);
Вы также можете посмотреть в ADOdb , который обеспечивает кэширование внутри.
Попробуйте использовать сериализацию;
Предположим, вы получаете свои данные в двух массивах $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 могут быть изменены записи, которые могут привести к устареванию кеша файловой системы. Таким образом, вы не можете просто полагаться на уникальные имена файлов для уникальных запросов.
Важный:
Просто напишите новый файл с именем $ _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); }