2010-02-03 46 views
4

是否有可能在页面加载时查询数据库一次PHP中。以某种方式存储这些结果并在随后的报告中显示给用户。是否有任何方法可以确定数据库中是否发生了某些变化,以便我们只能连接到数据库才能获取新的/更改的结果?缓存mysql的结果和查询只有当有变化

请给我一些想法。 谢谢。

+0

您正在使用什么缓存? –

+0

我没有使用任何。在我看来'缓存'是商店 – JPro

回答

0

你可以在你的数据表,它表明,例如,最后一条记录的修改时间使用其他领域。然后,您可以使用memcache(或另一个缓存子系统)并将其保存到最后修改时间戳中的数据库结果中。

在唯一的一个数据库查询中,您可以选择此字段(在select语句中使用带有描述字段的轻型SQL查询),并将其与从DB值中提取的值进行比较。如果它们不同,你就知道从复杂查询中获取数据库中的新数据。

“光” 的SQL查询的示例:

SELECT MAX(last_modification) AS last_modification FROM data_table 
1

高速缓存,如APC,分布式缓存或XCache将通常具有寿命它变得过时之前。只要缓存不陈旧,就不会有任何对数据库的调用。请注意,调用优于数据库的缓存记录集,因为没有调用保存整个往返。

如果您的应用程序是数据库的唯一写入源,那么只要有人向数据库写入数据,您就可以手动强制高速缓存在其设置生命周期之前过期。随后的查询会在查询运行时重新缓存。

如果有其他来源,例如远程服务器,您必须在数据库内实施触发器,以通知所有使用数据库更改的应用程序。消息队列最适合用于此目的。

0

您可以使用缓存系统来存储数据。

对于每个对象修改,您可以从缓存中删除它,或者在可能使用缓存版本的情况下刷新它的缓存版本。

在PHP中实现缓存的方法很多,其中包括Memcached。

1

有一个功能from here,一个包装任何其他功能,缓存结果:

function cache_function($buildCallback, array $args= array(), $timeoutMinutes= 60) { 
    if (is_array($buildCallback)) { 
     $cacheKey= get_class($buildCallback[0]) . $buildCallback[1] . ':' . implode(':', $args); 
    } else 
     $cacheKey= $buildCallback . ':' . implode(':', $args); 

    $file_path= CACHE_PATH . md5($cacheKey); 
    @ $file_time= filemtime($file_path); 
    $rebuild= $file_time < time() - ($timeoutMinutes * 60); 

    //$rebuild= false; // FORCE REBUILD SKIP for WINDOWS 

    if ($rebuild or (!$rebuild and !is_readable($file_path))) { 
     $build= call_user_func_array($buildCallback, $args); 
     file_put_contents($file_path, serialize($build), LOCK_EX); 
     return $build; 
    } 
    return unserialize(file_get_contents($file_path)); 
} 

另见:

http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/