Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何动态设置定时任务!而不是写死在Linux Crontab

如何动态设置定时任务!而不是写死在Linux Crontab

作者头像
Tinywan
发布于 2024-07-30 08:14:13
发布于 2024-07-30 08:14:13
28400
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

概述

软件开发中,定时任务是一个常见的需求,尤其是在需要定期执行某些操作的场景中。传统的Linux cron服务虽然强大,但它的灵活性确实有限,尤其是在动态调整任务执行时间方面。但在实际项目运行中动态修改任务执行时间,实在不太灵活。

随着项目规模的扩大,管理大量的cron任务和它们的配置文件可能会变得复杂且容易出错。特别是在多环境部署的情况下,维护一致性和同步配置文件需要额外的工作。

由于cron任务的执行时间和频率是预定义的,当任务执行出现问题时,调试和跟踪可能会比较困难。特别是当任务依赖于外部系统或资源时,问题定位和解决会更加复杂。频繁修改cron配置文件可能会引入安全风险,尤其是在多用户环境中。不当的权限管理或配置错误可能会导致任务被恶意利用或执行不适当的操作。

Cron Scheduler

PHP Cron Scheduler 是一个与框架无关的cron作业调度程序,可以轻松地与您的项目集成或作为独立的命令调度程序运行。在使用这个任务调度器时,你只需要在你的服务器上创建单个 scheduler.php 入口。你的任务调度在scheduler.php方法中进行定义。

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require peppeocchi/php-cron-scheduler

开源地址:https://github.com/peppeocchi/php-cron-scheduler

如何工作

在项目根目录下创建一个包含以下内容的 scheduler.php 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php 

require_once __DIR__.'/vendor/autoload.php';

use GO\Scheduler;

// Create a new scheduler
$scheduler = new Scheduler();

// ... configure the scheduled jobs (see below) ...

// Let the scheduler execute jobs which are due.
$scheduler->run();

然后在crontab中添加一个新条目,以便每分钟运行 scheduler.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* * * * * /usr/local/php-8.4/bin/php /home/tinywan/demo/scheduler.php 1>> /dev/null 2>&1

就是这样!您的调度程序已经启动并运行,现在您可以添加您的作业,而无需再担心crontab。这个Cron每分钟都会调用scheduler.php命令调度器。然后评估你的计划任务并运行到期的任务。

调度作业

默认情况下,您的所有作业将尝试在后台运行。PHP脚本和原始命令默认情况下将在后台运行,而函数将始终在前台运行。您可以通过调用 inForeground() 方法强制命令在前台运行。必须将输出发送到电子邮件的作业将在前台运行。

执行一个PHP脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scheduler->php('path/to/my/script.php');

计划执行时间

有几种方法可以帮助您设置计划的执行时间。如果您不调用此方法中的任何一个,则作业将每分钟(*)运行一次。

任何表达式

at -此方法接受dragonmantank/cron-expression支持的任何表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scheduler->php('script.php')->at('* * * * *');
每分钟执行

everyMinute 每分钟执行。您可以选择传递 minute 分钟运行一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scheduler->php('script.php')->everyMinute();
$scheduler->php('script.php')->everyMinute(5);
每小时运行

hourly 每小时运行一次。您可以选择传递您想要运行的 $minute ,默认情况下,它将在每小时的'00'分钟运行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scheduler->php('script.php')->hourly();
$scheduler->php('script.php')->hourly(53);
每天运行

daily 每天运行一次。您可以选择传递 minute 以获得更细粒度的控制(或字符串 hour:minute )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$scheduler->php('script.php')->daily();
$scheduler->php('script.php')->daily(22, 03);
$scheduler->php('script.php')->daily('22:03');

最佳实践

项目根目录 scheduler.php 文件参考

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
declare(strict_types=1);

namespace think;

date_default_timezone_set('PRC');

require __DIR__ . '/vendor/autoload.php';

# PHP 二进制文件路径
$bin = '/usr/local/php-8.4/bin/php';
$script = __DIR__ . '/think';

$scheduler = new \GO\Scheduler();

# 2024716日 @add Tinywan 执行一个Linux命令
$scheduler->raw('ps aux | grep nginx');

# 2024710日 @add Tinywan 订单自动取消 每1分钟执行一次
$scheduler->php($script . ' order cancel', $bin)->everyMinute(5);

$scheduler->run();

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2024-07-28T00:10:02+08:00][info] 定时任务-商品推广关闭 end
[2024-07-28T00:11:02+08:00][info] 定时任务-账户统计 end
[2024-07-28T00:12:02+08:00][info] 定时任务-账户统计 end
[2024-07-28T00:13:01+08:00][info] 定时任务-账户统计 end
[2024-07-28T00:14:02+08:00][info] 定时任务-账户统计 end
[2024-07-28T00:15:02+08:00][info] 定时任务-商品推广关闭 start
[2024-07-28T00:15:02+08:00][info] 定时任务-订单 start
[2024-07-28T00:15:02+08:00][info] 定时任务-账户统计 end

小结

本文将探讨如何在PHP环境下实现这种动态定时任务,旨在提供一个更加灵活、安全且易于管理的定时任务执行机制。这将极大地提升项目的可扩展性和运维效率。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
重学SpringBoot3-整合Quartz定时任务
Quartz 是一个开源的任务调度框架,用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合,可以轻松实现定时任务的灵活管理。本文将详细介绍如何在 Spring Boot 3 项目中集成 Quartz Scheduler 并实现示例任务的调度。
CoderJia
2024/11/14
3030
重学SpringBoot3-整合Quartz定时任务
crontab--定时任务
cron:计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
cultureSun
2023/05/18
3770
crontab--定时任务
Python基于APScheduler实现定时任务
Python这个语言的优势就在于有丰富的第三方库,既然原生实现有这样那样的缺点,我们可以借助第三方库来实现定时任务。
Steve Wang
2021/12/20
2.6K0
linux定时任务crontab详解
0 0 1,15 * 1 表示的是:每月1号和15号的0点0分执行,每周一的0点0分执行。两者是或的关系,但不要有这种写法,很容易产生歧义
章鱼喵
2019/03/06
5.7K0
linux定时任务crontab详解
centos 8利用crontab设置定时任务,crontab每秒运行
  简单说明: vixie-cron 是 cron 的主程序; crontabs 是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
OwenZhang
2021/12/08
1.9K0
centos 8利用crontab设置定时任务,crontab每秒运行
Linux中Crontab(定时任务)命令详解及使用教程
Crontab介绍: Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
天乐404
2023/11/16
7K0
Linux中Crontab(定时任务)命令详解及使用教程
Linux crontab 定时任务整理笔记
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/79088555
泥豆芽儿 MT
2018/09/11
1.5K0
Linux crontab 定时任务整理笔记
Linux命令之Crontab——定时任务
rontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
浩Coding
2020/03/04
1.3K0
Python 实现定时任务的八种方案!
来源:https://www.biaodianfu.com/python-schedule.html
Python编程与实战
2021/10/12
34.5K0
Linux学习21-设置定时任务crontab
做自动化测试写的脚本需设置定时任务,在指定的时间去执行,这就需要用到定时任务。之前用jenkins可以在里面设置定时任务,很好用,其实不用jenkins,在linux上也可以用crontab做个定时任务。 本篇学下crontab定时任务的语法,制作一个简单的python脚本文件,使用crontab定时执行
上海-悠悠
2019/07/12
1.6K0
Linux之crontab定时任务
****前言**** 无论是做开发还是做运维的程序猿,crontab命令是必须用到的命令,特别是对于运维的人,自动化运维中,crontab也属于其一。然而就来记录常用的crontab定时处理命令。 ---- ****crontab简介**** 简而言之呢,crontab就是一个自定义定时器。 ---- ****crontab配置文件**** 其一:/var/spool/cron/ 该目录下存放的是每个用户(包括root)的crontab任务,文件名以用户名命名 其二:/etc/cron.d/ 这个目
AlicFeng
2018/06/08
2.5K0
Linux 定时任务调度(crontab命令)
在以上各个字段中,还可以使用以下特殊字符: 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9” 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6” 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次
lin_zone
2018/08/15
1.5K0
Linux 定时任务调度(crontab命令)
从Linux Crontab到Workerman Crontab,定时任务革新之路
许多传统企业使用 Linux 自带的 crontab 来做定时任务的方案,该方案非常简单,适合做主机上的运维工作,比如定时清理日志、周期性做健康检查。随着信息化时代的高速发展,业务变得越来越复杂,很多场景都需要定时任务,但是 crontab 方案存在高可用问题,不适合应用在业务应用上。
Tinywan
2023/11/27
4730
从Linux Crontab到Workerman Crontab,定时任务革新之路
要在 Laravel 中设置定时任务并使用 PM2 进行管理
使用 php artisan make:command 命令创建一个新的 Artisan 命令,该命令将执行您希望在后台运行的代码。例如,您可能想要每分钟调用一个 API 来更新数据库中的数据。
Bolton
2023/05/31
9610
PHP轻量级作业调度器 Cron Scheduler
过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。
Tinywan
2024/04/15
3690
PHP轻量级作业调度器 Cron Scheduler
linux下的定时任务处理
cron是linux的一个定时任务执行工具,而crondtab是周期性执行命令,crond则是定时任务的守护进程。下面我们进行一些实践,希望小伙伴看完能跟着练习起来。
用户7657330
2020/08/14
8050
linux下的定时任务处理
At 、Crontabl定时任务
at 命令是用于一次的定时任务,使用起来十分简便,而且定时的日期多样化,注意其需要 atd 服务的支持
晚上没宵夜
2021/08/05
1.3K0
At 、Crontabl定时任务
Linux crontab创建定时任务
最近在学校论坛上看到一个脚本,用路由器固件自动拨号,解决断网的问题,其中就用到了 crontab 这个命令,大致原理就是用 curl 去抓取上网登录页面,在线和不在线的页面是不同的,根据这个特征用 grep 命令正则筛选出来,每分钟运行一次脚本,如果掉线的话,就将登陆账号和密码通过 POST 请求发送给页面,登陆成功就能上网
棒棒鸡不棒
2022/09/01
5K0
workerman的Crontab定时任务实例
Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。
OwenZhang
2022/05/30
1.1K0
workerman的Crontab定时任务实例
PHP实现执行定时任务的几种思路详解
我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。
全栈程序员站长
2022/07/07
1K0
相关推荐
重学SpringBoot3-整合Quartz定时任务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档