PHP 面试考察点

PHP 招聘要求总结

硬性要求

  • 熟悉常用的算法和数据结构
  • 熟悉(精通) PHP
  • 熟悉 PHP 框架:Laravel、Yii
  • 熟悉 HTML 5 + CSS 3
  • 熟悉 CSS 框架:Bootstrap
  • 熟悉(精通) JavaScript
  • 熟悉 JavaScrip 框架:Vue.js、React.js
  • 熟悉 设计模式、熟悉 MVC 模式
  • 熟悉 HTTP、HTTP 2、TCP、UDP 等标准协议
  • 熟悉 Apache、Nginx 等 Web 服务器的配置、调优及问题定位分析
  • 熟悉 MySQL,熟悉 SQL 调优和数据结构设计
  • 熟悉 NoSQL 数据库:Redis、MongoDB
  • 熟悉 Linux,了解 Linux 常用命令及工具
  • 熟悉 Web 安全相关内容并有相关实践经验
  • 熟悉前端性能优化
  • 有高性能数据库设计的开发经验
  • 有高并发、高访问量的开发经验

加分项

  • 熟悉 PHP7、ES6、TypeScript
  • 熟悉 NodeJS
  • Elasticsearch

PHP 面试考察点

  • PHP 框架考察点
  • JavaScript、jQuery、AJAX 基础知识考察点
  • Linux 基础知识考察点
  • MySQL 数据库考察点
    • MySQL 基础知识
    • MySQL 高性能索引创建
    • MySQL SQL 语句编写和优化
    • MySQL 的高可扩展和高可用及安全性
  • 程序设计考察点
  • 数据结构、常见算法考察点
    • 常见数据结构特征
    • 算法的工作原理
    • 时间复杂度
    • 空间复杂度
    • 其他逻辑算法
    • PHP 内置函数实现
  • 高并发解决方案考察点
    • 如何理解高并发
      • PV
      • UV
      • QPS
    • QPS 阶段性优化
    • 优化案例
      • 防盗链
      • 减少 HTTP 请求
      • 浏览器缓存
      • CDN
      • 数据库缓存(Memcache/NoSQL)
      • MySQL 的读写分离
      • 分区以及分库分表
      • LVS 负载均衡
  • 面前准备与面试注意事项

JavaScript、jQuery、AJAX

JavaScript、jQuery

  • 回顾真题:下列不属于 JavaScript 语法关键/保留字的是(var、$、function、while)
  • 考点分析:JavaScript 基本语法
  • 知识延伸:
    • JavaScript 内置对象
    • JavaScript HTML DOM 对象
    • jQuery 基础知识

实践真题

1
2
3
4
/**
* JavaScript 中为 id 是 test 的元素设置样式为 good
* 要求使用 jQuery 事件写在页面元素加载完成之后,动态绑定 click 事件到 btnOK 元素
*/

AJAX

  • 回顾真题:AJAX 技术利用了什么协议?简述 AJAX 的工作机制
    • 概念:Asynchronous JavaScript and XML
    • 作用:通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新
  • 考点分析:AJAX 基本工作原理
    • XMLHttpRequest 对象是 AJAX 的基础
      • XMLHttpRequest 对象请求方法:open(method,url,async)、send(string)
      • XMLHttpRequest 对象响应
        • 属性:responseText、responseXML,readyState
        • 事件:onreadystatechange
  • 知识延伸:
    • 原生 JavaScript AJAX 操作
    • jQuery 的 AJAX 操作
      • $(ele).load();
      • $.ajax()
      • $.get()
      • $.post()
      • $.getJSON()
      • $.getScript()

实践真题

1
2
3
// 写出原生 JavaScript AJAX 操作 TODO
// 写出 jQuery 处理 AJAX 的方法 TODO

数据结构、常见算法考察点

常见算法

  • 回顾真题:请写出常见的排序算法,并用 PHP 实现冒泡排序,将数组按照从小到大的方式进行排序。
  • 考官考点:
    • 冒泡排序原理和实现
  • 知识延伸:
    • 算法的概念
    • 时间复杂度和空间复杂度的概念
    • 常见排序算法
    • 常见查找算法
  • 解题方法:此类考点非常重要也比较复杂,需要考生充分理解各种排序算法和查找算法的原理以及实现方式,另外还需要理解时间复杂度和空间复杂度的计算方式和概念,此类考察点毋庸置疑是考察考生的逻辑思维能力,因此需要大家仔细研究各种算法的实现方式。
  • 一网打尽:

    • 请简述时间复杂度和空间复杂度概念
    • 对无序数组排序,最优的时间复杂度是什么,用 PHP 或者 JavaScript 写出一个实际的例子,该算法的空间复杂度是什么?
    • 一个有序数组中,查询特定 item 是否存在的最优算法是什么?时间复杂度是什么?
  • 算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。

  • 一个问题可以有多种算法,每种算法都有不同的效率。
  • 一个算法具有五个特征:有穷性、确切性、输入项、输出项、可行性。
时间负责度和空间复杂度的概念

算法评定:算法评定的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。

时间复杂度:执行算法所需要的计算工作量。一般来说,计算机算法是问题规模 n 的函数 f(n),算法的时间复杂度也因此记做 T(n) = O(f(n))。问题的规模 n 越大,算法执行的时间的增长率与 f(n) 的增长率正相关,称作渐进时间复杂度。

时间复杂度计算方式:O(n^2)、O(1)、O(n)?,第一,得出算法的计算次数公式。例如 1+2+3+...+n,相当于 for($i = 1; $i <= $n; $++){$sum += $i;},这个算法的计算次数为 n 次,那么这个算法的时间复杂度是 O(n)。第二,用常数 1 来取代所有时间当中的所有加法常数,例如上述算法,不管 $i 等于多少,都只计算 $i + 3 次,那么这个算法的时间复杂度不能为 O(3),而是 O(1)。第三,在修改后的运行次数函数中,只保留最高阶项,比如最终计算次数是 n^2+n+1,那么时间复杂度为:O(n^2)。第四,如果最高阶存在且不是1,则去除与这个项相乘的常数,比如最终计算次数是 2n^+3n+1,那么时间复杂度为:O(n)

时间复杂度举例

常数阶:O(1)

1
2
3
4
5
6
function test($n){
echo $n;
echo $n;
echo $n;
}
test();

线性阶:O(n)

1
2
3
```
平方阶/立方阶:O(n^2)/O(n^3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
对数阶:O(log2n)
```php
<?php
$n = 20;
while($n >= 1){
$n = $n/2;
}
/**
* n
* n/2
* n/2/2
* n/2/2/...
*
* n/(2^m) = 1
* 2^m = n
* m = log2n 或 m = logn
*/
  • 常见时间复杂度:
    • 常数阶
    • 线性阶
    • 平方阶
    • 立方阶
    • 对数阶
    • nlog2n 阶
    • 指数阶
  • 效率从高到底
    • O(1)
    • O(log2n)
    • O(n)
    • O(n^2)
    • O(n^3)
    • O(2^n)
    • O(n!)
    • O(n^n)

空间复杂度:算法需要消耗的内存空间,记作 S(n)=O(f(n))。包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占用的空间这三个方面。计算和表示方法与时间复杂度类似,一般用复杂度的渐进性来表示。

排序算法

  • 冒泡排序
  • 直接插入排序
  • 希尔排序
  • 选择排序
  • 快速排序
  • 堆排序
  • 归并排序

冒牌排序

原理:两两相邻的数进行比较,如果反序就交换,否则不交换。时间复杂度:最坏 O(n^2),平均 O(n^2);空间复杂度:O(1)。

1
<?php

直接插入排序

原理:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。时间复杂度:最坏 O(n^2) 平均 O(n^2);空间复杂度:O(1)。

1
<?php

希尔排序

原理:把待排序的数据根据增量分成几个子序列,对子序列进行插入排序,直到增量为 1,直接进行插入排序;增量的排序,一般是数据的长度的一半,再变为原来增量的一半,直到增量为 1。时间复杂度:最坏 O(n^2),平均 O(nlog2n);空间复杂度:O(1)。

1
<?php

选择排序

原理:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。时间复杂度:最坏 O(n^2),平均 O(n^2)。空间复杂度:O(1)。

1
<?php

快速排序

原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归完成。时间复杂度:最差 O(n^2),平均 O(nlog2n);空间复杂度是 最差 O(n),平均 O(log2n)

1
<?php

堆排序

原理:把待排序的元素按照大小在二叉树位置上排列,排序好的元素要满足:父节点的元素要大于等于子节点;这个过程叫做堆化过程,如果根节点存放的是最大的数,则叫做大根堆,如果是最小,就叫小跟堆,可以把根节点拿出来,然后再堆化,循环到最后一个节点。时间复杂度:最差 O(nlog2n),平均 O(nlog2n)。空间复杂度:O(1)

1
<?php

归并排序

原理:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。时间复杂度:最差 O(nlog2n),平均 O(nlog2n)。 空间复杂度是:O(n)。

1
<?php

查找算法:

  • 二份查找
  • 顺序查找

二分查找

原理:从数组的中间元素开始,如果中间元素正好是要查找的元素,搜索结束。如果某一个特定元素大于或者小于中间元素,则在数组大于或者小于中间元素的那一半中查找,而且跟开始一样从中间开始比较,如果某一步骤数组为空,代表找不到。时间复杂度:最差 O(log2n),平均 O(log2n)。空间复杂度:迭代 O(1),递归 O(log2n)

1
<?php

顺序查找

原理:按一定的顺序检查数据中每一个元素,直到找到所需要寻找的特定值为止。时间复杂度:最差 O(n),平均 O(n);空间复杂度:O(1)。

1
<?php

总结:二分查找算法的时间复杂度最差是 O(log2n),顺序查找的时间复杂度是 O(n),所以二份查找算法更快,但是递归情况下,二分查找算法更加消耗内容,时间复杂度为 O(log2n)。