Php 数据库更改检测

Php 数据库更改检测,php,mysql,database,Php,Mysql,Database,我需要一种方法来检测数据库的更改,因为我正在客户端的站点上实现一个缓存系统。(缓存整个页面,而不仅仅是查询) 在每个页面的顶部(我有一个“母版页”,所以代码中只有一个位置),我查询数据库,看看它是否正确 我将大小相加,得到一个“唯一”数字。将其与前一个进行比较,如果值相同,则交付缓存的页面,如果不相同,则运行“普通”页面,然后缓存该页面 因此,我认为在理论上这是可行的,因为我只有一个数据库查询,并基于此将站点(缓存或取消缓存,取决于结果)交付给用户 这行得通吗?如果不行,为什么 编辑: 检查上次

我需要一种方法来检测数据库的更改,因为我正在客户端的站点上实现一个缓存系统。(缓存整个页面,而不仅仅是查询)

在每个页面的顶部(我有一个“母版页”,所以代码中只有一个位置),我查询数据库,看看它是否正确

我将大小相加,得到一个“唯一”数字。将其与前一个进行比较,如果值相同,则交付缓存的页面,如果不相同,则运行“普通”页面,然后缓存该页面

因此,我认为在理论上这是可行的,因为我只有一个数据库查询,并基于此将站点(缓存或取消缓存,取决于结果)交付给用户

这行得通吗?如果不行,为什么

编辑:

检查上次更新的时间戳怎么样

有趣的方法

根据,您可能会得到数据长度值的近似值-在示例链接中,有可疑的整数。我肯定会用它做更多的实验,以确保它能达到你认为的效果

您还应该确保这适用于更新,而不仅仅是删除/插入

我还将在一个非平凡的系统上测试“hastanythingchange”查询的性能。我猜,要想做到这一点,DB服务器需要查看文件系统,我猜这比通过SQL查询要慢很多倍

第二,根据底层应用程序的不同,您可能会发现应用程序数据经常发生更改,从而导致缓存不断失效

有趣的方法

根据,您可能会得到数据长度值的近似值-在示例链接中,有可疑的整数。我肯定会用它做更多的实验,以确保它能达到你认为的效果

您还应该确保这适用于更新,而不仅仅是删除/插入

我还将在一个非平凡的系统上测试“hastanythingchange”查询的性能。我猜,要想做到这一点,DB服务器需要查看文件系统,我猜这比通过SQL查询要慢很多倍


第二,根据底层应用程序的不同,您可能会发现应用程序数据经常发生更改,从而导致缓存不断失效

谁在更新数据库?建议导致更改的进程应该是使缓存无效的进程。当用户/管理员导致表发生更改时,您可以:

  • 如果管理员和面向公众的站点共享相同的应用程序空间(即,它们是同一个应用程序),则只需在管理员进行更改时更新缓存即可
  • 在某处设置一个状态位(可能是会话变量),并定期检查以重新加载缓存数据
建议大小不是“发生变化”的良好指标。忘记行-如果布尔值/位值更改怎么办?这将满足使缓存无效的条件,但“大小”始终相同。您可以通过最后一次更改datetime来改进这一点,但仍然存在相同的基本问题—查询数据库以检查更改标志。有点违背了缓存的目的


考虑另一种方法——每n分钟重新加载一次缓存。不管有没有变化,只要重新加载即可。n将是一个适合您业务需求的值。您可能有陈旧的缓存,并且可以为旧/陈旧数据提供最多n分钟的服务。这不是我的建议,而是要考虑的事情。

< p>谁正在更新数据库?建议导致更改的进程应该是使缓存无效的进程。当用户/管理员导致表发生更改时,您可以:

  • 如果管理员和面向公众的站点共享相同的应用程序空间(即,它们是同一个应用程序),则只需在管理员进行更改时更新缓存即可
  • 在某处设置一个状态位(可能是会话变量),并定期检查以重新加载缓存数据
建议大小不是“发生变化”的良好指标。忘记行-如果布尔值/位值更改怎么办?这将满足使缓存无效的条件,但“大小”始终相同。您可以通过最后一次更改datetime来改进这一点,但仍然存在相同的基本问题—查询数据库以检查更改标志。有点违背了缓存的目的

考虑另一种方法——每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'
尝试过这个,它就像一个符咒


试过这个,它就像一个符咒……

请解释一下你所说的“尺寸”是什么意思。如果删除了一行并添加了新行,该怎么办?缓存的目的是避免任何数据库工作。是的,我知道,但我认为如果我可以将其缩小到一个查询,加载速度会更快…您可以在一个查询中加载页面所需的所有数据。请解释“大小”是指什么。如果一行被删除,一个