zoukankan      html  css  js  c++  java
  • php l练习(写着玩)

    • 需求:假设今天24号,今天发表的评论显示几小时前发布,23号发布的显示 昨天几点发布的,再往前的就直接显示年月日。
      date_default_timezone_set('PRC');
      // $create_time = 1561377423;
      $create_time = 1561219392;
      // $create_time = 1561132890;
      //最又那种形式: 
      //获取凌晨时间戳
      $start = date('Y-m-d');
      $start_time = strtotime($start);
      //前一天凌晨时间戳
      $last_start_time = strtotime(date('Y-m-d', strtotime('-1 day')));
      //数据库中发表评论的时间和凌晨时间对比
      if($create_time < $start_time && $create_time > $last_start_time){
          //说明不是在今天发表的评论
          $lastOneDay = date('H:i:s',$create_time);
          echo '发表于--昨天'.$lastOneDay;
      }elseif($create_time >= $start_time){
          $time_diff = time() - $create_time;
          $time_diff = round($time_diff / 3600);
          echo 'publish before'.$time_diff,'hours';
      }else{
          echo 'publish '.date('Y-m-d H:i:s',$create_time);
      }
      计算时间差
    • 接口本来是默认返回4篇文章显示在快应用里, 现在需要改一下.  需求: 前端不改代码, 后端每天自动添加两条数据, 就是说保留之前接口返回的数据, 然后每天再自动添加2 条(第一天:4 条 第二天: 6条 第三天: 8条 以此类推), 开始没想出来, 后来突然发现其实就是limit('4')改成limit($limit), 然后让$limit 每天自动递增就OK了. 其实重点在于按天递增.  他和之前的计算发表时间不同, 发表时间是判断数据库存的时间(addtime)是不是在一天的范围内. 而这个是按照前端请求接口的时间是不是在一天范围内.
      date_default_timezone_set('PRC');
      //判断前端请求接口的时间
      $firstTime = 1567008000; //默认把2019/8/29作为第一天(接口第一次请求的时间), 然后之后每天接口请求的时候,自动把$limit + 2  (如果是一天内多次请求接口, limit不变)
      $currentTime = time();
      $days = floor(($currentTime-$firstTime)/(3600*24)); //计算距离第一次接口请求过了多少天. 那么就把$limit 加上天数, 就是现在要返回的数据量
      echo $days, '<hr>';
      $limit = 4; //第一次接口请求的时候, 默认返回4条数据
      $limit += $days;
      echo $limit;
      View Code
    • 需求: 每天只查询一次数据库.目前想到的有两种实现方法:
      (1) 在程序里设置每天定时查询一次数据库
      //简单写一下
      if(date('H:i:s') == 08:00:00){
          //todo  e.g:select db 
      }
      //continue...

      (2) 每天的第一次查询就是当天的唯一一次查询数据库(code里面的代码都是在actionTest方法中, 添加的时候没注意, 跑偏了)

      public static $temp_city = null;    //临时变量, 用来接收数据表中查询的city_list, 判断为null, 采取查询数据库
      public static $call_time = null;    //记录前端每天第一次调用的时间
      public  function actionTest() 
      {
           //每天只查询一次获取城市list的接口和一次citylist数据表, 如果聚合有更新可以直接添加到数据库
           if(self::$call_time === null){
                self::$call_time = time();
                self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all();    //第一次查询
                $r = $this->curlGet($url);    //调用curl请求接口
                //比较聚合数据和数据库的数据是否一致, 不一致则更新数据库
              }  
      }
      //比较$call_time 和 之后调用接口的时间进行比较是不是同一天, 如果是同一天则不查询数据库, 否则查询
              if(date('Y-m-d', self::$call_time) == date('Y-m-d')){
                  //说明在同一天, 什么都不用做
              } else{
                  self::$call_time = time();    //把当前时间重新赋值给$call_time
                  self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all();    //每天的第一次查询
                  $r = $this->curlGet($url);
              }
      //比较数据库的数据和聚合的数据是不是一样的, 如果不一样那么更新数据库的数据, 否则不需更新
              $tmp = [];
              $r = json_decode($r, true);
              if(!empty(self::$temp_city)){
                  foreach (self::$temp_city as $k=>$v){
                      $tmp[] = $v['city'];
                  }
              }
      
              foreach($r['result'] as $k=>$v){
                  if(!in_array($v['city'], $tmp)){
                      $insert = new WeihaoCity();
                      $insert->city = $v['city'];
                      $insert->cityname = $v['cityname'];
                      $insert->addtime = time();
                      if(!$insert->save()){
                          return $insert->errors;
                      }
                      self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all();
                  }
              }
      View Code

      有几点注意一下:  (1) in_array() 第二个参数不能是多维数组, 必须要把多维数组变成一维数组. 不会递归判断的.
      (2) json_decode()  他的作用是把json对象转换成数组(第二个参数为true的情况下), 但是第一个参数不可以是数组(也是第二个参数为true的情况), 如果传入一个数组, 那么返回的结果将是空数组. 
      (3) yii中使用new model 添加数据的时候, 如果是遍历循环插入数据的情况, 那么要注意, new model 的操作一定要在循环体中执行, 如果在循环体外面执行, 那么最终插入数据库的记录只有遍历的最后一条数据. 

  • 相关阅读:
    Vector成员为指针时要注意的问题
    (转)C++中的static关键字的总结
    (转)内联(inline)函数与虚函数(virtual)的讨论
    基类类型和派生类型之间的转换以及虚函数
    (转) vector的reserve和resize
    关于函数返回值的一些见解
    (转)感受异或的神奇
    一个mysql不解的问题
    获取本机TCP连接状态信息
    (转)socket的SYN_RECV和ESTABLISHED状态
  • 原文地址:https://www.cnblogs.com/bneglect/p/11079224.html
Copyright © 2011-2022 走看看