我需要一个在APC缓存中存储MySQL结果集的工作代码!
我在谷歌上搜索了一下。所以,没有找到任何!
希望有人能分享一个工作代码。
的例子:
$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
示例2:
$stmt=mysqli_prepare($con,"SELECT Events FROM Calendar where UID=?");
mysqli_stmt_bind_result($stmt, "i",$UID);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $events);
while(mysqli_stmt_fetch($stmt))
{
...
}
mysqli_stmt_close($stmt);
如何在APC中存储输出的SQL结果?我想知道的代码缓存它在APC(不是在MySQL)
您可能并不想这样做!
在应用程序中添加缓存层应该是您做的最后事情之一。缓存可以发现代码中大量的bug,无论是细微的还是明显的。
如果你想提高代码的性能,你应该执行代码分析并消除真正的瓶颈,而不是感知到的瓶颈。
特别是在这种情况下。
这里的示例查询是坏的。可怕的,甚至。您正在从表中的每一行中获取UID
列,未能为这些行指定顺序,然后仅实际获取第一行,无论它可能是什么。
即使使用这个查询,甚至不考虑缓存它,也是危险的。如果它是一个真正的查询,那么你的代码是破碎开始!从数据库返回的结果是,不能保证是任何特定的顺序。实际上,至少在MySQL中,您可以使用ALTER TABLE ... ORDER BY
重置磁盘上的数据排序。如果你只想要一行,你应该使用ORDER BY
子句和LIMIT
子句,而不是选择所有,然后只获取一行。
让我们看看你的代码。
$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
在这段代码中,您正在准备查询SELECT UID FROM Users
,将结果集的第一列绑定到PHP变量$UID
,获取单行,然后关闭语句句柄(丢弃所有其他结果)。
$UID
包含要缓存的单个值。要在APC中缓存此值,可以使用apc_store
:
apc_store($key, $UID);
$key
是缓存键名。
当然,把它放在缓存中是愚蠢的,比如说,只在需要时查询数据库。我们可以使用apc_fetch
先查找缓存的值。
$value_in_cache = false;
$value = apc_fetch($key, $value_in_cache);
if(!$value_in_cache) {
$value = null;
$stmt = mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
apc_store($key, $value);
}
这段代码总是在查询数据库之前尝试将$key
从缓存中取出,这更可能是您想要完成的。请注意,这里我故意省略了缓存过期时间。
您会注意到,显然这里只有一个值被缓存。如果坚持使用绑定结果变量,那么您要么需要手动构建一个数组并缓存该数组。我强烈建议而不是使用绑定变量。看看使用mysql_stmt_get_result
获取结果集,然后可以从中获取数组。注意,手册说get_result
返回布尔值,但在示例代码中返回一个结果集对象。YMMV。我可以为你们未来的项目推荐PDO吗?
无论使用什么数据库接口,都不能缓存实际的语句句柄或结果集对象,只能缓存它们返回的数据。
这是一个工作代码:)
<?php
$dba_host='localhost';
$dba_name='root';
$dba_pass='';
$dba_db='DB';
$con=mysqli_connect($dba_host,$dba_name,$dba_pass,$dba_db) or die('Connection Refused !');
$stmt=mysqli_prepare($con,"SELECT UID FROM Main");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
while(mysqli_stmt_fetch($stmt))
$result[] = $value;
mysqli_stmt_close($stmt);
apc_store('uid', $result);
$value_in_cache = false;
$value = apc_fetch('uid', $value_in_cache);
if(!$value_in_cache) {
echo 'Looking at DB';
$stmt=mysqli_prepare($con,"SELECT UID FROM Main");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
while(mysqli_stmt_fetch($stmt))
$result[] = $value;
mysqli_stmt_close($stmt);
apc_store('uid', $result);
}
else
{
echo 'Looking at Memory';
print_r($result);
}
mysqli_close($con);
?>