linux 定时任务php,使用 php 实现类似 linux crontab 的定时任务功能,支持秒级定时...

使用 php 实现类似 linux crontab 的定时任务功能,支持秒级定时任务类

/**

* Class Crontab

* description: 使用 php 实现类似 linux crontab 的定时任务功能,支持秒级定时

* author: http://www.phpernote.com/

*/

class Crontab {

/**

* 判断某个时间点是否在 cron 规则之内

* @param $cron

* @param $time

* @return bool

*/

public static function parseCron($cron, $time) {

$cronArray = self::getCronArray($cron);

$now = explode(' ', date('s i G j n w', $time));

foreach ($now as $key => $piece) {

if (!in_array($piece, $cronArray[$key])) {

return false;

}

}

return true;

}

/**

* @param $cron

* @return array

*/

public static function getCronArray($cron) {

$cronArray = explode(' ', $cron);

$timeArray = [];

$dimensions = [

[0, 59], //seconds

[0, 59], //Minutes

[0, 23], //Hours

[1, 31], //Days

[1, 12], //Months

[0, 6] //Weekdays

];

foreach ($cronArray as $key => $item) {

list($repeat, $every) = explode('/', $item, 2) + [false, 1];

if ($repeat === '*') {

$timeArray[$key] = range($dimensions[$key][0], $dimensions[$key][1]);

} else {

// 处理逗号拼接的命令

$tmpRaw = explode(',', $item);

foreach ($tmpRaw as $tmp) {

// 处理10-20这样范围的命令

$tmp = explode('-', $tmp, 2);

if (count($tmp) == 2) {

$timeArray[$key] = array_merge($timeArray[$key], range($tmp[0], $tmp[1]));

} else {

$timeArray[$key][] = $tmp[0];

}

}

}

// 判断*/10 这种类型的

if ($every > 1) {

foreach ($timeArray[$key] as $k => $v) {

if ($v % $every != 0) {

unset($timeArray[$key][$k]);

}

}

}

}

return $timeArray;

}

}

使用示例:

include 'Crontab.php';

$cron_list = [

//['cron' => '秒 分 时 日 月 周', 'echo' => '任务名称'],

['cron' => '0 */1 * * * *', 'echo' => '第一个任务执行了'],

['cron' => '0 */2 * * * *', 'echo' => 'www.phpernote.com'],

['cron' => '20 */3 * * * *', 'echo' => '第三个任务执行了'],

['cron' => '5 */5 * * * *', 'echo' => '第四个任务执行了'],

['cron' => '0 41 16 29 * *', 'echo' => '第5个任务执行了']

];

echo date('Y-m-d H:i:s', time()) . "\r\n";

while (true) {

$time = time();

foreach ($cron_list as &$cron) {

$result = Crontab::parseCron($cron['cron'], $time);

if ($result) {

echo date('Y-m-d H:i:s', $time) . ' ' . $cron['cron'] . ' ' . $cron['echo'] . "\r\n";

}

}

//echo date('Y-m-d H:i:s', $time) . "\r\n";

sleep(1);

}

输出结果如下:

0fa250653781df39b8c2ce4c008692c5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值