我们在负载均衡器后面具有多主数据库的环境中运行Wordpress。当WP尝试更新wp_options中的cron表时,错误日志填满了死锁错误。我们完全禁用了wp-cron,但仍然看到错误,所以,有两个问题:
1)是什么原因导致wp_options中的cron表被更新?
2)出现以在每个页面加载时运行。是否可以禁用此功能并设置cronjob以在crontab中定期运行它?
由于
答案 0 :(得分:1)
Wordpress使用wp-cron.php作为在用户无权访问或想要通过Unix设置cronjobs时运行计划任务的方法。此过程在wp_options中查看cron表中的预定作业,如果已经过了指定的时间(或更长时间),则执行作业。
wp-cron.php使用wp-includes / cron.php(Wordpress Cron API)来运行预定作业。在cron.php中你会发现许多更新cron表的函数,这些函数都围绕着事件的调度。
需要预定事件的Wordpress或插件的任何功能都使用Cron API来执行此操作。但是,调度事件的操作(即使它已经存在)会更新wp_options中的cron表。即使完全禁用了wp-cron.php,Wordpress /插件的这些元素也会加载并调度它们的事件,试图在此过程中更新cron表。
除了知道它必须与DB / site配置相关之外,我还没有弄清楚死锁发生的确切原因,但我现在知道Wordpress本身就是这样。
答案 1 :(得分:0)
我遇到了同样的问题 - 数据库很快就会失去同步。某些插件使它发生得更快(它们安排了大量的cron作业),但即使禁用它们,最终错误也会阻止复制。
我能够通过做两件事来保持复制工作。
首先,在 my.ini 中添加:
slave-skip-errors = 1062
这指示MySql在重复键已存在时跳过创建条目。我的集群被设置为主动 - 被动,因此理论上,除非主动节点关闭,否则不应对被动MySql节点进行“实际”写入,在这种情况下,将不会对该节点进行“实际”写入。写入被动节点的唯一内容是wp-cron作业的结果,(理论上)也在活动节点上运行。
在每个网站的 wp-config.ini 中,第二个是添加:
/** disable cron */
define('DISABLE_WP_CRON', true);
这会阻止wp-cron运行,所以这些解决方案中的任何一个都应该自行运行。
另一种选择是禁用wp-cron,但保留完整的数据库同步,并安排脚本调用每个站点的wp-cron.php(你将手动完成wp-cron服务自动执行的操作) )。这样,它只会在主动节点上运行,数据应该同步到被动节点,没有任何问题。