yulu

普通PHP面试遇到的问题4

  1. 根据简历中写的项目随便的问了几个问题,例如我写的Docker。
  2. CGI具体是什么
  3. mysql范式,分组查询,top查询,子查询,事务。mysql引擎有哪些。
  4. 跳台阶问题。
  5. 有一个全是7位数的文件A,写一个程序输入一个7位数tar,若tar在A中返回1,否则返回0。
  6. 并发问题。
  7. 但在浏览器键入一个网址到浏览器展示信息简要叙述都发生了什么。

分析

  1. CGI 具体指什么:CGI全称Common Gateway Interface (通用网关接口),是一种协议,用来规定客户端向服务端请求数据的时候,以哪种格式发送哪些数据。其与FastCGI的区别在于,当有一个请求需要处理的时候,CGI需要启动先一个解释器进程来处理请求。处理完成之后,该进程关闭。FastCGI是在请求没到来之前,以master-worker的形式,预先启动一个主进程和几个子进程。当请求到来时,就可以直接从子进程池中取出一个用来处理请求。节省了时间,大大提高了效率。但是相应的因为FastCGI预先启动了几个进程,占用了一部分CPU的内存。
  2. mysql范式包括如下:

    • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,即不可再分解(只要是关系性数据库都满足1NF);
    • 第二范式:2NF是对记录的唯一性约束,要求记录有唯一的标示,即实体的唯一性;
    • 第三范式:3NF是对字段冗余性的约束,即任何字段不能通过其他字段派生出来;但是没有字段冗余的数据库并不是最好的,有时候为了提高效率可以适当出现字段冗余;

      分组查询:group by,
      top查询:sum(),
      子查询:例如,select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
      事务:事务主要用来处理操作量大,复杂度高的数据。例如:在人员管理系统中,要删除一个人员,可能还要删除人员的其他信息。一般mysql只有使用了InonoDB数据库引擎的时候才支持事务。事务必须满足如下条件:

    • 原子性:要么成功,要么撤回;
    • 稳定性:有非法数据,事务撤回;
    • 隔离性:事务独立运行,如果一个事务处理后的结果影响了其他事务,那么其他事务会撤回;
    • 可靠性:在出现不可控的问题时,事务会根据数据库中存在的日志进行重构;

      mysql引擎:InnoDB,MyISAM。InnoDB支持事务,支持行级锁。MyISAM支持表级锁。

  3. 跳台阶问题:跳台阶问题,找零钱问题都是Fibonacci(斐波那契数列)的变形。老生常谈的问题了,递归或者非递归。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
    //递归实现
    function fib($n){
    if($n == 1){
    return 1;
    }
    if($n == 2){
    return 2;
    }
    return fib($n - 1) + fib($n - 2);
    }
    //非递归实现
    function fib2($n){
    $f1 = 1;
    $f2 = 2;
    for($i = 3; $i < $n; $i++){
    $f3 = $f1 + $f2;
    $f2 = $f3;
    $f1 = $f2;
    }
    return $f3;
    }
  4. 这个问题类似于《编程珠玑》 开头介绍的问题。所以我们可以采用书中给出的答案,即用一个很长的字符串来存储1000000-9999999,具体的存储方式类似于这样的:

    • 比如给定1-20中的几个数[1,4,7,9,14];
    • 可以用字符串:0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 来表示,不难发现这个字符串共有21位,每一位的值为1,则表示给出的数组中存在该元素。为0则不存在。
      这其实是利用了hash的思想。只不过在此处用一个字符串来简化内存消耗。当我们生成了一个这样的字符串的时候就不难去判断输入的数字是否在给定的数组中。
    • 第二种方法:可以通过对给出的原数组使用快速排序进行排序,然后再通过二分查找去查找(注:快排的时间复杂度是nlog(n),二分查找的复杂度是log(n))。
  5. 并发问题。
  6. 简要描述当在浏览器中键入网址到页面显示数据这一过程
    • 详细的看这里
    • 我的理解:
      step1: 通过查找DNS将域名解析成ip;
      step2: 浏览器开始发送请求;
      step3: webserver通过监听端口来接收和处理请求;
      step4: webserver返回数据,浏览器展示数据;