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

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

一:分析需求

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

1:什么是伪自动呢?

场景(1):

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

场景(2):

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

这种需求,完全可以

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

例如(1):

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

例如(2):

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

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

2:什么是真自动?

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

场景(1):

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

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

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

场景(2):

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

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

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

二:定时任务实现方式

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

1:phpweb方式

代码语言:javascript
复制
<?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 

代码语言:javascript
复制
<?php
while(true){
    //do定时任务逻辑
    sleep(1);
}

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

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

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

3:php web进阶方式

代码语言:javascript
复制
<?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,即可实现

代码语言:javascript
复制
<?php
///逻辑
代码语言:javascript
复制
#crontab -e
00 * * * * /usr/local/bin/php /home/www/crontab.php

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

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

5:linux大法:crontab phpweb

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

代码语言:javascript
复制
<?php
///逻辑
代码语言:javascript
复制
/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扩展已经实现了定时任务,只需要调用就行

代码语言:javascript
复制
<?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:阿里大法好

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

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

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

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

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

  • 上一篇: windows+nginx配置站点目录发生500的一个问题
  • 下一篇: php实现img转ASCII编码图片