简单理解和实现Linux定时任务(访问某个地址)

简介: 在项目的开发过程中经常会有定时任务的需求,例如按时自动处理订单状态或者需要做某个接口的队列。可是PHP本身对上述场景的支持并是不很好,虽然可以通过配置响应时间的方法让PHP进程不结束,但从测试和易维护的角度来说,最实用的方案是通过服务器定时任务来实现。

在项目的开发过程中经常会有定时任务的需求,例如按时自动处理订单状态或者需要做某个接口的队列。可是PHP本身对上述场景的支持并是不很好,虽然可以通过配置响应时间的方法让PHP进程不结束,但从测试和易维护的角度来说,最实用的方案是通过服务器定时任务来实现。由于配置Linux定时任务会涉及到很多方面的知识,对于Linux不太熟的开发者容易望而却步,本文就以最简单的方式将这种方案实现落地,希望对大家有帮助。

img_036f841ccc7d05e653c9f15772ce0839.png
流程图

编辑crontab文件

每个用户都拥有自己的crontab文件,文件包含送交守护进程的一系列指令,通常使用下面的命令对该文件进行编辑:

> crontab -e
AI 代码解读

默认的编辑器是vim,只需要记住按i可以对文本进行编辑,使用上下左右箭头调整光标位置,按esc退出编辑,退出编辑后键入:wq对文件进行保存即可,就像下面这样:

img_92a3c045687bd960b159f13f76e53d21.gif
编辑crontab

定时的语法如下:

* * * * * /WWW/learnlinux/sometask.sh
分钟 小时 日 月 星期 命令
AI 代码解读

上面的意思是,每1分钟执行一次sometask.sh。5个*号的位置代表的是执行任务的时间,语法是这样的:

“\*”代表所有,
“/”代表循环周期,
“-”代表从某个数字到某个数字的区间,
“,”分开几个离散的数字
AI 代码解读

最简单的写法如下:

30 * * * * 代表每个小时的第30分钟执行一次
30 6 * * * 代表每天的6点30分执行一次
30 6 15 * * 代表每个月的15号6点30分执行一次
30 6 15 5 * 代表每年的5月15号6点30分执行一次
也可以用星期表示,0代表周日:
30 6 * * 0 代表每个周日的6点30执行一次
AI 代码解读

稍微复杂一点:

*/5 * * * * 代表每隔5分钟执行一次
30 6 */5 * * 代表每隔5天就在6点30分执行一次
0 2-5 * * * 代表每天的2点到5点钟的第0分钟执行一次
20,40 * * * * 代表每个小时的第20和第40分钟执行一次
AI 代码解读

创建可执行文件

我们既然规定每分钟执行一次sometask.sh那么就到相应的目录下去创建该文件:

> cd /WWW/learnlinux/
> vim sometask.sh
AI 代码解读

这里使用vim创建文件,编辑方法上文中有,sometask.sh文件内容如下:

#!/bin/sh
curl http://localhost/learnlinux/
AI 代码解读

该文件中第一行为固定写法,第二行用于指定访问的页面URL,curl命令可以以GET的方式访问后面的地址,注意:地址不需要添加引号。你可以将这里的URL修改为实际项目中需要被定时访问的页面。

案例中被访问的页面PHP代码如下:

<?php
file_put_contents('timer.log', date('m-d H:i:s', time()).PHP_EOL, FILE_APPEND);
AI 代码解读

该页面每次被访问都会将当前时间追加到同目录的日志文件(timer.log)中,主要用于测试前面的代码是否正常执行。注意:需要给该目录创建文件的权限。

上述文件创建成功之后,可以先执行一次sh文件,测试页面是否正常被访问,之后再观察timer.log文件被访问的时间点是否是你所希望的。就像这样:

img_c9e35ab26986d97fbf51a8eff886cbb6.png
timer.log

再之后你就可以在页面文件里处理你的业务逻辑了,测试的时候可以用 #注释crontab文件。这样,虽然PHP不支持定时任务,但通过服务器技术,今后再遇到需要自动处理状态或者做接口队列的项目就简单很多了。

至于window服务器,请去下载各种现成的定时执行程序:)

fourn
+关注
目录
打赏
0
0
0
0
5
分享
相关文章
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux服务器中遇到的立即重启后的绑定错误:地址已被使用问题解决
总的来说,解决"地址已被使用"的问题需要理解Linux的网络资源管理机制,选择合适的套接字选项,以及合适的时间点进行服务重启。以上就是对“立即重启后的绑定错误:地址已被使用问题”的全面解答。希望可以帮你解决问题。
82 20
|
6月前
|
Linux Crontab 查看定时任务启动没
【10月更文挑战第20天】在Linux系统中,crontab用于设置周期性执行的任务。查看当前用户的Crontab任务列表,使用`crontab -l`;查看所有用户任务,使用`sudo crontab -l`或指定用户`sudo crontab -u username -l`。
263 5
|
8月前
|
运维.Linux下执行定时任务(中:Cron的常用替代方案)
本文是关于Linux下执行定时任务系列的第二部分,主要探讨除了Cron之外的常用替代方案。介绍了Systemd Timers、Anacron及at命令三种工具,它们分别适用于不同场景下的定时任务需求。文章详细分析了每种工具的特点、工作原理、基本使用方法及其高级功能,并对比了它们各自的优缺点,帮助读者根据实际情况选择最适合的定时任务解决方案。此外,还提供了指向具体实例和进一步阅读材料的链接。
344 4
运维.Linux下执行定时任务(中:Cron的常用替代方案)
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等