我应该禁用WP_CRON而是每隔几分钟从服务器触发wp-cron.php吗?


12

看起来WordPress不必要在每次加载页面时触发WP CRON。我在想,为什么不让它仅在服务器上每5分钟运行一次,而不是让它每次访问都运行?我可以每五分钟触发一次wp-cron.php并达到预期的结果吗?

这有什么缺点吗?

Answers:


15

使用服务器的cron作业运行WP CRON没有任何缺点。实际上,这是推荐的做法。

根据官方WordPress插件开发文档

WP-Cron无法连续运行,如果某些关键任务必须按时运行,则可能会出现问题。有一个简单的解决方案。只需将系统的任务计划程序设置为在所需的时间间隔(或在所需的特定时间)运行。

为此,您需要首先在中禁用默认的cron行为wp-config.php

define('DISABLE_WP_CRON', true);

然后,wp-cron.php从服务器计划。对于Linux,这意味着:

crontab -e

但是,不要在命令行(CLI)中运行它,而是将其作为HTTP请求运行。为此,您可以使用wget

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress wp-cron.php使用以下代码加载所有必需的核心文件,插件等:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

因此,不必担心WordPress无法加载重要功能。


1
您链接到的WordPress.org文档在wget http://YOUR_SITE_URL/wp-cron.php未添加的情况下进行了提及?doing_wp_cron 因此,一个文档比另一个文档更好吗??doing_wp_cron非版本不添加的功能是什么?
Garconis

大概就是这样,您的日志将显示查询字符串,以便您确定如何确定调用该字符串。
Slbox

1
我完全不同意。首先,它不是“推荐”的。其次,此方法将削弱使用实际推荐的调度事件方法的所有插件。我认为这确实是个坏建议。除非您有非常特定的理由,否则几乎没有人应该关闭cron。我能想到的唯一原因是,如果您要将WordPress拆分为CDN之类的东西。这不是正常的做法。
John Dee

1
@JohnDee:此方法实际上并未禁用cron,而是禁用了WP Cron方法,该方法检查并尝试在每次页面加载时运行cron作业。define('DISABLE_WP_CRON', true);仅禁用cron进程的那部分,然后*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron在服务器上使用以下代码调用cron脚本:确保服务器上的cron作业已执行。任何调度插件都不会知道两者之间的区别。
Fayaz

1
有关此主题的WordPress.org文档链接已更改为developer.wordpress.org/plugins/cron/…–
aldemarcalazans

2

有两个缺点:首先,当使用wp-cron.php作为cli时,没有设置$ _SERVER变量。人们通过使用对wp-cron.php的curl请求克服了这一限制。

其次,由于WP本身未加载wp-cron.php;如果您使用SMTP邮件程序插件,则在调用wp-cron时不会加载该插件。同样,使用curl调用会覆盖此问题。卷曲似乎是最常用的方法。

然而; 我更喜欢在正确设置postfix中的邮件设置和(对于nginx)php-fpm config并设置crontab之后使用wp-cli

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(以csv格式列出具有特定字段的所有cron-钩子是cron的名称,相对于下一次运行是时间。使用AWK去除显示“ now”作为下一次运行(现在到期)的代码,将该列表传递给xargs到呼吁wp cron event run $HOOK各的cron)使用WP-CLI负载WordPress的正确(我选择跳过插件上市crons时,由于代码的错误及PHP警告会搞砸了脚本输出;但使用了xargs的cron的时候不要跳过他们, cron可能需要加载插件)

希望这能为您提供一些注意事项。


2
如何设置:/ 15 * * *的wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron通过TomMcFarlin的建议- tommcfarlin.com/wordpress-cron-jobs。似乎做得很好。感谢您的评论。
TheBigK '17

是的,就像我在整个人中提到的那样,选择使用curl(wget或任何其他http调用)来触发分支,并且该方法没有任何问题。我只是建议直接调用wp-cron php文件(其中不包括所需的文件)的问题,并建议另一种替代方法(如果您想对它进行一些补充)。
TechnicalChaos

0

有许多原因不禁用wp-cron。实际上,几乎不可能找到用例来做到这一点。它不会减慢您的网站速度,它用于您可能不知道的事情。

许多插件都使用WP-Cron来安排工作。如果您关闭调度程序,它们可能会造成混乱。

关于此主题的教程激增,因为它令人困惑,并且因为禁用它对您的网站没有多大作用。它将导致开发人员头疼,他们必须修复六个月内所产生的神秘问题。

此外,WP Heartbeat在管理区域每15秒触发一次,为99%认为有此问题的人解决了此问题。


2
这是一个可怕的回应-他们-禁止WP Cron。他们只是在页面加载时禁用WP Cron的调用,而是将其卸载到系统cron守护程序中。嘘。
巴里·查普曼

无论如何,将其保留下来的主要原因是许多插件现在都使用cron来扩展后台任务运行。您可以弄乱NEXT人员正在做的事情,因为他们希望系统以标准方式工作。祝好运!
约翰迪

如果在禁用wp cron的情况下以某种方式对插件进行了完全破坏的编码,则表明它是由不称职的程序员编写的,最好立即将其卸载。
Magnetic_dud

好吧,这里的两条评论证明了我的观点。您有一位开发人员说“这不会禁用cron,它会立即将其改组为OS cron”-这是WordPress的一个突破,它是OS中立的。然后另一个开发人员说:“嘿,插件开发人员的职责是计划对wp cron的歼灭。” 嗯好 因此,如果您想要cron功能,则应该计划取消cron系统吗?要什么?备份cron系统?该评论[显然]没有意义。
John Dee

无论如何,当前状态是“ TOTAL CONFUSION”。这是当前状态。从框架POV来看,唯一的解决方案是告诉人们:WP-CRON系统存在的原因。不要关闭它。另一种选择是10,000种不同的意见。这就是我们现在所拥有的。
John Dee

0

我还没有发现将wp-cron卸载到外部服务的真正弊端。现在已经这样做了很多年。

特别是在当今世界中,您可以将应用程序作为微服务运行。

我为每个WordPress组件使用单独的Docker容器-php,web,db,crontab,redis等)。将crontab作为单独的容器,使用本地网络通过http调用wp-cron,仅在需要时运行。

通过减少攻击面,这可以减轻后端节点的压力并提高安全性。

如果开发人员无法在每次页面加载时都不必调用wp-cron的情况下弄清楚该怎么做,那么,这代表了他的经验不足。“不理会”,因为您不了解事情的运作方式,不是保持它的好理由。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.