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

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

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

img_036f841ccc7d05e653c9f15772ce0839.png
流程图

编辑crontab文件

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

> crontab -e

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

img_92a3c045687bd960b159f13f76e53d21.gif
编辑crontab

定时的语法如下:

* * * * * /WWW/learnlinux/sometask.sh
分钟 小时 日 月 星期 命令

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

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

最简单的写法如下:

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执行一次

稍微复杂一点:

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

创建可执行文件

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

> cd /WWW/learnlinux/
> vim sometask.sh

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

#!/bin/sh
curl http://localhost/learnlinux/

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

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

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

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

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

img_c9e35ab26986d97fbf51a8eff886cbb6.png
timer.log

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

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

目录
相关文章
|
3月前
|
域名解析 网络协议 安全
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
|
10天前
|
监控 Unix Linux
|
15天前
|
Linux
Linux Crontab 查看定时任务启动没
【10月更文挑战第20天】在Linux系统中,crontab用于设置周期性执行的任务。查看当前用户的Crontab任务列表,使用`crontab -l`;查看所有用户任务,使用`sudo crontab -l`或指定用户`sudo crontab -u username -l`。
36 5
|
1月前
|
网络协议 Linux 开发工具
linux系统配置固定地址
linux系统配置固定地址
|
3月前
|
存储 运维 监控
运维.Linux下执行定时任务(中:Cron的常用替代方案)
本文是关于Linux下执行定时任务系列的第二部分,主要探讨除了Cron之外的常用替代方案。介绍了Systemd Timers、Anacron及at命令三种工具,它们分别适用于不同场景下的定时任务需求。文章详细分析了每种工具的特点、工作原理、基本使用方法及其高级功能,并对比了它们各自的优缺点,帮助读者根据实际情况选择最适合的定时任务解决方案。此外,还提供了指向具体实例和进一步阅读材料的链接。
118 4
运维.Linux下执行定时任务(中:Cron的常用替代方案)
|
3月前
|
JavaScript Linux 应用服务中间件
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
|
3月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
3月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
3月前
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
|
3月前
|
JavaScript Linux 容器
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问