360技术大牛PHP面试知识点梳理

  1. Linux
    1. 常用命令
      1. 系统安全:sudo、su、chmod、setfacl
      2. 进程管理:w、top、ps、kill、pkill、pstree、killall
      3. 用户管理:id、usermod、useradd、groupadd、userdel
      4. 文件系统:mount、umount、fsck、df、du
      5. 系统关机和重启:shutdown、reboot
      6. 网络应用:curl、telnete、mail、elinks
      7. 网络测试:ping、netstat、host
      8. 网络配置:hostname、ifconfig
      9. 常用工具:ssh、screen、clear、who、date
      10. 软件包管理:yum、rpm、apt-get
      11. 文件查找和比较:locate、find
      12. 文件内容查看:head、tail、less、more
      13. 文件处理:touch、unlink、rename、ln、cat
      14. 目录操作:cd、mv、rm、pwd、tree、cp、ls
      15. 文件权限:setfacl、chmod、chown、chgrp
      16. 压缩/解压:bzip/bunzip2、gzip/gunzip、zip/unzip、tar
      17. 文件传输:ftp、scp
    2. 定时任务
      1. crontab命令
        1. crontab -e

编辑定时任务

  1. 1. crontab -l

查看定时任务

  1. at命令
     1. at命令相比crontab来说是一次性的,只会执行一次
     1. 明天两点执行do_job

360技术大牛PHP面试知识点梳理 - 图1

  1. vi/vim 编辑器
    1. 模式:一般模式、编辑模式、命令模式
    2. 一般模式:删除、复制和粘贴
    3. 编辑模式:插入和替换

切换编辑模式:i、I、o、O、a、A、r、R

  1. 命令模式:vi配置、内容查找、保存、关闭

切换命令模式::、/、?

  1. 移动光标:ctrl+f、ctrl+b、0或者功能键Home、$或功能键End、G、gg、N+enter
  1. 查找和替换:/word、?word;:n1,n2s/word1/word2/g
  1. 删除、复制、粘贴:x,X、dd、ndd、yy、nyy、p、P、ctrl+r
  1. 视图模式(vim):v、V、ctrl|v、y、d
  1. 配置: 命令行模式 :setnu、:setnonu
  1. shell基础
    1. 脚本执行方式
      1. 赋予权限,直接运行:chmod+x test.sh; ./text.sh
      2. 调用解释器,使用脚本执行:例:bash、csh、ash、bsh、ksh等等
      3. 使用source命令操作:例:source text .sh
    2. 编写基础
      1. 开头用#!指定文本解释器,例如:#!/bin/sh
    3. 数据类型
  2. 标量(字符串、整数、浮点数、布尔) 复合(数组、对象) 特殊(资源、NULL)
  3. 字符串
    1. 单引号
      1. 单引号不解析变量
      2. 不能解析转义字符,只能解析单引号和斜杠本身
      3. 变量和变量,字符串和字符串, 变量和字符串,需要用“.”链接
    2. 双引号
      1. 双引号解析变量,变量可以使用特殊字符包含“{}”
      2. 双引号可以解析所有转义字符,也可以使用“.”链接
    3. 区别:双引号可以解析变量,单引号速度更快
    4. Heredoc
      1. 用于处理大段文本,与双引号相似,可以解析变量

360技术大牛PHP面试知识点梳理 - 图2

  1. Newdoc
     1. 与单引号类似,不支持解析变量

360技术大牛PHP面试知识点梳理 - 图3

  1. 浮点型
    1. 浮点型 不能参与比较运算,因为计算机在转为二进制的时候会将浮点数转为一个不准确的数
  2. 布尔型
    1. 布尔值为false的情况
      1. 整型 0
      2. 浮点 0.0
      3. 空字符串 ‘’
      4. 0字符串 ‘0’
      5. 布尔型false
      6. 空数组 array()
      7. null
  3. 数组
    1. 超全局数组
      1. $GLOBALS 包含所有超全局数组内容
      2. $_GET get请求数据
      3. $_POST post请求数据
      4. $_FTLES文件上传
      5. $_REQUEST 可获取get、post以及文件上传
      6. $_SESSION session
      7. $_COOKIE cookie
      8. $_SERVER 获取服务器信息
        1. $_SERVER[‘SERVER_ADDR’] 服务器的IP地址
        2. $_SERVER[‘SERVER_NAME’] 服务器的名称
        3. $_SERVER[‘REQUSET_TIME’] 服务器的启动时间
        4. $_SERVER[‘QUERY_STRING’] url”?”后面的内容
        5. $_SERVER[‘HTTP_REFERER’] 上次请求的页面地址
        6. $_SERVER[‘HTTP_USER_AGENT’] 获取浏览器UA标识
        7. $_SERVER[‘REMOTE_ADDR’] 客户端ip地址
        8. $_SERVER[‘REQUEST_URL’] 获取访问的文件名
        9. $_SERVER[‘PATH_INFO’] 文件名后面的目录
  4. null
    1. null为空的情况
      1. 直接赋值为null
      2. 未定义的变量
      3. unset销毁变量
    2. 当echo null的时候将不会输出任何内容
  5. 常量
    1. 定义
      1. const() 更快,是语言结构,可以定义类的常量
      2. define() 是函数,不能定义类的常量
      3. 注意:常量定义后不能修改和删除
    2. 预定义常量
      1. FILE 所在文件路径
      2. DIR 所在文件目录
      3. LINE 所在行号
      4. FUNCTION 所在函数
      5. CLASS 所在类名
      6. METHOD 所在方法名+类名
  6. 静态变量 (static)
    1. 仅初始化一次
    2. 初始化时需要赋值
    3. 每次执行函数都会保留改值
    4. statis修饰的变量是局部的,如果在函数内部使用,则只会在函数内部执行
    5. 可以记录函数的调用次数,从某些条件下终止递归
  7. 全局变量
    1. 在代码中声明的变量可以支持include和require引入文件的调用
    2. global $a 如果在函数内使用外部变量,需要使用关键字修饰
    3. $GLOBALS[‘a’] 也可以通过超全局变量$GLOBALS来使用,可以直接获取及赋值
    4. 函数
  8. 函数引用
    1. 在函数返回一个引用,必须在函数声明和指派返回值给一个变量时,都使用引用运算符
    2. $a引用函数,可与返回值共享引用空间

360技术大牛PHP面试知识点梳理 - 图4

  1. include/require 文件引入
    1. 如果给出路径名按照路径名来找,否则从include_path中查找
    2. 如果include_path下也没有,则从调用脚本文件所在的目录和当前工作目录查找
    3. 当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围
    4. 如果找不到加载的文件,include会发出一条警告,但程序还会执行,这一点和require不同,后者会发出一个致命错误,程序会中止运行
    5. include_once/require_once与普通的唯一区别是,php会检测文件是否被包含过,如果是则不会再次包含
  2. 时间函数
    1. date() 格式化一个时间戳
    2. strtotime() 将英文文本时间转换为时间戳
    3. mktime0 取一个日期的时间戳
    4. time() 取当前时间戳
    5. microtime() 返回当前时间的时间戳和微秒数
    6. date_default_timezone_set() 在当前脚本中设置时间函数的默认时区
  3. ip处理函数
    1. ip2long() 将ip转为数字格式
    2. long2ip() 将数字格式转为ip
  4. 打印输出
    1. print() 输出字符串,并返回输出的值
    2. echo() 输出字符串,没有返回值,比print快
    3. printf() 格式化输出字符串
    4. print_r() 格式化数组,对象并打印
    5. var_dump() 格式化数组,对象并输出,同时输出变量的类型
    6. var_export() 格式化输出数组,如果第二个参数是true则只返回不输出
  5. 序列化
    1. serialize() 序列号一个数组,对象
    2. unserialize() 反序列化
    3. 正则表达式
  6. 正则表达式作用:分隔,匹配,查找,替换字符串
  7. 分隔符
    1. 正斜线“/”
    2. hash符号”#”
    3. 以及取反符号(~)
  8. 通用原子
    1. \d 十进制的 0-9
    2. \D 非十进制的 0-9
    3. \w 数字字母下划线
    4. \W 非数字字母下划线
    5. \s 空白符(空格)
    6. \S 除了空白符
  9. 元字符
    1. “.” 除了换行符外的任意字符
      • 匹配前面的内容,零次一次或多次
    2. ? 匹配前面的内容,零次或一次
    3. ^ 必须以此开头
    4. $ 必须以此结尾
      • 出现一次或者多次
    5. {n} 只能出现n次
    6. {n,} 大于等于n次
    7. {n,m} 大于等于n次,小于等于m次
    8. [] 或,比如[123] 表示1或者2或者3
    9. () 表示一个整体
    10. [^] 取反[^123]除了1 除了2 除了3
    11. | 表示或的意思
    12. [-] 范围值,[0-9] 0到9
  10. 模式修正符
    1. i 不区分大小写
    2. m 每一行分别匹配
    3. s 修正换行 如果有换行符 就需要使用这个修正 否则 匹配不了
    4. U 取消贪婪模式
    5. x 忽略模式中的空白符
    6. A 必须以这个模式开头
    7. D 修正对\n的忽略
    8. u utf-8编码 中文匹配时有用
  11. 后向引用
    1. 把前面匹配到的内容后向引用,为了防止反斜线被转化掉需要用两个反斜线

360技术大牛PHP面试知识点梳理 - 图5

  1. 贪婪模式
    1. 如果直接使用.*匹配则会直接匹配到最后一个,为了防止这样可以使用模式修正符或者?来禁止贪婪

360技术大牛PHP面试知识点梳理 - 图6

  1. 正则函数
    1. preg_match() 执行正则表达式
    2. preg_match_all() 执行全局表达式
    3. preg_replace() 正则替换
    4. preg_split() 正则匹配搜索
  2. 中文匹配
    1. utf-8 0x4e00-0x9fa5

360技术大牛PHP面试知识点梳理 - 图7

  1. gb2312 0xb0-0xf7,0xa1-0xfe

360技术大牛PHP面试知识点梳理 - 图8

  1. 运算符
    1. 运算符优先级
      1. 递增/递减>!取反>算数运算符>大小比较>(不)相等比较>引用>位运算符(^)>位运算符(|)>逻辑与>逻辑或>三目>赋值>and>xor>or

360技术大牛PHP面试知识点梳理 - 图9

  1. 用括号可以使代码增加可读性,推荐使用
  2. false和false的七种为空对比的结果是真
  3. 递增/递减不影响布尔值
  4. 递减NULL没有效果,递增会为1
  5. 递增/递减在前就先运算后返回,反之就是先返回后运算
  6. 逻辑或(||) 第一个为真,第二个则不会执行,其中一个为真即返回真
  7. 逻辑与(&&) 第一为假,第二个则不会执行,其中两个必须同时为真才返回真
    1. MYSQL部分
  8. 数据类型
    1. 整数类型
      1. TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
      2. 长度:可以指定数据类型的指定宽度 例如INT(11) 不会限制合法范围 只会影响显示个数
    2. 实数类型
      1. DECIMAL可以存储比BIGINT还大的整数
      2. 可以用于存储精确地小数FLOAT和DOUBLE类型支持使用标准的浮点近似计算
    3. 字符串类型
      1. VARCHAR
        1. varchar使用一个或两个额外字节记录字符串的长度,列长度小于255字节用1个字节表示,否则用两个
        2. varchar 超出制定长度会被截断
        3. 用于存储可变长字符串,它比定常类型更节省空间
      2. CHAR
        1. char是定长 根据定义的字符串分配足够的空间
        2. char会根据需要采用空格进行填充以方便比较
        3. char 适合存储很短的字符串,或者所有值都接近同一个长度
        4. 超出指定的长度会被截断
        5. 对于经常变更的数据来说,char比VARCHAR更好,char不容易产生碎片
        6. 对于非常短的列,char在存储空间上更有效率
        7. 只有分配真正需要的空间 会消耗更长的内存
      3. 尽量避开使用BLOB、TEXT类型 查询会使用临时表导致严重的内存开销
      4. 枚举
        1. 用枚举代替常用的字符串类型
        2. 把不重复的合计存储称一个预定义的合集
        3. 非常紧凑,把一列值压缩到1到两个字节 使表的体积大大减少
        4. 内部存的是整数
        5. 尽量避免使用数组作为枚举的常量 易混乱
    4. 时间和日期类型
      1. 尽量使用TIMESTAMP,比DATETIME空间效率高
      2. 使用整数存时间戳格式不方便处理
      3. 如果需要存储微妙 可以使用bigint类型
  9. 基础操作
    1. 常见操作
      1. mysql 链接 mysql
        1. -u 用户
        2. -p 密码
        3. -h 链接地址
        4. -P 端口
      2. 其他
        1. \G 数据垂直显示
        2. \c 取消当前mysql命令
        3. \q 退出
        4. \s mysql状态
        5. \h 帮助
        6. \d 执行符
  10. 触发器
    1. 可通过数据库相关表实现级联更改
    2. 监控一张表中的某个字段的更改而做出相应处理
    3. 某些业务编号的生成等
    4. 滥用会造成数据库及应用程序的维护困难111
  11. 数据库引擎
    1. innDB引擎
      1. 支持事务,性能优秀
      2. 数据存储在共享表空间,可通过配置分开
      3. 对于主键查询性能高于其他引擎
      4. 读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
      5. 通过一些机制和工具支持真正的热备份
      6. 支持崩溃后的安全恢复
      7. 支持行级锁
      8. 支持外键
    2. MyISAM
      1. 5.1版本前,MyISAM是默认的存储引擎
      2. 拥有全文索引 空间函数 和压缩
      3. 不支持事务和行级锁 不支持崩溃后的安全恢复
      4. 表存储在两个文件MYD和MTI
      5. 设计简单,某些场景下性能很好
    3. 其他索引
      1. Archive
      2. Blackhole
      3. CSV
      4. Memory
    4. 引擎选择优先使用所InnDB索引
  12. 锁机制
    1. 概念:
      1. 多个用户对同一个数据进行读取或修改时发生阻塞,会产生并发控制的问题
      2. 锁分为共享锁和排它锁 其实就是读锁和写锁
      3. 读锁:共享的,不堵塞多个用户可以同时读一个资源,互不干扰
      4. 写锁:排它的,只允许一个人进行写入,防止其他用户读取正在写入的资源
      5. 表锁:开销最小 锁定整整表,MyISAM是表锁
      6. 行锁:最大尺度的支持并发处理,但是页是带来了最大的锁开销,InnoDB是行级锁
  13. 索引
    1. 索引对性能的影响
      1. 大大减少服务器需要扫描的数据量
      2. 帮助服务器减少排序和临时表
      3. 将随机io变为顺序io
      4. 大大提高查询速度降低写的速度,占用磁盘
    2. 索引使用场景
      1. 对于数据量小的表 扫描效率会更高
      2. 大到中型表,索引非常有效
      3. 特大型表建立和使用索引的代价随之增长,可使用分区技术来解决
    3. 索引类型
      1. 普通索引 : 没有任何限制 最基本的索引
      2. 唯一索引 : 与普通表类似,但是具有唯一性约束
      3. 主键索引 : 特殊的唯一索引 不允许有空值
      4. 一个表只有一个主键索引但是可以有多个唯一索引
      5. 主键索引一定是唯一索引,唯一索引不一定是主键索引
      6. 主键可以与外键构成完整性约束,防止数据不一致
      7. 组合索引 : 将多个列组合在一起创建索引,可以覆盖多个列
      8. 外键索引: 只支持InnoDB类型的表才可以使用外键索引,保证数据的一致性完整性和实现和级联操作
      9. 全文索引 : mysql自带的全文索引只支持MyISA并且只能对英文进行全文索引
    4. 索引创建原则
      1. 最适合索引的列是出现在where子句中的列 而不是select关键字后的列
      2. 索引列的基数越大索引的效果越好、
      3. 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
      4. 根据情况创建复合索引,复合索引可以提高查询效率
      5. 避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率
      6. 主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用,提高查询效率
    5. 注意事项
      1. 复合索引遵循前缀原则
      2. like查询,%不能在在前,可以使用全文索引
      3. columin is null可以使用索引
      4. 如果mysql估计使用索引比全表扫描更慢,会放弃使用索引
      5. 如果or前的瞧见中的列有索引,后面没有,索引都不会被用到
      6. 列类型是字符串,查询是一定要给值加引号 否则索引失效
  14. 关联操作
    1. 交叉链接 (cross Join)
      1. select * from A,B(,c)
      2. select * from across join B(cross join c)
      3. 没有任何的关联条件,结果是笛卡尔积,结果集很大,没有意义,很少使用
    2. 联合查询 union与union all
      1. 就是把多个结果集集中在一起,union前端 结果为基准,需要注意的是联合查询的列数是相等相同的记录行会合并
      2. 如果使用 union all 不会合并重复的记录行
    3. 全连接 full join
      1. mysql 本不支持全链接
      2. 可以使用left和union和right join联合使用
      3. select * from a left goin b on a.id=b.id union
      4. select * from a right join B on A.id =B.id
    4. 内连接 (inner join)
      1. select * from a,b where A.id=B.id
      2. select * from a inner join b on A.id=B.id
      3. 多表中同时复合某种条件的数据记录的集合
      4. 等值连接:ON A.id=B.id
      5. 不等值链接:ON A.id > B.id
      6. 自连接:select * from A T1 Inner Join A T2 ON T1.id=T2.pid
      7. inner join 可缩写成join
    5. 外连接(leftjoin/right join)
      1. left outer join 以左表为主 先查询出左表 按照on后的关联条件匹配有表 没匹配到的用null填充 可简写left join
      2. right outer join 以右表为主 先查询出右表 按照on后的关联条件匹配有表 没匹配到的用null填充 可简写right join
  15. 优化
    1. 避免使用以下sql语句
      1. 查询不需要的记录,用limit解决
      2. 多表关联返回全部列指定a.id a.name b.age
      3. 总数取出全部咧 select * 会让优化器无法完成索引覆盖扫描的优化
      4. union all的效率要高于union
    2. 注意
      1. 重复查询相同的数据,可以缓存数据,下次直接读取缓存
      2. php端尽量使用PDO操作数据库,PDO拥有对预处理语句很好的支持 mysqli也有但是扩展性不如pdo,效率要高于pdo,mysql函数在新版本中一加趋向于淘汰,不建议使用,但是而且还没有很好的支持预处理
  16. 分区
    1. 表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他的都是历史数据。
    2. 分区表的数据更容易维护,可以对独立分区进行独立的操作
    3. 分区的数据可以分布在多个机器上从而搞笑的使用资源
    4. 可以使用分区表来避免某些特殊的瓶颈
    5. 可是备份和恢复独立的分区
    6. 一个表只能有1024个分区
    7. 5.1版本中分区表表达式必须是整数,5.5可以使用列分区
    8. 分区字段中如果有逐渐喝唯一索引,那么主键列和唯一列都必须包含进来
    9. 分区表中无法使用外键约束
    10. 需要对现有表的结构进行修改
    11. 所有分区都必须使用相同的存储引擎
    12. 分区函数中可以使用的函数和表达式会有一些限制
    13. 某些存储引擎不支持分区
    14. 对于MyISAM表,不能使用load index into cache
    15. 对于MyISAM表,使用分区表是需要打开更多的文件描述符
  17. 安全
    1. 使用预处理语句防止SQL注入
    2. 写入数据库的数据需要进行特殊字符的转义
    3. 查询的错误信息不要返回给用户,将错误记录到日志中
    4. 定期做数据备份
    5. 不给查询用户root权限,合理分配权限
    6. 关闭远程访问数据库的权限
    7. 改变root用户的名称
    8. 限制一般的用户访问其他库
    9. 限制用户对数据文件的访问权限
    10. 功能设计类
  18. 数据库设计

360技术大牛PHP面试知识点梳理 - 图10

  1. 建表语句

360技术大牛PHP面试知识点梳理 - 图11

  1. PHP链接mysql方式
    1. PDO 可扩展性好 支持预处理 面向对象 [推荐 易考]
    2. MYSQLi:只支持Mysql操作,支持预处理,面向对象和过程,效率较高
    3. mysql:只支持mysql数据库,不支持预处理,面向对象 【极不推荐】
  2. PDO操作数据库代码

360技术大牛PHP面试知识点梳理 - 图12

  1. MVC
    1. 模板引擎
      1. php是一种html内嵌式的在服务器执行的脚本语言,但是在php有很多可以使php代码和html代码分开的模版引擎,例如Smarty Twig Haml Liquid等
      2. 原理:一个庞大的正则表达式替换库
    2. 单入口
      1. 有一个处理程序的文件处理所有的http请求,根据请求似的参数不同区分不同的模块和操作的请求
      2. 所有的文件都经过index.php 可以做一个统一的安全性检查
      3. 集中的处理程序
      4. URL不美观需要重写URL
      5. 处理数据的效率稍低
    3. MCV框架
      1. ThinkPHP Yii2 CI Phalcon
    4. 工作原理
      1. Model 数据模型层
      2. View() 视图层
      3. Controller(控制器) 业务逻辑层
  2. 常见框架
    1. Yii2框架
      1. Yii是一款非常优秀的通用web后端框架,结构简单优雅,实用功能丰富,扩展性墙,性能高是它最突出的优点
      2. 缺点:学习成本较高,量级较重
    2. Yaf框架:
      1. yaf框架使用php扩展的形式写的一个php框架,也就是以C语言为底层编写的,性能上要比php写的代码快一个数量级
      2. 优点:执行效率高,轻量级框架,可扩展性强
      3. 缺点:高版本兼容性差,底层代码可读性差,需要安装扩展,功能单一,开发需要编写大量的插件
  3. 算法
    1. 概念
      1. 什么是算法
        1. 1+2+3+4+..+n的值是多少
        2. 解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
        3. 一个问题可以有多个算法,每种算法都有不同的效率
      2. 五个特征
        1. 有穷性:可以计算完,不是无限计算
        2. 确切性:每一步都是有意义的
        3. 输入项:有输入项,比如输出1到100想家
        4. 输出项:有结果
        5. 可行性:每一步都是正确克制执行的
    2. 空间复杂度
      1. 计算算法需要消耗的内存空间 记做S(n)=O(f(n))
      2. 包括程序代码所占用的空间,输入数据作占用的空间和辅助变量所占用的空间这三方面
      3. 计算嗯哼表示方式和时间复杂度类似,一般用于复杂度的渐进性来表示
      4. 用空间换取时间
      5. 冒泡排序的元素交换,空间复杂度O(1)
    3. 时间复杂度
      1. 执行算法所需要的计算工作量,一般来说,计算机算法是问题规模N的函数f(n)
      2. 算法的时间复杂度因此被记做T(n)=O(f(n))
    4. 算法评估
      1. 算法分析的目的是在于选择合适的算法和改进算法
      2. 一个算法的评价主要是从时间复杂度和空间复杂度来考虑的
    5. 查找算法
      1. 二分法:从数组的中间元素开始,如果中间元素正好是要查找的元素,搜索结束,如果某一个特定的元素大于或小于中间元素,则在数组中大于或小于中间元素的那一边中查找,而且从中间开始比较,如果某一步骤数组为空,代表找不到
      2. 顺序查找:按照一定的顺序检查数组中的每一个元素,找到找到特定的值为止
    6. 排序算法
      1. 冒泡排序:两两相邻的数进行比较,如果反序就交换,否则不交换
      2. 直接插入排序:从无序表中取出第一个元素,把他插入有序表中合适的位置,时有序表然有序
      3. 希尔排序:把待排序的数据增量分成几个子序列,对子序列进行插入排序,直到增量为1,直接插入排序;增量的排序,一般是数组的长度的一般,在变为原来增量的一半,直到增量为1
      4. 选择排序:每次从待排序的原诵读中华选出最小(或者最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
      5. 快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据逗比另一部分的所有数据要小,然后在按照此方法对两部分数据分别进行快速排序,整个排序可用递归完成
      6. 堆排序
      7. 归并排序将两个以上的有序列表合并成一个新的有序表,即把排序序列分为若干个有序的子序列,再把有序列的子序列合并为有序序列
  4. 数据结构
    1. Array(数组)
      1. 最简单而且应用最广泛的数据结构之一
      2. 使用连续的内存来存储,数组中的所有元素都必须是同类型的或者类型的衍生,元素可以通过下标来访问
    2. linkdlist(链表)
      1. 线性表的一种,最基本最简单也是最常用的数据结构之一
      2. 元素之间的关系是一对一的关系(除了第一个和最后一个元素,剩下的都是首尾相接)、顺序存储结构和链式存储结构两种存储方式
    3. Stack(栈)
      1. 和队列相似,一个带有数据存储特性的数据结构
      2. 存储数据是先进后出的,栈只有一个出口,只能从栈顶部增加和移除元素
    4. heap(堆)
      1. 一般情况下,又称为二叉堆,近似完全二叉树的数据结构
      2. 子节点的兼职或者索引总是小于它的父节点,每一个节点的左右子树又是一个二叉堆,根节点最大的堆叫做最大堆或者大根堆,最小的堆叫最小堆和小根堆
    5. list(线性表)
      1. 有零或者多个数据元素组成的有限序列
      2. 线性表是一个序列,0个元素构成的线性表搜索空表。第一个元素无先驱,最后一个元素无后继,其他元素都只有一个先驱和后继,有长度,长度是元素的个数,长度有限
    6. doubly-linked-list(双向链表)
      1. 每一个元素都是一个对象,每一个对象都有一个关键字key和两个指针(next和prev)
    7. queue(队列)
      1. 先进先出(FIFO)、并发中使用,可以安全的将对象从一个任务传给另一个任务
    8. set(集合)
      1. 保存不重复的元素
    9. map(字典)
      1. 关联数组也被称之为字典或者键值对
    10. graph(图)
      1. 通常使用邻接矩阵和邻接表来表示,前者容易实现单对于稀疏的矩阵会浪费比较多的空间,后者使用链表的方式存储信息,单对图搜索时间复杂度较高
  5. 高并发
    1. 什么是并发?
      1. 通常是指并发访问,也就是在某个时间点,有多少个访问同时到来。
    2. 什么是高并发?
      1. 如果一个系统的日PV在千万以上,有可能是一个高并发系统
      2. 有些公司完全不走技术路线,全靠机器堆。
      3. QPS :每秒请求或者查询的数量,在互联网领域值每秒的请求数
      4. 吞吐量:单位时间内处理的请求数量(通常有QPS与并发数决定)
      5. 响应时间:数据从请求到返回的时间,一个http请求的时间
      6. PV:综合浏览量(Page Viiew),即页面的点击量,一个访客在24小时内访问的页面数量

同一个人浏览你网站的同一个页面,只记做1次PV

  1. UV:独立访客(UniQue Visitor),即一定时间范围内相同访客多次访问网站,只能算1个独立访客
  1. 带宽:计算带宽大小需要关注两个指标,峰值流量和页面的平均大小
  1. 日网站带宽=PV/统计时间(换算成秒)*平均页面大小(KB)*8
  1. 峰值一般是平均值的倍数
  1. QPS不等于并发连接数,QPS是每秒http请求数量,并发连接数是系统同时处理的请求数量
  1. 高并发计算:(总PV数*80%)/(6小时秒数*20%)=峰值每秒请求数(QPS)

80%的访问量集中在20%的时间

  1. 高并发应该关心什么?
    1. 压力测试
      1. 测试能承受的最大并发数
      2. 测试最大能承受的QPS峰值
    2. 性能测试工具
      1. ab 全称apache benchmark 是apache官方推出的工具 原理是模拟多个访问者同时对一个URL地址访问。
        1. 模拟请求100次 总共请求5000次
        2. ab -c 100 -n 5000 带测试的网站
        3. 测试机器与被测试机器分开(否则结果不稳定)
        4. 不要对线上服务器做压力测试
        5. 观察测试工具db所在的机器,以及被检测的前端机的CPU 内存 网络等都不要超过最高限度是75%
      2. wrk
      3. http_load
      4. web bench
      5. siege
      6. Apache JMeter
  2. QPS优化
    1. QPS达到50:小型网站,一般的服务器可以应付
    2. QPS达到100
      1. 假设关系型数据库每秒在0.01秒完成
      2. 假设单页面只有一个SQL查询,那么100QPS意味着在1秒钟需要完成100次,但是我们并不能保证数据库查询能完成100次,。
      3. 解决方案:数据库缓存,数据库的负载均衡、
    3. QPS达到800
      1. 假设我们使用的是百兆带宽,意味着网站实际带宽是8MB左右
      2. 假设一每个页面只有10KB,在这个并发条件下,百兆带宽已经吃完了
      3. 方案:CDN加速,负载均衡
    4. QPS达到1000
      1. 假设使用Memcache缓存数据库查询受损,每个页面对Memcache的请求远大于DB的请求
      2. Memecache的悲观并发数在2w左右,但是有可能在之前内网的带宽一加被吃光了,出现不稳定情况
      3. 方案:静态HTML缓存
    5. QPS达到2000
      1. 这个级别下文件系统访问锁都成了灾难
      2. 方案,做业务分离,分布式存储
  3. 流量优化
    1. 防盗链处理
    2. 前端优化
      1. 减少http请求
      2. 添加异步请求
      3. 启用浏览器缓存和文件压缩
      4. CDN加速
      5. 建立独立的图片服务器

    3. 服务端优化
      1. 页面静态化
      2. 并发处理 多线程、异步处理
      3. 队列处理
    4. 数据库优化
      1. 数据库缓存
      2. 分库分表,分区操作
      3. 读写分离
      4. 负载均衡
    5. 服务器优化
      1. 负载均衡
    6. 防盗链
  4. 概念
    1. 盗链:指在自己的页面上展示一些并不在自己服务器上的内容
    2. 获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终的用户提供此内容
    3. 常见的是小站盗大站的图片、音乐、视频等资源
    4. 通过盗链可以减轻自己服务器的负担,因为真是的空间和流量来自别人的服务器
    5. 防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开的资源展示页面的资源链接失效
    6. 可以减轻服务器的压力
  5. 原理
    1. 通过Referer或者签名,网站可以检测目标访问页面的来源页面,如果是资源文件,则可以跟踪到显示他的页面地址
    2. 一旦检测到来源不是本站则进行阻止或返回指定的页面
  6. Referer
    1. Nginx模块ngx_http_referer_module用于阻挡来源非法的域名请求
    2. Nginx指令Valid_Referers,全局变量$invalid_referer
    3. valid_referers(下面是参数 通过管道符链接)
      1. none (Referer是否为空,选填)
      2. blocked (Referer的来源地址不为空,但是里面的植被代理或者防火墙删掉了,这些值都不是以http或者https开头的)
      3. server_names (Referer来源包含当前的server_names)
      4. string…..

360技术大牛PHP面试知识点梳理 - 图13

  1. 加密签名
    1. Referer可以伪造,可以使用加密签名来解决
    2. 使用第三方模块,httpAccessKeyModule实现Nginx防盗链
    3. accesskey on | off 模块开关
    4. accesskey_hashmethod md5 | sha-1 签名加密方式
    5. accesskey_arg GET参数名称
    6. accesskey_signature 加密规则
    7. 例子:

360技术大牛PHP面试知识点梳理 - 图14

  1. <br />
  1. 减少HTTP请求
    1. 为什么要减少HTTP请求
      1. 只有10%-20%的最终用户响应时间花在请求HTML文档上,剩下的80%-90%的时间花在了HTML文档所引用组件(图片 js css flash)进行的HTTP请求上
      2. 查找DNS缓存也需要时间,多个缓存就要查找多次有可能缓存会被清楚
      3. HTTP协议规定只能串行发送,也就是说一百个请求必须依次逐个发送,当前面的一个请求完成后才开始下个请求
    2. 如何改善
      1. 改善HTTP响应时间的最简单有效的方法是减少组件的数量,并由此减少HTTP请求
    3. CSS Sprites
      1. CSS Spites 中文翻译CSS精灵,通过使用合并图片,通过指定的css的background-image和background-position来显示元素
      2. bacground -position:x y;x和y可以写负值也可以写正直,图片左上角为(0,0),以(0,0)坐标向右是为负数的X轴,向下是为负数的Y轴
    4. 图片地图
      1. 图片地图允许你在一个图片上关联多个url,目标url的选择取决于用户点击了图片上的那个位置
      2. 将五个分开的图片合并成一张图片,然后以位置信息定位超链接
      3. 把http请求减少为1个,可以保证设计的完整性和功能的齐全性
    5. 性能影响
      1. 图片地图和CSS精灵的响应时间基本上相同,但比使用各自独立的图片方式快了50%以上
      2. 合并脚本和CSS样式
    6. 合并JavaScript和CSS
      1. 使用外部的js和css文件引用的方式,因为这样比直接写在页面中要更好一点
      2. 独立的一个jss比用多个js文件组成的页面载入快了38%
    7. 使用Base64编码
      1. 采用Base64编码将图片直接嵌入到网页中,而不是从外部载入
      2. 360技术大牛PHP面试知识点梳理 - 图15