Php 数据库更改检测
我需要一种方法来检测数据库的更改,因为我正在客户端的站点上实现一个缓存系统。(缓存整个页面,而不仅仅是查询) 在每个页面的顶部(我有一个“母版页”,所以代码中只有一个位置),我查询数据库,看看它是否正确 我将大小相加,得到一个“唯一”数字。将其与前一个进行比较,如果值相同,则交付缓存的页面,如果不相同,则运行“普通”页面,然后缓存该页面 因此,我认为在理论上这是可行的,因为我只有一个数据库查询,并基于此将站点(缓存或取消缓存,取决于结果)交付给用户 这行得通吗?如果不行,为什么 编辑: 检查上次更新的时间戳怎么样 有趣的方法 根据,您可能会得到数据长度值的近似值-在示例链接中,有可疑的整数。我肯定会用它做更多的实验,以确保它能达到你认为的效果 您还应该确保这适用于更新,而不仅仅是删除/插入 我还将在一个非平凡的系统上测试“hastanythingchange”查询的性能。我猜,要想做到这一点,DB服务器需要查看文件系统,我猜这比通过SQL查询要慢很多倍 第二,根据底层应用程序的不同,您可能会发现应用程序数据经常发生更改,从而导致缓存不断失效 有趣的方法 根据,您可能会得到数据长度值的近似值-在示例链接中,有可疑的整数。我肯定会用它做更多的实验,以确保它能达到你认为的效果 您还应该确保这适用于更新,而不仅仅是删除/插入 我还将在一个非平凡的系统上测试“hastanythingchange”查询的性能。我猜,要想做到这一点,DB服务器需要查看文件系统,我猜这比通过SQL查询要慢很多倍Php 数据库更改检测,php,mysql,database,Php,Mysql,Database,我需要一种方法来检测数据库的更改,因为我正在客户端的站点上实现一个缓存系统。(缓存整个页面,而不仅仅是查询) 在每个页面的顶部(我有一个“母版页”,所以代码中只有一个位置),我查询数据库,看看它是否正确 我将大小相加,得到一个“唯一”数字。将其与前一个进行比较,如果值相同,则交付缓存的页面,如果不相同,则运行“普通”页面,然后缓存该页面 因此,我认为在理论上这是可行的,因为我只有一个数据库查询,并基于此将站点(缓存或取消缓存,取决于结果)交付给用户 这行得通吗?如果不行,为什么 编辑: 检查上次
第二,根据底层应用程序的不同,您可能会发现应用程序数据经常发生更改,从而导致缓存不断失效 谁在更新数据库?建议导致更改的进程应该是使缓存无效的进程。当用户/管理员导致表发生更改时,您可以:
- 如果管理员和面向公众的站点共享相同的应用程序空间(即,它们是同一个应用程序),则只需在管理员进行更改时更新缓存即可
- 在某处设置一个状态位(可能是会话变量),并定期检查以重新加载缓存数据李>
考虑另一种方法——每n分钟重新加载一次缓存。不管有没有变化,只要重新加载即可。n将是一个适合您业务需求的值。您可能有陈旧的缓存,并且可以为旧/陈旧数据提供最多n分钟的服务。这不是我的建议,而是要考虑的事情。 < p>谁正在更新数据库?建议导致更改的进程应该是使缓存无效的进程。当用户/管理员导致表发生更改时,您可以:
- 如果管理员和面向公众的站点共享相同的应用程序空间(即,它们是同一个应用程序),则只需在管理员进行更改时更新缓存即可
- 在某处设置一个状态位(可能是会话变量),并定期检查以重新加载缓存数据李>
<?php
mysql_connect("localhost","root","");
$result = mysql_query("SHOW TABLE STATUS FROM test;");
while($array = mysql_fetch_array($result)) {
$total = $array[Data_length]+$array[Index_length];
echo '
Table: '.$array[Name].'<br />
Data Size: '.$array[Data_length].'<br />
Index Size: '.$array[Index_length].'<br />
Total Size: '.$total.'<br />
Total Rows: '.$array[Rows].'<br />
Average Size Per Row: '.$array[Avg_row_length].'<br /><br />
';
}
?>
您可以使用以下功能:
<?php
mysql_connect("localhost","root","");
$result = mysql_query("SHOW TABLE STATUS FROM test;");
while($array = mysql_fetch_array($result)) {
$total = $array[Data_length]+$array[Index_length];
echo '
Table: '.$array[Name].'<br />
Data Size: '.$array[Data_length].'<br />
Index Size: '.$array[Index_length].'<br />
Total Size: '.$total.'<br />
Total Rows: '.$array[Rows].'<br />
Average Size Per Row: '.$array[Avg_row_length].'<br /><br />
';
}
?>
您可以在更新、插入、删除和替换要监视的表后,将当前的\u TIMESTAMP()插入到单独表中的某种状态字段中。在每个页面的顶部读取该值,并将其与缓存的时间戳进行比较,如果该值比缓存的时间戳旧,则使用缓存。您可以在更新、插入、删除和替换后将要监视的表上的时间戳()插入到单独表中的某种状态字段中。在每个页面的顶部读取该值,并将其与缓存的时间戳进行比较,如果该值早于缓存,则使用缓存
SELECT max(UPDATE_TIME)
FROM information_schema.tables
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA = 'DB_NAME_GOES_HERE'
尝试过这个,它就像一个符咒
试过这个,它就像一个符咒……请解释一下你所说的“尺寸”是什么意思。如果删除了一行并添加了新行,该怎么办?缓存的目的是避免任何数据库工作。是的,我知道,但我认为如果我可以将其缩小到一个查询,加载速度会更快…您可以在一个查询中加载页面所需的所有数据。请解释“大小”是指什么。如果一行被删除,一个