关于"自动更新"数据和"定时任务"

简介: 关于"自动更新"数据和"定时任务"

在我们写业务逻辑中,总会碰到某些"自动更新"和"定时任务"的需求,那么,该如果实现这些需求呢?

一:分析需求

其实,大概的需求实现分为2种:"伪自动"和"真自动"

1:什么是伪自动呢?

场景(1):

有个优惠券功能,有失效时间,当到失效时间时,自动更新为失效状态,用户无法再次使用

场景(2):

有个大转盘功能,有自动上下架功能,当到上架时间时,自动上架,当到失效时间时,自动下架

这种需求,完全可以

当用户查看该数据时,进行更新,

例如(1):

当用户查询,使用优惠券时,先更新状态,再进行取数据

例如(2):

当用户进入大转盘抽奖时,在大转盘获取奖品之前进行先将上架时间小于当前时间的更新为上架状态,下架时间小于当前时间的更新为下架状态

这种伪自动,是可以通过用户触发的,系统不需要后台干预,不需要使用定时任务进行处理,就可以实现功能的

2:什么是真自动?

真自动一般是和定时任务是挂钩的,没有定时任务,没有系统的自动运行,就不存在真自动

场景(1):

某个网站数据量过大,每天产生100万的浏览数据,后台管理员想看到某一天,每个小时段的数据统计,

常规做法:直接取出某天的数据,根据小时进行分组统计

但是100万数据量过大,处理时间需要很长,管理员是无法忍受查看一次数据需要等待十几秒甚至几十秒的

场景(2):

某网站为了留住老客户,当老客户超过30天未登录网站时,进行发送一条邮件关心一下,当到老客户生日时,自动发送一条邮件关心一下

这2种场景是不能使用伪自动的

因为,当用户不触发时(某个网站长时间没人访问,就不存在触发),或者用户触发已经来不及时(即时触发等待时间过长),就必须使用真自动,利用定时任务来解决该类需求

二:定时任务实现方式

定时任务实现方式,本人了解到了以下几种解决方案:

1:phpweb方式

<?php
ignore\_user\_abort();//关掉浏览器,PHP脚本也可以继续执行.
set\_time\_limit(0);// 通过set\_time\_limit(0)可以让程序无限制的执行下去
ini\_set('memory\_limit','512M'); // 设置内存限制
$interval=60*30;// 每隔半小时运行
do{
  //ToDo 各种需要处理的定时任务
  sleep(1);// 等待1秒
}
while(true);

使用php的特性,直接在某个php文件写入以上代码,进行访问一次(记住,是一次!多次将会出现多个定时),即可实现定时任务

优点:容易写,开发速度快,直接在后台运行

缺点:难维护,稳定性差,不好查看,有处理延时

2:php-cli

<?php
while(true){
    //do定时任务逻辑
    sleep(1);
}

没错,在php-cli中,就是这么简单,php-cli运行中,不存在超时,只需要 php index.php,不关闭运行窗口就可以一直执行下去

优点:开发速度快,可后台运行,易维护,易查看

缺点:容易出现内存泄漏,有一定的技术要求,稳定性一般,有处理延时

3:php web进阶方式

<?php
$time=15;
ignore\_user\_abort();//关掉浏览器,PHP脚本也可以继续执行.
set\_time\_limit(0);// 通过set\_time\_limit(0)可以让程序无限制的执行下去
$url="
 //定时任务
/*
  function
*/
sleep($time);
file\_get\_contents($url);

通过php web的特性,每次访问一次,就是一个独立的进程/线程,无限的接力下去

优点:容易写,开发速度快,易查看,易维护

缺点:稳定性差,有处理延时

4:linux大法:crontab php-cli

使用linux自带的crontab定时任务

只需要写好php代码,然后使用crontab定时执行该php,即可实现

<?php
///逻辑
``````bash
#crontab -e
00 * * * * /usr/local/bin/php /home/www/crontab.php

优点:稳定性较高,没有延时

缺点:开发需要linux,定时粒度1分钟较长

5:linux大法:crontab phpweb

使用linux自带的crontab定时任务,访问运行在web模式下的php

<?php
///逻辑
``````bash
*/10 * * * * /usr/bin/wget -q(安静模式) -O temp.txt(把输出日志存进文件) http://www.php20.cn/crontab.php

优点:稳定性一般,没有延时

缺点:开发需要linux,定时粒度1分钟较长,

6:使用php ptntl

pcntl方式较麻烦,本文只说下原理

使用pcntl_alarm(1)函数触发信号,

获取时钟信号之后新开进程进行处理逻辑

优点:稳定性较高,没有延时,定时粒度秒级

缺点:技术要求较高,开发较复杂,需要linux

7:swoole扩展

swoole扩展已经实现了定时任务,只需要调用就行

<?php
swoole\_timer\_tick(3000, function () { 
    echo "after 3000ms.\\n";  
    swoole\_timer\_after(14000, function () {    
        echo "after 14000ms.\\n";
    });
});

优点:稳定性高,有定时器校正,定时粒度高,使用容易,开发速度快

缺点:需要linux,需要安装swoole

8:windows定时任务

该定时任务我有在我另一个博文说明:http://www.php20.cn/article/sw/shopnc/68

优点:使用windows,开发简单,配置快,稳定性较高,没有延时

缺点:定时粒度分钟级,需要windows系统,运行时有黑窗口冒出

9:阿里大法好

登陆阿里云,找到网站监控,新增监控

image.png

只要将网址指向你需要处理的php文件即可

优点:没有开发难度,开发速度快,稳定性较高,易维护

缺点:粒度为分钟级,用别人的东西产生的心理问题

目录
相关文章
钉钉的userid可以修改吗
钉钉的userid可以修改吗
498 0
|
安全 云计算
身份和访问管理(IAM)软件市场现状及未来发展趋势
本文研究全球及中国市场身份和访问管理(IAM)软件现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美、欧洲、中国、日本、东南亚和印度等地区的现状及未来发展趋势
身份和访问管理(IAM)软件市场现状及未来发展趋势
|
10月前
|
SQL 分布式计算 DataWorks
DataWorks智能交互式数据开发与分析之旅
本次实验将带您进行DataWorks Notebook的快速入门,包含:Notebook新建、多引擎SQL开发与分析、Python开发、交互式分析等,同时,使用DataWorks Copilot体验智能数据开发,体验智能交互式数据探索之旅。
2866 11
|
缓存 前端开发 PHP
|
缓存 分布式计算 算法
优化Hadoop MapReduce性能的最佳实践
【8月更文第28天】Hadoop MapReduce是一个用于处理大规模数据集的软件框架,适用于分布式计算环境。虽然MapReduce框架本身具有很好的可扩展性和容错性,但在某些情况下,任务执行可能会因为各种原因导致性能瓶颈。本文将探讨如何通过调整配置参数和优化算法逻辑来提高MapReduce任务的效率。
1233 0
|
数据采集 机器学习/深度学习 数据可视化
数据挖掘实战:Python在金融数据分析中的应用案例
Python在金融数据分析中扮演关键角色,用于预测市场趋势和风险管理。本文通过案例展示了使用Python库(如pandas、numpy、matplotlib等)进行数据获取、清洗、分析和建立预测模型,例如计算苹果公司(AAPL)股票的简单移动平均线,以展示基本流程。此示例为更复杂的金融建模奠定了基础。【6月更文挑战第13天】
2696 3
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
1787 2
|
弹性计算 小程序 双11
阿里云服务器ECS经济型e实例99元一年,续费不涨价!
阿里云服务器ECS经济型e实例99元一年,续费不涨价!
502 0
|
SQL druid Java
SpringBoot集成mybatis拦截器修改表名
公司的框架是基于mysql5.7开发的,最近有一个应用项目部署在linux系统上,使用的是mysql8.0,安装时未开启大小写敏感忽略,客户又不允许重装mysql环境,导致一些框架代码和业务代码中表名使用大写的地方会出现表名找不不到的情况,所以需要进行统一处理
388 0