如何强制drupal函数不使用DB缓存?

时间:2010-12-28 15:35:05

标签: database drupal caching

4 个答案:

答案 0 :(得分:3)

你在哪里打电话给这个?例如,您是将它用作template.php文件的一部分,作为页面的一部分,还是作为外部模块使用?

除非您将其包含在具有自己的命名空间的函数中,否则请尝试以不同于$node的方式命名变量 - 例如,将其命名为$my_node。根据上下文,Drupal核心和其他模块很可能会访问和修改“节点”名称。

如果在函数内部发生这种情况,请尝试以下操作并让我知道输出是什么:

$test_node_1 = node_load(344983); // Any hard-coded $nid that actually exists
echo $test_node_1->nid;

$test_node_2 = node_load(arg(1)); // Consider using hook_menu loaders instead of arg() in the future, but that's another discussion
echo $test_node_2->nid;

$test_node_3 = menu_get_object(); // Another method that is better than arg()
echo $test_node_3->nid;

修改

由于您正在使用hook_block,我认为我看到了您的问题 - 块本身正在被缓存,而不是节点。

根据http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_block/6

上的文档,尝试在hook_block中设置BLOCK_NO_CACHEBLOCK_CACHE_PER_PAGE

你应该尽可能地避免使用arg() - 它有一点安全风险,并且有更好的方法来完成arg()在模块环境中会做的任何事情。

修改:*

一些示例代码显示了我所指的内容:

function foo_block ($op = 'list', $delta = 0, $edit = array()) {
    switch ($op) {
      case 'list':
        $blocks[0] = array(
          'info' => 'I am a block!',
          'status' => 1,
          'cache' => BLOCK_NO_CACHE // Add this line
        );
        return $block;
      case 'view':
       .....
    }
}

答案 1 :(得分:0)

node_load使用db_query,它使用mysql_query - 因此无法通过该函数轻松更改数据库的缓存。

但是,node_load确实使用了Drupal的static $nodes缓存 - 这可能是你的问题,而不是数据库的缓存。您可以node_load使用node_load$reset = TRUE)调用node_load($nid, NULL, TRUE来清除该缓存。

完整文档位于http://api.drupal.org/api/drupal/modules--node--node.module/function/node_load/6

的node_load手册页上

答案 2 :(得分:0)

我很幸运地将节点ID传递给node_load而不是数组。

node_load(1);

根据Druapl's api这是可以接受的,看起来如果你传入一个数组作为第一个变量,它作为一个条件数组加载到数据库查询中。

答案 3 :(得分:0)

问题不在arg(),您的问题是您为匿名用户启用了缓存。

您可以关闭缓存,也可以使用cache exclude module从缓存中排除模块的菜单项。

修改:正如您现在解释的那样,这是一个块,您可以使用BLOCK_NO_CACHE中的hook_block将块从块缓存中排除。