php - 模拟登陆图书馆 自动发邮件的程序优化思路

查看:157
本文介绍了php - 模拟登陆图书馆 自动发邮件的程序优化思路的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

用php CI框架(这个无所谓,主要是想问一下思路)写的一个检测图书馆书籍借阅时间,自动发送邮件的功能。

流程

1、查询数据库
2、取得用户账号和密码,模拟登陆
3、抓取图书信息,取得用户所有图书到期时间,判断如果时间小于两天,发送邮件。
4、重复 2、3步骤,直到遍历完所有用户。

当用户人数达到3万时,程序会不会不崩掉,应该怎么优化。想问一下,优化的思路。

public function email()
    {
         $data = $this->lib_model->M_getUserAndEmail();//取得用户账户
         foreach ($data as $keys){ 
             $bookData = $this->imitateLogin($keys['sdutnum'],$keys['lib_pwd']);//模拟登陆
             for($i=1;$i<=$bookData['bookNum'];$i++) //遍历用户所有图书
             {
                $returnTime = substr($bookData['bookArray']['0'][$i*8+4],65,-13);//获取还书时间
                $day = floor((strtotime($returnTime) - strtotime(date('Y-m-d')))/86400); //计算图书距离归还的时间
                $bookName = substr($bookData['bookArray']['0'][$i*8+1],111,-10);
                $title = "山东理工图书到期提醒";
                $content = $keys['sdutnum'].",您的".$bookName."将于".$returnTime."到期";/*add link about address in here.*/
                if($day<=2){
                    $this->sendEmail($keys['email'],$title,$content); //发送邮件
                    echo "邮件发送完成";
                }
            }
         }
    }

解决方案

不管你其他的业务,假设你现在有了用户信息,和其所借书籍归还时间
说下这块的优化.
先说你现在业务的缺点,你上面说遍历所有的数据,这是很不合适的数据一多,速度慢不说,而且效率很低,时间复杂度都是 O(n).
如果是我做,我会有两个脚本
一个脚本每3个小时搜集一次用户的借书信息,把用户邮箱,归还日期插入到 redis 的有序集合中, score 用日期

一个脚本每天凌晨跑一次,从 redis 有序集合中获取两天内要还书的用户数据,条件就是

score <  time()+两天秒数

这篇关于php - 模拟登陆图书馆 自动发邮件的程序优化思路的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆