在 Systemd 上调度 Wordpress 的 Cron

2018-12-22 1137点热度 0人点赞

博客写了一段时间,发现站点的定时发布功能失效了,排查到最后发现是 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

StarryVoid

Have a good time