在类中使用memcache

时间:2013-03-11 20:12:43

标签: php mysql memcached

所以我刚开始学习昨天如何使用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的了解有限,你们中的任何人都知道为什么它不能检索数据。

谢谢你做了很多!

1 个答案:

答案 0 :(得分:1)

来自Memcache protocol description

  

     

memcached存储的数据是在密钥的帮助下识别的。关键   是一个文本字符串,应该唯一标识客户端的数据   有兴趣存储和检索它的人。目前   密钥的长度限制设置为250个字符(当然,通常是   客户不需要使用这么长的密钥);关键不能包括   控制字符或空格。

您的密钥包含空白字符,因此失败。你可以检查一下,因为Memcache :: set()失败时返回FALSE。

一种防止这种情况的简单方法:从$ key创建MD5哈希并将其用作$ key:

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

注意:Memcache值不能大于1MB。