php面试题简略整理

  • 开发一个电影购票系统,有哪些需求和流程
    • 需求:
      1. 电影场次管理 对于电影场次进行增删改查,生成影票
      2. 影票管理订单的增、查
      3. 使用数据库(mysql或sqlite)保存用户信息、场次信息、影票信息,用户表、电影表、影院表、场次表、影票表、评论表;
    • 技术要求:
      1. 影院类
      2. 电影类
      3. 场次类
      4. 影票类
      5. 用户类
      6. 评论类
      7. 应用MVC模式
    • 购票流程:
      1. 用户注册登录,浏览电影列表,选择电影进行购票界面,购买影票,通过影票来提交电影评论;
      2. 浏览电影的界面应当包括电影的列表,电影的预览图,电影相关的文字介绍,所有用户对该电影的评论;
      3. 购买影票界面应当提供对场次的搜索工具,搜索完成后相关的场次列表,通过选择相关场次显示该场次的坐位信息;
      4. 评论界面应当显示当前用户的购票记录,如果该记录有评论过则显示评论,如果没有则显示文本框让用户输入
  • 假如某商城要秒杀一定量的小米手机,我们要怎么做一些高并发的处理;
    • redis解决高并发问题
      1. redis之所以能解决高并发问的原因是它可以直接的访问内存,而以往我们用的是数据库(硬盘),提高了访问效率,解决了数据库服务器的压力;
      2. 为什么redis的地位越来越高,我们为何不选择memcahe,因为memcahe只能存储字符串,而redis存储类型很丰富(字符串、list、set),memcahe每个值最大能存储1M,存储资源有限,消耗内存,而redis可以存储1G,比memecahe安全,当服务器故障或者意外关机情况时,redis会把内存中的数据备份到硬盘中,而memcahe所存储的东西会丢失,这也说明了memcahe不适合做数据库用,可以用来做缓存;
      3. 举例redis解决瞬间秒杀活动,下面这个程序模拟了20w人一瞬间涌入这个页面进行秒杀,能够秒杀成功的只有500人,我们把先进来的用户放入redis队列中,当队列中的用户达到500时,后来用户就转到秒杀结束页面。这里用随机数来表示不同的用户

                             这里我们可以看到秒杀成功的第一个用户的id是208522,秒杀成功的最后一个用户是176260,参与秒杀人数总共                               是20w。(让大家注意这些的原因是为了验证下面的准确性)。

                             接下来我们依次从队列中把秒杀成功的500个用户取出来并观察第一个用户和最后一个用户是否跟之前的记录                               值一样

                             

                             

                             

                            我们可以看到从秒杀成功队列中依次取出的第一个用户id是208522,最后一个用户是176260,可以看出结果

                            是很准确的。

  • 数据库问题,一张表中存有id、name、分数,每个用户有几个不同的分数,求每个用户的最大分数
    • select 用户名,max(分数) from tablename group by 用户名
  • 给你一个人的身份证号码,通过身份证号码的到此人属于什么生肖;
    • 1、PHP根据身份证号码,获取性别。

      2、PHP根据身份证号码,获取生日。

      3、PHP根据身份证号码,计算年龄。

      4、PHP根据身份证号码,获取地址。

      5、PHP判断字符串,是不是身份证号码。

      6、PHP根据身份证号码,获取生肖。

      7、PHP根据身份证号码,获取星座。

    • <?php
       
      /**
       *  根据身份证号码获取性别
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       *  @return int $sex 性别 1男 2女 0未知
       */
      function get_sex($idcard) {
          if(empty($idcard)) return null; 
          $sexint = (int) substr($idcard, 16, 1);
          return $sexint % 2 === 0 ? '女' : '男';
      }
       
      /**
       *  根据身份证号码获取生日
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       *  @return $birthday
       */
      function get_birthday($idcard) {
          if(empty($idcard)) return null; 
          $bir = substr($idcard, 6, 8);
          $year = (int) substr($bir, 0, 4);
          $month = (int) substr($bir, 4, 2);
          $day = (int) substr($bir, 6, 2);
          return $year . "-" . $month . "-" . $day;
      }
       
      /**
       *  根据身份证号码计算年龄
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       *  @return int $age
       */
      function get_age($idcard){  
          if(empty($idcard)) return null; 
          #  获得出生年月日的时间戳 
          $date = strtotime(substr($idcard,6,8));
          #  获得今日的时间戳 
          $today = strtotime('today');
          #  得到两个日期相差的大体年数 
          $diff = floor(($today-$date)/86400/365);
          #  strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比 
          $age = strtotime(substr($idcard,6,8).' +'.$diff.'years')>$today?($diff+1):$diff; 
          return $age; 
      } 
       
      /**
       *  根据身份证号码获取出身地址
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       *  @return string $address
       */
      function get_address($idcard, $type=1){
          if(empty($idcard)) return null;
          $address = include('./address.php');
          switch ($type) {
              case 1:
                      # 截取前六位数(获取基体到县区的地址)
                      $key = substr($idcard,0,6);
                      if(!empty($address[$key])) return $address[$key];
                      # 截取前两位数(没有基体到县区的地址就获取省份)
                      $key = substr($idcard,0,2); 
                      if(!empty($address[$key])) return $address[$key];
                      # 都没有
                      return '未知地址';
                  break;
              case 2:
                      # 截取前两位数(只获取省份)
                      $key = substr($idcard,0,2); 
                      if(!empty($address[$key])) return $address[$key];
                  break;
              default:
                      return null;
                  break;
          }
      }
       
      /**
       *  判断字符串是否是身份证号
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       */
      function isIdCard($idcard){
          #  转化为大写,如出现x
          $idcard = strtoupper($idcard);
          #  加权因子
          $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
          $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
          #  按顺序循环处理前17位
          $sigma = 0;
          #  提取前17位的其中一位,并将变量类型转为实数
          for ($i = 0; $i < 17; $i++) {
              $b = (int)$idcard{$i};
              #  提取相应的加权因子
              $w = $wi[$i];
              #  把从身份证号码中提取的一位数字和加权因子相乘,并累加
              $sigma += $b * $w;
          }
          #  计算序号
          $sidcard = $sigma % 11;
          #  按照序号从校验码串中提取相应的字符。
          $check_idcard = $ai[$sidcard];
          if ($idcard{17} == $check_idcard) {
              return '是正确的身份证';
          } else {
              return '错误的身份证';
          }
      }
       
      /**
       *  根据身份证号,返回对应的生肖
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       */
      function get_zodiac($idcard){ //
          if(empty($idcard)) return null;
          $start = 1901;
          $end = (int)substr($idcard, 6, 4);
          $x = ($start - $end) % 12;
          $val = '';
          if ($x == 1 || $x == -11) $val = '鼠';
          if ($x == 0)              $val = '牛';
          if ($x == 11 || $x == -1) $val = '虎';
          if ($x == 10 || $x == -2) $val = '兔';
          if ($x == 9 || $x == -3)  $val = '龙';
          if ($x == 8 || $x == -4)  $val = '蛇';
          if ($x == 7 || $x == -5)  $val = '马';
          if ($x == 6 || $x == -6)  $val = '羊';
          if ($x == 5 || $x == -7)  $val = '猴';
          if ($x == 4 || $x == -8)  $val = '鸡';
          if ($x == 3 || $x == -9)  $val = '狗';
          if ($x == 2 || $x == -10) $val = '猪';
          return $val;
      }
       
      /**
       *  根据身份证号,返回对应的星座
       *  author:xiaochuan
       *  @param string $idcard    身份证号码
       */
      function get_starsign($idcard){
          if(empty($idcard)) return null;
          $b = substr($idcard, 10, 4);
          $m = (int)substr($b, 0, 2);
          $d = (int)substr($b, 2);
          $val = '';
          if(($m == 1 && $d <= 21) || ($m == 2 && $d <= 19)){
              $val = "水瓶座";
          }else if (($m == 2 && $d > 20) || ($m == 3 && $d <= 20)){
              $val = "双鱼座";
          }else if (($m == 3 && $d > 20) || ($m == 4 && $d <= 20)){
              $val = "白羊座";
          }else if (($m == 4 && $d > 20) || ($m == 5 && $d <= 21)){
              $val = "金牛座";
          }else if (($m == 5 && $d > 21) || ($m == 6 && $d <= 21)){
              $val = "双子座";
          }else if (($m == 6 && $d > 21) || ($m == 7 && $d <= 22)){
              $val = "巨蟹座";
          }else if (($m == 7 && $d > 22) || ($m == 8 && $d <= 23)){
              $val = "狮子座";
          }else if (($m == 8 && $d > 23) || ($m == 9 && $d <= 23)){
              $val = "处女座";
          }else if (($m == 9 && $d > 23) || ($m == 10 && $d <= 23)){
              $val = "天秤座";
          }else if (($m == 10 && $d > 23) || ($m == 11 && $d <= 22)){
              $val = "天蝎座";
          }else if (($m == 11 && $d > 22) || ($m == 12 && $d <= 21)){
              $val = "射手座";
          }else if (($m == 12 && $d > 21) || ($m == 1 && $d <= 20)){
              $val = "魔羯座";
          }
          return $val;
      }
       
       
       
       
       
      echo '<br/>性别:'.get_sex('身份证号码').'<br/>';
      echo '<br/>生日:'.get_birthday('身份证号码').'<br/>';
      echo '<br/>年龄:'.get_age('身份证号码').'<br/>';
      echo '<br/>地址:'.get_address('身份证号码').'<br/>';
      echo '<br/>状态:'.isIdCard('身份证号码').'<br/>';
      echo '<br/>生肖:'.get_zodiac('身份证号码').'<br/>';
      echo '<br/>星座:'.get_starsign('身份证号码').'<br/>';
       
       
      ?>

       

            备注:该内容是根据自身面试时问到的问题及在网上搜集的健全答案,所答问题并非原创;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值