yulu

面试总结

redis 与 memcache
两者区别
  1. 数据持久化
  2. 数据结构
  3. 内存管理方式
  4. 多线程还是单线程
  5. 数据如何保持一致性 事务和CAS
  6. 分布式的实现方式 一致性哈希
redis持久化的实现
  1. 快照
  2. AOF
    • no
    • everyfsync
    • always
mysql
  1. sql 语句
  2. group by,order by ,limit顺序以及应用
  3. where与having区别
  4. jion on的三种方式 left ,rigit
  5. 数据库引擎:
    • Innodb
      支持事务,行级锁,使用聚集索引
    • MySIAM
      不支持事务,表级锁,使用非聚集索引
  6. 索引的实现原理:
    B+Tree
  7. 事务:
    • 特性:原子性,一致性,隔离型,持久性
    • 级别:读未提交,读提交,可重复读,序列化
  8. 数据库的分区,分表:
    • 分表:merge引擎
    • 分区:range,list,key,hash
  9. 如何优化数据库
  10. 分布式,读写分离,主从同步
  11. doublewrite 机制
  12. 存储时间的类型 datetime
nginx 与 apache 区别
  1. 优缺点
  2. nginx负载均衡的实现方式
  3. 启动PHP的方式:mod ,端口号或者unix,socket文件
HTTP协议
http概念
request
  1. 请求行:各种请求方法
  2. 消息报头
  3. 消息体
response
  1. 状态行:各种状态码都是什么含义
  2. 消息报头
  3. 消息体
长链接与短链接的优缺点
TCP协议
  1. 三次握手
  2. 四次挥手
  3. TCP与UDP区别
进程与线程
  1. 概念
  2. 进程间的通信方式:管道,消息队列
面向对象
  1. 什么是面向对象
    封装,继承,多态;展开解释
  2. 接口和抽象类的区别
设计模式
  1. 举例设计模式
    工厂,单例,观察者,适配器,mvc
  2. 实现单例模式:
    以下是一个简单的实现方式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Test{
    private static $test = null;
    private function __construct();
    public function getTest(){
    if(self::$test == null){
    self::$test = new Test();
    return self::$test;
    }
    }
    private function __clone();
    }
PHP
PHP常用函数:
  1. array函数及说明:

    1
    2
    3
    array_shift(),array_unshift(),array_push(),array_pop(),array_merge(),array_map()
    array_keys(),array_key_exists(),array_diff(),in_array(),array_values(),array_sum()
    array_slice()
  2. string函数及说明:

    1
    2
    strlen(),substr(),mb_substr(),strstr(),strrchr(),strpos(),str_replace(),str_repeat()
    unfirst(),ucwords(),chr(),ord(),trim(),implode(),
PHP 底层原理:
  1. 内核
  2. zend引擎
  3. 扩展
  4. 上层API
fast-cgi 与 cgi
魔术方法,全局变量
  1. 魔术方法

    1
    __construct() , __destruct() , __set() , __get() , __sleep() , __clone()
  2. 全局变量

    1
    _SERVER,_POST,_GET,_COOKIE
描述用户在浏览器端输入地址到页面展示数据的过程
语法基础
  1. empty() 与 isset()
  2. display_error() 与 error_report()
  3. 获取客户端的方法
  4. datetime与strtotime的应用
  5. PHP的copy on write,即变量引用的底层实现
  6. 垃圾回收机制底层实现
  7. 如何获取header中的信息
框架
  1. 对框架的认识,理解
web 安全
  1. DDos
  2. sql注入:参数化查询
  3. xss跨站脚本攻击:
  4. CSRF跨站请求伪造:版本号
对于高并发的处理方式
  1. 使用队列的方式
  2. 使用版本号的方法
  3. 提高服务的抗压能力:
    • 首先考虑服务的硬件
    • 服务器
    • 代码模块化
    • 缓存
    • 数据库
项目
  1. 做过的项目一定要弄明白
常考算法
  1. 二分查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function binaryFind($arr,$target)
    {
    $left = 0;
    $right = count($arr);
    while($left < $right){
    $mid = $left + ($right - $left) >> 1;
    if($arr[$mid] == $target){
    return $mid;
    }else if($arr[$mid] > $target){
    $right = $mid - 1;
    }else{
    $left = $mid + 1;
    }
    }
    return -1;
    }
  2. 快速排序:

    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
    26
    27
    function quickSort($arr,$start,$end)
    {
    if($start < $end){
    $p = $arr[$start];
    $i = $start;
    $j = $end;
    while($i < $j){
    while($i < $j && $arr[$j] > $p){
    $j --;
    }
    if($i < $j){
    $arr[$i++] = $arr[$j];
    }
    while($i < $j && $arr[$i] < $p){
    $i ++;
    }
    if($i < $j){
    $arr[$j--] = $arr[$i];
    }
    }
    $arr[$i] = $p;
    quickSort($arr,$start,$i-1);
    quickSort($arr,$i+1,$end);
    }
    return $arr;
    }
  3. 斐波那契类似递归

    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
    //递归
    function test($n)
    {
    if($n == 1){
    $return 1;
    }
    if($n == 2){
    $return 1;
    }
    return test($n - 1) + test($n - 2);
    }
    //非递归
    function test($n)
    {
    $x1 = 1;
    $x2 = 1;
    for($i = 3; $i < $n; $i++){
    $x3 = $x1 + $x2;
    $x2 = $x3;
    $x1 = $x2;
    }
    return $x3;
    }
  4. 已知有序数列中有一个重复的元素,去除

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function del($arr)
    {
    $index = 1;
    $n = count($n);
    for($i = 1; $i < $n; $i++){
    if($arr[$i] != $arr[$i - 1]){
    $arr[$index] = $arr[$i];
    $index ++;
    }
    }
    return $arr;
    }
  5. 给定一个序列,求序列中最大连续字数组和

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function getMax($arr)
    {
    $n = count($arr);
    $curr = 0;
    $max = $arr[0];
    for($i = 0; $i < $n; $i++){
    $curr = $curr + $arr[$i] > $arr[$i] ? $curr + $arr[$i] : $arr[$i];
    $max = $curr > $max ? $curr : $max;
    }
    return $max;
    }
  6. Top-K 问题
    堆排序,小顶堆

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //调节堆
    void heapAdjust(int a[], int root, int n)
    {
    int tmp = a[root];
    int child = 2 * root + 1;
    while(child < n){
    if(child + 1 < n && a[child + 1] < a[child])
    child ++ ;
    if(a[child] < a[root]){
    a[root] = a[child];
    root = child;
    child = 2 * root + 1;
    }else{
    break;
    }
    a[child] = tmp;
    }
    }
    //初始化堆
    void heapBuild(int a[], int n)
    {
    for(int i = (n-1) / 2; i < n; i--){
    heapAdjust(a,i,n);
    }
    }
    //排序
    void heapSort(int a[], int n)
    {
    heapBuild(a,n);
    for(int i = n - 1; i > 0; i--){
    swap(arr[i],arr[0]);
    heapAdjust(a,i,n);
    }
    }
linux
  1. shell编程
  2. 常用命令

    • 端口占用情况
    • 进程启动数量查看
    • top
    • find,grep,crontab
  3. 统计日志 awk

总结

暂时想到这些,后续如果还能回忆起来会追加上。
另:以上感觉是后端从业者应知应会的基本问题;如果上面问题能够对答如流,那BAT应该可以进了。