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

一:分析需求

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

1:什么是伪自动呢?

场景(1):

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

场景(2):

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

这种需求,完全可以

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

例如(1):

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

例如(2):

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

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

2:什么是真自动?

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

场景(1):

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

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

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

场景(2):

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

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

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

二:定时任务实现方式

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

1:phpweb方式

1

2

3

4

5

6

7

8

9

10

<?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

1

2

3

4

5

<?php

while(true){

    //do定时任务逻辑

    sleep(1);

}

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

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

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

3:php web进阶方式

1

2

3

4

5

6

7

8

9

10

11

12

13

<?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,即可实现

1

2

<?php

///逻辑

1

2

#crontab -e

00 * * * * /usr/local/bin/php /home/www/crontab.php

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

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

5:linux大法:crontab phpweb

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

1

2

<?php

///逻辑

1

*/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扩展已经实现了定时任务,只需要调用就行

1

2

3

4

5

6

7

<?php

swoole_timer_tick(3000, function () { 

    echo "after 3000ms.\n";  

    swoole_timer_after(14000, function () {    

        echo "after 14000ms.\n";

    });

});

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

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

8:windows定时任务

该定时任务我有在我另一个博文说明:shopnc自动结算的问题-仙士可博客-后端工程师的成长之路

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

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

9:阿里大法好

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

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

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

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

php计划任务 定时任务异步多种方式实现相关推荐

  1. JavaScript实现类似sleep()的多种方式

    编写复杂的JavaScript脚本时,有时会有需求希望脚本能停滞指定的一段时间,类似于 java 中的 Thread.sleep 或者 sh 脚本中的 sleep 命令所实现的效果. 很多语言都有sl ...

  2. python做定时任务的方式及优缺点_python BlockingScheduler定时任务及其他方式的实现...

    本文介绍了python BlockingScheduler定时任务及其他方式的实现,具体如下: #BlockingScheduler定时任务 from apscheduler.schedulers.b ...

  3. 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...

  4. Vue通信、传值的多种方式,详解

    Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...

  5. Linux计划任务-定时任务

    Linux计划任务-定时任务 at单次计划任务 at命令格式 查看at任务 取消at计划任务 创建1分钟后的单次任务 定时任务分类 cron`系统任务调度` /etc/crontab文件格式 用户任务 ...

  6. Linux 多种方式实现文件共享

    文件共享服务在Linux系统上有多种方式,最常用的有Samba,vsftp,iSCSI,NFS这四种方式,如下将分别配置四种不同的文件共享服务. VSFTP 文件传输 FTP是文件传输协议.用于Int ...

  7. Java 异步编程 (5 种异步实现方式详解)

    同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现 @mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Compl ...

  8. Midjourney官方中文版在QQ开启内测申请;“Hi,Siri”将成历史,苹果计划修改语音助手唤醒方式|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  9. 多种方式实现文件下载功能

    多种方式实现文件下载功能 (1)使用 NSURLConnection 直接方式 (2)使用 NSURLConnection 代理方式 (3)使用 NSURLsession 直接方式 (4)使用 NSU ...

最新文章

  1. Gartner发布2021年重要战略科技趋势!
  2. 回溯法和DFS leetcode Combination Sum
  3. centOS 安装mysql5.6
  4. 【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型运算符与类型分析
  5. 推荐15个 JavaScript 和 CSS 库
  6. 第七章 scikit-learn与机器学习实战
  7. 技嘉 b360m d3h-cf efi_技嘉Geforce RTX 3080 GAMING OC 10G评测:性能入魔,方为魔鹰_显卡...
  8. phtread条件变量pthread_cond_t初始化方式
  9. 蓝桥杯真题 杨辉三角形 C++
  10. linux系统下头文件、库文件搜索路径总结
  11. 无卷积结构(那就纯ransformer)的参考图像分割:ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  12. Elasticsearch快速初始化数据
  13. kodi树莓派_树莓派如何安装最新版Kodi 18.6 及树莓派4B针对Kodi的优化
  14. 学习Ansible自动化
  15. autoCAD 创建对象 使用面域 创建图案填充
  16. 新框架(BSF_JAVA)环境部署个人总结
  17. 周末和新润视频聊天了
  18. 毕业设计-基于微信小程序的实验室服务系统
  19. 浅聊OpenHarmony
  20. 蓝牙耳机充电仓单芯片IC解决方案汇总

热门文章

  1. 用于溢出漏洞研究的Socket服务端程序
  2. 基于NLP自然语言以token单位的chatgpt计费方式和收费标准
  3. LaTeX-如何使用Overleaf撰写论文
  4. 使用xshell登录阿里云
  5. pikachu—CSRF
  6. 学生认证,专业版pycharm
  7. rand函数生成伪随机数
  8. Math 相关的用法
  9. React.lazy()
  10. integer java关键字,integer是关键字吗 integer在c语言中是什么意思