19年面试清单(总)

系统相关
  1. 一道面试题:说说进程和线程的区别

    1. 进程是资源分配的最小单位,线程是程序执行的最小单位。
    2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段、数据段、这种操作非常昂贵。而线程是共享进程中数据的,使用相同地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也要小很多。
    3. 线程之间通信更方便,同一进程共享全局变量、静态变量等数据,而进程之间需要以通信的方式(IPC)进行,不过如何处理好同步与互斥是编写多线程程序的难点。
    4. 但是多进程程序更加健壮,多线程程序只要有一个线程死掉,整个进程也就死掉了,而一个进程死掉不会对另一个造成影响,因为进程有自己的独立地址空间。
  2. shell 获取文件每行第三个元素 awk ‘{print $3}’ test”

  3. shell 输出当前的pid
    $$: 当前shell的pid
    $!:上一个进程的pid
    $?: 上个命令推出状态或函数返回值
    $0: 当前进程名
    $n: 传递给脚本第n参数
    $#: 传递给脚本或本函数的参数个数
    $*: 传给脚本的所有参
  4. 杀死所有的php-cgi进程

    1
    $kill -s 9 `ps -aux | grep php-cgi | awk '{print $2}'`

    《linux下杀死进程的10种方法》

  5. 查看 php-fpm

    1
    ps -ef|grep php

    《linux下查看php-fpm是否开启以及如何开启》

  6. 反射型XSS漏洞的条件+类型+危害+解决
语言相关
  1. 打印前一天时间
    date('Y-m-d H:i:s',strtotime('-1 day'))
  2. echo count(strlen(“http://php.net"))
    遇见次数:2
    手册解释:count传入非数组值会返回1,如果传入的值为NULL,返回0
    php5.4 输出 1
    php7.3 将会返回一个warning级别的错误,Parameter must be an array or an object that implements Countable.
  3. PHP的垃圾回收机制详解
  4. php–转码函数
    iconv
    mb_convert_encoding
  5. PHP 加密方式
    md5() crypt() sha1() urlencode() base64_encode()

  6. 下面程序输出结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $num = 1;
    function mutiple() {
    $num = $num * 10;
    }
    mutiple();
    echo $num;
    function mutiple1($num) {
    $num = $num * 10;
    }
    mutiple1($num);
    echo $num;

    1, 1

    程序设计
  7. 面向对象与面向过程优缺点

    面向过程
    优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
    缺点:没有面向对象易维护、易复用、易扩展。
    面向对象
    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
    缺点:性能比面向过程低

  8. 设计模式好处及常规的设计模式

    帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

    《你所学习的设计模式到底有什么用?到底怎么用?》

  9. 不使用第三个变量交换两个变量
    出现次数: 1
    方法一: 使用异或操作。
    方法二: 使用list($a, $b) = array($a, $b), 注意php7 会改变$a, $b 顺序。
    方法三: 字符串可以将两变量拼接后去截取。
  10. 遍历文件夹,出现次数:1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function myScanDir($filename) {
    $files = [];
    if (is_dir($filename)) {
    $handle = opendir($filename);
    while($file = readDir($handle)) {
    if (in_array($file, [".", ".."])) {
    continue;
    }
    $chirldFilename = $filename . DIRECTORY_SEPARATOR . $file;
    if (is_dir($chirldFilename)) {
    $files[$file] = myScanDir($chirldFilename);
    } else {
    $files[] = $file;
    }
    }
    closedir($handle);
    }
    return $files;
    }
  11. 多进程同时读写一个文件
    协同锁、LOCK_SH、LOCK_EX、LOCK_UN、LOCK_NB、

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function myWrite($filename, $output) {
    $handle = fopen($filename);
    if(flock($handle, LOCK_EX)) {
    fwrite($handle, $output);
    fflush($handle);
    flock($handle, LOCK_UN);
    } else {
    throw new exception("文件被占用");
    }
    fclose($handle);
    }
  12. 冒泡排序

  13. 最近最少使用缓存失效策略算法实现 LRU
  14. 内存256M, 10G文件排序实现 file sort
  15. 敏感词过滤

    1
    2
    3
    4
    5
    6
    7
    $badword = array(    
    '张三','张三丰','张三丰田'
    );
    $badword1 = array_combine($badword,array_fill(0,count($badword),'*'));
    $bb = '我今天开着张三丰田上班';
    $str = strtr($bb, $badword1);
    echo $str;
  16. 正则匹配html标签
    /<[^>]+>/g;
    用正则表达式匹配HTML标签

  17. 用五种方法获取文件扩展名

    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
    function get_ext1($file_name){
    return strrchr($file_name, '.');
    }

    function get_ext2($file_name){
    return substr($file_name, strrpos($file_name, '.'));
    }

    function get_ext3($file_name){
    return array_pop(explode('.', $file_name));
    }

    function get_ext4($file_name){
    $p = pathinfo($file_name);
    return $p['extension'];
    }

    function get_ext5($file_name){
    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
    }
    function get_ext6($file_name) {
    $tok = strtok($string, '.'); //使用strtok将字符串分割成一个个令牌
    while ($tok)
    {
    $arr[]= $tok;
    $tok = strtok('.'); //该函数会保持它自己的内部指针在字符串中的位置,
    //如果想重置指针,可以将该字符串传给这个函数.
    //所以当第二次调用strtok()函数时,如果对上一次的已分割的字符串进行分割,第1个参数可以省略
    }
    $count= count($arr);
    $i= $count-1;
    $file_type= $arr[$i];
    return $file_type;
    }
  18. 给定一个无序数组,找出其中未出现的最小正整数。

    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
        function firstMissingPositive(array $input) :int {
    $l = count($input);
    $i = 0;
    //var_export($input);
    while($i < $l) {
    if ($input[$i] > 0 && $input[$i] <= $l && $input[$input[$i] - 1] != $input[$i]) {
    $temp = $input[$input[$i] - 1];
    $input[$input[$i] - 1] = $input[$i];
    $input[$i] = $temp;
    } else {
    $i++;
    }
    //var_export($input);
    }
    //var_export($input);
    $i = 0;
    while ($i < $l && $input[$i] == $i + 1) {
    $i++;
    }
    return $i;
    }
    ```

    1. [搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节](https://blog.csdn.net/u014686180/article/details/52190864)

    ##### 数据库设计
    1. mysql快速清空数据库``` select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where table_schema in ('数据库1','数据库2');``` 然后再替换替换。

    1. mysql 查找重复记录
    假设表名user, 字段分别为id, username, email, 查询username重复的记录
    方法一:``` select id,username,count(*) as counts from user group by username having counts > 1;``` 可能会报错,5.7版本增加了对功能依赖的检测,select 的字段必须出现在 group by 中。
    修改方法 ``` select @@global.sql_mode; set @@global.sql_mode = "ONLY_FULL_GROUP_BY,....";``` 删除其中的 ONLY_FULL_GROUP_BY.或者设置my.ini
    方法二:5.7 版本
    查询重复字段: ``` select username from user GROUP BY username HAVING COUNT(*) > 1;```
    查询重复记录:```select * from user a where (select count(*) from user where username = a.username ) > 1 order by username; ```
    过滤记录:``` select * from user where id in (Select min(id) From user Group By username);
  19. mysql 查学生各科分数前三
    student_score{id,name,subject_id,score}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # mysql 删除ONLY_FULL_GROUP_BY
    select a.user_id, a.subject_id,a.score from student_score a
    inner join student_score b on b.subject_id = a.subject_id and a.score <= b.score
    group by a.user_id, a.subject_id
    having count(*) <= 3
    order by a.score desc;

    # 兼容版本
    select c.* from student_score c inner join
    (select a.user_id, a.subject_id from student_score a
    inner join student_score b on b.subject_id = a.subject_id and a.score <= b.score
    group by a.user_id, a.subject_id having count(*) <= 3) as d
    on c.user_id = d.user_id and c.subject_id = d.subject_id
    order by c.subject_id,c.score;
  20. 数据库评论回复功能 详见CSDN某大神著作《数据库设计——评论回复功能》

  21. mysql基础概念 mysql 主键 外键 索引 覆盖索引 数据库引擎 查询缓存

    1. 主键:能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。
    2. 外键:是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。
    3. 索引:是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。
    4. 聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但innoddb 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。
    5. 数据库引擎:数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
    6. 查询缓存:Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。

      参考文献:
      《MySQL数据库(主键、索引、外键、触发器…》)
      《MySQL 聚簇索引》)
      《mysql 数据库引擎》)

  22. 学生、课程、授课老师

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    create table student
    (
    id int auto_increment primary key,
    student_name varchar(100) default '' not null comment '姓名',
    birthday int,
    sex tinyint,
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '学生表';

    create table teacher
    (
    id int auto_increment primary key,
    teacher_name varchar(100) default '' not null comment '姓名',
    birthday datetime,
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '教师表';

    create table lesson
    (
    id int auto_increment primary key,
    lesson_name varchar(100) default '' not null comment '姓名',
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '课程表';

    create table teacher_lesson_relation
    (
    id int auto_increment primary key,
    teacher_id int,
    lesson_id int,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '教师课程关系表';

    create table student_lesson_relation
    (
    id int auto_increment primary key,
    student_id int,
    lesson_id int,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '学生课程关系表';
    1. 查询选了某个课程的所有学生
      select s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id where sl.lesson_id = ?
    2. 查询教某个老师教的所有课程
      select l.* from lesson l inner join teacher_lesson_relation tl on l.id = tl.lesson_id where tl.teacher_id = ?
    3. 查询某个老师的所有学生
      select distinct s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id inner join teacher_lesson_relation tl on sl.lesson_id = tl.lesson_id where tl.teacher_id = ?;
    4. 查询报了某个课程的所有年龄大于15的男学生
      select s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id where sl.lesson_id = ? and sex = 1 and YEAR(CURDATE()) - YEAR(birthday) > 15
  23. Mysql 锁的机制
  24. mysql 主从复制原理
    mysql主从复制——Master-Slave搭建及注意事项
    怎样解决MySQL数据库主从复制延迟的问题
    MySQL主从库配置和主库宕机解决方案
    深入解析Mysql 主从同步延迟原理及解决方案
  25. mysql 2006
  26. mysql char 与 varchar