我需要一个工作代码,用于在MySQL缓存中存储MySQL结果集! 我搜索了Google&所以并没有找到任何! 希望有人能分享工作代码。
示例:
$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);
如何将输出的SQL结果存储在APC中?
我想知道将其缓存在APC(而不是MySQL)中的代码
答案 0 :(得分:4)
你可能真的不想这样做!
向应用程序添加缓存层应该是您执行的最后之一。缓存可以发现代码中的大量错误,既微妙又明显。
如果你想提高你的代码的性能,你应该是 performing code profiling 并消除的真正的瓶颈,而不是察觉的。
特别是在这种情况下。
这里的示例查询很糟糕。太可怕了,甚至。你从获取的UID
列的每行的表中,没有设定这些行的顺序,然后只获取实际的第一行,无论它可能是。
即使使用这个查询,甚至不考虑缓存它,也很危险。 如果是真正的查询,那么您的代码已损坏开头!从数据库返回的结果不保证按任何特定顺序。实际上,至少在MySQL中,您实际上可以使用ALTER TABLE ... ORDER BY
重置磁盘数据排序。如果您只想要一行,则应使用ORDER BY
子句和LIMIT
子句,而不是选择所有内容,然后只获取一行。
我要的是你的过于简单的查询的作为例子的假设下进行操作,并且将你的幽默与两个或三个APC功能快速引物你得知道。您应该阅读其他功能的所有的手册页,以了解APC的工作原理。
让我们来看看你的代码。
$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
拉出缓存,这更有可能是您想要完成的。请注意,我故意在这里停止了缓存过期时间。
你会注意到,显然这里只缓存了一个值。如果坚持使用绑定结果变量,那么您将需要手动构建数组并缓存该数组。我强烈建议使用绑定变量 not 。查看使用mysql_stmt_get_result
获取result set,然后您可以从中获取数组。 注意,手册说get_result
返回布尔值,但它在示例代码中返回结果集对象。因人而异。我可以为你未来的项目建议PDO吗?
无论使用什么数据库接口,都不能缓存实际的语句句柄或结果集对象,只能缓存它们返回的数据。
答案 1 :(得分:0)
这是一个有效的代码:)
<?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);
?>