任何人都知道为什么在成功进行数据库更新成功后网站出现后可以多次调用menu_rebuild?在我跳下兔子洞之前?
更新:
澄清我正在使用Pressflow。
特别是当我们运行更新时,会调用多个menu_router重建,从而导致重复键错误和最大连接超时。即使更新较小,也会出现前一个问题。
更新:为了缓解这种情况,是否有一种非破解方式来增加menu_rebuild使用的锁定超时?它调用没有参数的函数,默认为30秒,我们想增加它。
答案 0 :(得分:0)
Drupal 6,对吧?
根据我的阅读,菜单重建代码中存在一些并发问题,如果多个用户在完成刷新缓存后立即访问该网站,则会导致多次执行。我在Drupal实例上看过这个......
例如,如果我点击“刷新所有缓存”并且需要几秒钟,那么我打开第二个浏览器并浏览到我们的网站,打开第三个等等...取决于这需要多长时间和序列它可以触发多个菜单重建。
在第一次错误发生后,所有看起来都很好。
这里有一些我没有完全阅读的长篇文章解释了一些并发问题:
答案 1 :(得分:0)
我们遇到了类似的问题,原因是由于admin_menu 1.6导致了一个奇怪的情况,通过drush清除了缓存,然后加载了一个页面。
如果您碰巧使用的是admin_menu 1.6(可能更旧),我建议您禁用它以查看它是否解决了问题。 admin_menu版本1.6尝试在hook_footer中重建菜单,但它没有使用D6的锁定功能。因此,如果您有一个大菜单并且重建需要一段时间,那么来自管理员用户的每次点击都会触发与前一个重叠的新菜单重新生成,从而导致大量错误。
请注意,当您通过Drupal UI清除缓存时,此问题不会出现。只有当你通过drush清除缓存时,我相信当你进行db更新时会发生这种情况。
如果禁用它可以解决问题,则应考虑升级到3.x版本的admin_menu。
至于尝试更改超时,这不会有任何影响。超时只会影响某人等待重建完成,但无论如何都不会在30秒之后开始新的重建,只会让那个人继续使用,但是当前重建的菜单很多。