博客写了一段时间,发现站点的定时发布功能失效了,排查到最后发现是 wp-cron.php 没有及时启用
1 、关于 wp-cron 调度说明
为什么要使用 WP-Cron [ 链接 ]
WordPress 核心和许多插件都需要一个调度系统来执行基于时间的任务。 但是,许多托管服务是共享一个系统的,并且不提供对系统调度程序的访问。
使用 WordPress API 相比 非 WordPress 的方法 来配置计划任务是一种更容易的方法。 但如果使用系统调度程序,当时间超过原计划时间(比如定时发布)且任务未运行,则不会重新尝试执行该任务。
使用 WP-Cron,所有计划的任务都将放入队列中,并在下一个机会(即加载下一页)时运行。 所以,虽然以前不能 100%肯定 你的任务被运行 ,但你现在可以 100%肯定 它会运行 。
关于调度程序排查的说明 [ 链接 ]
在配置文件中有一个 禁用 wp-cron 的参数
define('DISABLE_WP_CRON', true);
配置后,Wordpress 就不会在每次有站点访问请求时执行一遍 wp-cron 的代码,也可以大大提升访问质量
2 、关于 wp-cron 失效后的现象
配置的定时发布总是不按照正常时间发布,最后都需要手动运行一次。
3 、配置 wp-cron 的调度方式
3.1 、 URL 访问的调度方式
你可以手动去周期性的访问 wp-cron.php 来保证执行,比如站点状态监测工具。
http[s]://your.domain.name/wp-cron.php
3.2 、使用 Cron 来调度
我们可以使用 crond/etc/crontab 来调度 wp-cron.php [ 链接 ] [ 链接 ]
*/15 * * * * nginx IS_CRON=1 /usr/bin/php -f /opt/wordpress/wp-cron.php?doing_wp_cron > /dev/null 2>&1
3.3 、使用 Systemd 来调度
-f
是让 PHP 知道这是一个文件。
IS_CRON=1
是让 PHP 知道这是一个 仅为 cron 作业运行的命令。
vim /etc/systemd/system/php_cron-wordpress.service
[Unit] Description=Run PHP cron from Wordpress After=network.target Wants=network.target [Service] Type=oneshot User=nginx Environment=IS_CRON=1 WorkingDirectory=/opt/wordpress ExecStart=/usr/bin/php -f /opt/wordpress/wp-cron.php > /dev/null 2>&1 KillMode=process
vim /etc/systemd/system/php_cron-wordpress.timer
[Unit] Description=Run PHP cron from Website_Blog [Timer] OnBootSec=5min OnUnitActiveSec=5min Unit=php_cron-wordpress.service [Install] WantedBy=timers.target
systemctl enable php_cron-wordpress.timer systemctl start php_cron-wordpress.timer