首页 > 杂记 > 正文

我们知道 Linux 服务器有个 Cron 的功能,可以用来设置定时执行的作业,但是并不是每个人都熟悉 Linux 系统,并且也不是所有的主机管理面板都有 Cron 栏目

PHP 本身是无法创建定时任务的,但是 WordPress 自带了一个伪定时任务(Cron) API,非常的方便好用,包括 WordPress 本身的定时发布文章都依赖于这个 API

实现原理

WordPress是依赖用户访问,被动实现的。

具体而言就是将创建的定时任务存储到数据库里,当有人访问的时候就去判断一下是否到时间需要执行这个定时任务,如果到时间则执行。

因为这种原理,所以执行的时间可能会有一些偏差,但随着网站的浏览量攀升和网络爬虫的不断访问,会让定时任务执行的时间越来越准确。

相关函数

任务类型

1.在指定时间触发一次

wp_schedule_single_event($timestamp, $hook, $args)

$timestamp:事件发生的时间戳。

$hook:事件调用的 hook,需要预先通过 add_action 关联定时作业的回调函数。

$args:传给回调函数的参数数组。

2.按一定频率循环执行

wp_schedule_event($timestamp, $recurrence, $hook, $args)

$timestamp,$hook 和 $args 这三个参数含义和 wp_schedule_single_event 的一样。

$recurrence:事件重复的频率。

2.移除定时任务

wp_clear_scheduled_hook( string $hook, array $args = array(), bool $wp_error = false )

任务频率

WordPress 已经内置了四种重复频率:

hourly 每小时1次,twicedaily 每天2次 — 12小时1次,daily 每天1次 — 24小时1次,weekly 每周1次。

如果需要其他频率,比如每15分钟1次,每5分钟1次。WP-Cron 也支持自定义事件频率类型。

查看 wp_get_schedules() 函数的源代码,频率内部是使用秒数来定义的,然后我们可以通过 cron_schedule 这个 filter 去自定义频率:

1
2
3
4
5
6
7
8
function custom_cron_schedule($schedules)
{
	$schedules['five_minutes'] = ['interval' => 300,	'display' => '每5分钟一次'];
	$schedules['fifteen_minutes'] = ['interval' => 900,	'display' => '每15分钟一次'];
	return $schedules;
}
 
add_filter('cron_schedules', 'custom_cron_schedule');

使用举例

//每分钟写一次日志–这没什么卵用,就是为了演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//自定义频率 每分钟
function custom_cron_schedule($schedules)
{
	$schedules['one-minute'] = array('interval' => 60, 'display' => '每分钟一次');
	return $schedules;
}
add_filter('cron_schedules', 'custom_cron_schedule');
 
// 定义任务钩子
function one_minute_function()
{
	file_put_contents('one-minute.log', time() . PHP_EOL, FILE_APPEND);
}
add_action('one_minute_function_hook', 'one_minute_function');
 
// 定时执行
if(!wp_next_scheduled('one_minute_function_hook')){
	wp_schedule_event(time(), 'one-minute', 'one_minute_function_hook');
}

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。