0

それで、昨日 memcache の使い方を学び始めたところです。ですから、やるべきことはまだたくさんあります。これまでのところ、インストール方法を理解しており、使用方法に関するいくつかのチュートリアルを見てきました。しかし、それらはすべて静的に入力する方法を説明しています。すべてのデータベース クエリをクラスで実行し、返されたデータを foreach ループで処理します。コンパイル エラーなしで動作するようになりましたが、memcache は実際には動作しません。なぜだか混乱しています。私のクラスはこのように設定されています。

class Feed extends Database
{
private $Memcache;

public function __construct()
{
    parent::__construct();
    $this->Memcache = new Memcache;
} //end __construct

public function getFeed ($var)
{
    $feed = array(); //Initialize an empty array

    $this->Memcache->connect('localhost', 11211);
    $key = "SELECT col FROM table WHERE value = " . $var . " ORDER BY timestamp DESC LIMIT 30";
    $cache = $this->Memcache->get($key);
    if ($cache)
    {
        $feed = '';
    }
    else
    {
        //Query the database
        $Statement = $this->Database->prepare("SELECT col FROM table WHERE value = ? ORDER BY timestamp DESC LIMIT 30");
        $Statement->execute(array($var));


        while($row = $Statement->fetch(PDO::FETCH_ASSOC))
        {
            $feed[] = array("row1" => $row["col1"], 
                            "row2" => $row["col2"] );

        }

        $this->Memcache->set($key, $row, 0, 40); // Store the result of the query for 40 seconds
    }

    return $feed;
} //end getFeed
} //end Feed

出力は次のように設定されています

<?php foreach ($Feed->getFeed($var) as $feed): ?>

    <p><?php echo $feed["row1"]; ?></p>

<?php endforeach; ?>

したがって、memcache が機能していた場合、foreach ループで $feed を実行しているため、明らかにコンパイル エラーになります。私は memcache についての知識が限られているため、データを取得できない理由を知っている人はいますか?

どうもありがとうございました!

4

1 に答える 1

1

Memcacheプロトコルの説明から:

キー

memcached によって保存されたデータは、キーを使用して識別されます。キーは、データの保存と取得に関心のあるクライアントのデータを一意に識別するテキスト文字列です。現在、キーの長さ制限は 250 文字に設定されています (もちろん、通常、クライアントはそのような長いキーを使用する必要はありません)。キーには、制御文字または空白を含めてはなりません。

キーに空白文字が含まれているため、失敗します。Memcache::set() は失敗時に FALSE を返すため、これを確認できます。

これを防ぐ簡単な方法: $key から MD5 ハッシュを作成し、それを $key として使用します。

$key = md5("SELECT col FROM table WHERE value = " . $var . " ORDER BY timestamp DESC LIMIT 30");

注: Memcache の値を 1 MB より大きくすることはできません。

于 2013-03-12T12:29:16.400 に答える