我遇到一个奇怪的问题。我使用memcache函数在一个名为count.php的文件中缓存查询的输出。当用户查看特定页面时,ajax每秒调用该文件。输出缓存5秒,所以在这段时间内,如果这个文件有5次点击,我希望缓存的结果至少返回3-4次。然而,这并没有发生,相反,每次查询都将从echo语句中得到证明,但是如果通过在5秒内多次输入url(如http://example.com/help/count.php)直接从浏览器调用文件,则数据将从缓存中返回(再次从echo语句中得到证明)。下面是count.php
的相关代码mysql_connect(c_dbhost, c_dbuname, c_dbpsw) or die(mysql_error());
mysql_select_db(c_dbname) or die("Coud Not Find Database");
$product_id=$_POST['product_id'];
echo func_total_bids_count($product_id);
function func_total_bids_count($product_id)
{
$qry="select count(*) as bid_count from tbl_userbid where userbid_auction_id=".$product_id;
$row_count=func_row_count_only($qry);
return $row_count["bid_count"];
}
function func_row_count_only($qry)
{
if($_SERVER["HTTP_HOST"]!="localhost")
{
$o_cache = new Memcache;
$o_cache->connect('localhost', 11211) or die ("Could not connect to memcache");
//$key="total_bids" . md5($product_id);
$key = "KEY" . md5($qry);
$result = $o_cache->get($key);
if (!$result)
{
$qry_result = mysql_query($qry);
while($row=mysql_fetch_array($qry_result))
{
$row_count = $row;
$result = $row;
$o_cache->set($key, $result, 0, 5);
}
echo "From DB <br/>";
}
else
{
echo "From Cache <br/>";
}
$o_cache->close();
return $row_count;
}
}
我很困惑,为什么当ajax调用这个文件时,DB每秒都被击中,但是当在浏览器中输入URL时,缓存的数据返回。要尝试URL方法,我只是用一个有效的数字替换了$product_id(例如:$product_id=426在我的情况下)。我不明白这里有什么错,因为我希望数据在第一次命中后5秒内从缓存返回。我希望数据从缓存返回。谁能告诉我发生了什么事?
如果你正在使用地址栏,你正在做一个GET,但你的代码正在寻找$_POST['…'],因此您将得到一个无效的查询。首先,使用地址栏的结果不会是你所期望的。你的Ajax调用实际上是在做POST吗?
还请注意,你有一个SQL注入漏洞。请确保$product_id为整数
你的代码有很多问题,首先你总是连接到数据库并选择一个表,即使你不需要它。其次,你应该用!empty($result)来检查$result,这比直接使用更可靠!$result,因为它也包含空对象。
如上所述,如果'product_id'不在$_POST数组中,你可以使用$_REQUEST来覆盖$_GET(但你不应该,如果你确定它是通过$_POST来的)。