V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imdgr886
V2EX  ›  WordPress

Wordpress 定时任务 wp-cron 的性能优化

  •  
  •   imdgr886 · 2022-04-23 15:15:44 +08:00 · 1317 次点击
    这是一个创建于 940 天前的主题,其中的信息可能已经有所发展或是发生改变。

    wordpress 的定时任务,比如定时发布文章,依赖的是自带的 wp-cron 来实现,这个需要用户访问来触发

    由此引发了一个问题:

    • 如果网站用户访问不多,那么任务将不确定何时被触发
    • 如果网站访问量很大,那么会严重的损耗性能(当然访问量大的,应该有能力解决)

    那么最好是禁用自动触发的功能

    禁用 wp-cron

    wp-config.php 里加上:

    define('DISABLE_WP_CRON', true);
    

    这样就不会每个用户访问都来检测定时任务了

    通过 crontab 触发 wp-cron

    如果是 linux 系统,并且可以登录服务器,那么用系统自带的 crontab 来触发任务是比较理想的选择

    crontab -e
    

    然后添加

    * * * * *   curl   https://example.com/wp-cron.php >> /dev/null 2>&1
    

    这样,每分钟系统都会访问 wp-corn.php 这个文件,然后 wp-cron 会判断何时执行任务

    通过外部第三方系统触发(可选)

    如果是 windows 系统,或者没有权限操作系统的 crontab ,那么还可以选择第三方的服务,这里我就要推一下我自己的服务了: URLCron

    URLCron 会根据设定的频率或者表达式,按时去访问,与 crontab 的行为一致。不过使用 URLCron 会更加的方便,因为配置更简单,不需要 Linux 服务器的知识,同时可以保存访问记录,所以不用担心有没有触发定时任务,都记着呢

    PC 和手机浏览器都有很好的体验,免费套餐也够 WordPress 用了

    4 条回复    2022-04-24 14:12:33 +08:00
    ZE3kr
        1
    ZE3kr  
       2022-04-23 21:34:50 +08:00
    你可以看下源代码

    https://github.com/WordPress/WordPress/blob/master/wp-includes/cron.php#L923

    cron 是通过发起 curl 异步执行的,所以并不会严重影响性能,而且最长只阻塞 0.01 秒。
    NewYear
        2
    NewYear  
       2022-04-24 10:43:07 +08:00
    @ZE3kr

    这个事情是一直以来存在的误会吗,还是说后面 WP 做了改善,又或者是 wp-cron.php 被执行多多少少影响性能,所以一规律的时间执行避免执行次数过多呢……疑惑中。
    ZE3kr
        3
    ZE3kr  
       2022-04-24 10:56:39 +08:00 via iPhone
    @NewYear 几年前从我刚接触 WP 开发,WP 就是这样实现的了。总之这样搞是 PHP 程序很常见的 workaround 。但换成 crontab 可以使用 PHP-CLI 无运行时间 /内存上限的执行确实是更优的。
    imdgr886
        4
    imdgr886  
    OP
       2022-04-24 14:12:33 +08:00
    @ZE3kr 因为是异步请求,0.01 秒其实不足以完成一个请求,只是客户端断开,服务器还会继续运行的。
    其实对小站性能影响不大,但是时间不可靠;对大站会有明显影响
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3687 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:28 · PVG 12:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.