12

誰かが私のページ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

クエリを作成するデータベースは非常に大きいため、この結果をxxxxx.php/cache/ ディレクトリのようなファイルに 24 時間キャッシュして、include("xxxxx.php")存在する場合に使用できるようにします。(またはtxtファイル!?、またはその他の方法)

非常に単純なデータがあるため、いくつかの PHP 行を使用して実行でき、memcached やその他の専門的なオブジェクトを使用する必要はないと考えています。

私の PHP は非常に限られているため、誰かがこのタスクのために PHP の主要な行 (またはコード) を配置することはできますか?

私は本当にとても感謝しています!

4

3 に答える 3

5

シリアライズを使用してみてください。

データを 2 つの配列$array1とで取得するとします$array2。次に、これらの配列をファイルに保存する必要があります。文字列 (質問の 3 番目の変数) をファイルに保存するのは簡単ですが、配列を保存するには、最初に文字列に変換する必要があります。

$string_of_array1 = serialize( $array1 );
$string_of_array2 = serialize( $array2 );

次の問題は、関連する配列がキャッシュで既に使用可能かどうかを簡単に確認できるように、キャッシュ ファイルの名前を付けることです。これを行う最善の方法は、mysql クエリの MD5 ハッシュを作成し、それをキャッシュ ファイル名として使用することです。

$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 ) );
}

2 番目のキャッシュ ファイルの名前として使用される 2 番目のクエリの MD5 を使用して、別のファイルに格納する必要がある他の配列で上記を繰り返します。

最後に、キャッシュを有効にしておく期間を決定する必要があります。同じクエリの場合、mysql テーブルにレコードが変更され、ファイル システムのキャッシュが古くなる可能性があります。そのため、一意のクエリに対して一意のファイル名だけに頼ることはできません。

重要:

  • 古いキャッシュ ファイルを削除する必要があります。ディレクトリのすべてのファイルをチェックし、n 秒より古いファイルを削除するルーチンを作成する必要がある場合があります。
  • キャッシュディレクトリは webroot の外に置いてください。
于 2013-04-01T17:40:15.343 に答える
0

$_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);
}
于 2013-04-01T15:26:42.167 に答える