PHP知识点汇总

本文最后更新于:2 年前

phper-knowledge

该仓库主要记录php开发遇到的知识点。
针对相应知识点,附上便于理解的链接,若有更好的资源,欢迎提交更正交流。

基础篇

进阶篇

  • Autoload、Composer 原理 PSR-4原理

    必须有顶级命名空间

    必须有最终类名

    类名必须大小写敏感

    必须文件php后缀

    子命名空间 必须 与相应的「文件基目录」相匹配

    一定不可 抛出异常、一定不可 触发任一级别的错误信息

  • Session 共享、存活时间

    • 存活: 默认存活gc_maxlifetime=1440s,默认gc概率1/100 gc_probability/gc_divisor
    • 共享: 文件同步rsync,redis或mc存储,mysql存储
  • 异常处理 详情

    php7之前,try catch有部分fatal error无法捕捉需搭配set_exception_handler

    php7之后,Throwable 包含了exception&error

    register_shutdown_function 能捕捉运行中止时错误

  • 如何 foreach 迭代对象 Iterator 接口 或者 IteratorIterator

  • 如何数组化操作对象 $obj[key]; ArrayAccess接口 或者

  • 如何函数化对象 $obj(123); __invoke()或者Closure 预定义接口

  • yield 是什么,说个使用场景 yield 鸟哥解析

  • PSR 是什么,PSR-1, 2, 4, 7

  • 如何获取客户端 IP 和服务端 IP 地址

  • 如何开启 PHP 异常提示

    • php.ini 开启 display_errors 设置 error_reporting 等级
    • 运行时,使用 ini_set(k, v); 动态设置
  • 如何返回一个301重定向

    • [WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用 die or exit
  • 如何获取扩展安装路径

    • phpinfo(); 页面查找 extension_dir
    • 命令行 php -i |grep extension_dir
    • 运行时 echo ini_get('extension_dir');
  • 字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制

    • 字符串比较大小,从左(高位)至右,逐个字符 ASCII 比较
    • 注意字符串和数字组合比较 var_dump(‘10a’ == 10); //true 10a转型10
  • BOM 头是什么,怎么除去

    • win记事本保存默认开头0xEF,0xBB,0xBF(UTF8)
    • 导入含有BOM的html时,页面始终不置顶(php 当成字符串导入)
    • trim($str, “\xEF\xBB\xBF”);检测、去除
  • 什么是 MVC

  • 依赖注入实现原理

  • 如何异步执行命令

    • <img src="xxx.php">
    • ajax异步 但需要onload后执行
    • 异步执行php脚本 如执行shell脚本exec() 但只能本机脚本
    • 使用curl 但是timeout最小是1s
    • 使用fsockopen 需要自己拼写发送内容
  • 模板引擎是什么,解决什么问题、实现原理(Smarty、Twig、Blade)

  • 如何实现链式操作 $obj->w()->m()->d();

    • __call() & call_user_func_array() 唤醒调用对象未知方法
    • 调用的函数return $this
  • Xhprof 、Xdebug 性能调试工具使用

  • 索引数组 [1, 2] 与关联数组 ['k1'=>1, 'k2'=>2] 有什么区别

    • 存在覆盖的问题 $arr1 = array(‘one’,’two’,’three’,1=>’four’); // ‘one four three’
    • 关联数组有界限 $arr1 = array(1=>’four’,’one’,’two’,’three’); // ‘1=>four 2=>one 3=>two’
  • 缓存的使用方式、场景

  • foreach 引用问题

1
2
3
4
5
6
7
8
$a = [1,2,3];
foreach ($a as $v){}
var_dump($a); // 123
foreach ($a as &$v){}
var_dump($a); //123
# unset($v); 或换了$v
foreach ($a as $v){}
var_dump($a); // 122

实践篇

  • 给定二维数组,根据某个字段排序 array_multisort() 多维数组排序

    • array_multisort($field1, SORT_DESC, $field2, SORT_ASC, $data);
  • 如何判断上传文件类型,如:仅允许 jpg 上传 详情
    $ext = $_FILES['file']['type']; 或者 解析文件名(explode())

  • 不使用临时变量交换两个变量的值 $a=1; $b=2; => $a=2; $b=1; 传送门

    1
    2
    方案一 int 相加后相减  
    方案二 先拼接$a .= $b; $b=str_replace($b,'',$a)...
  • strtoupper 在转换中文时存在乱码,你如何解决?php echo strtoupper('ab你好c');

    mb_convert_case($str,MB_CASE_TITLE,'UTF-8');
    1
    方案二 自定义函数,使用str_split()按一字节切割,然后ord()转asscii 判断字母asscii
  • Websocket、Long-Polling、Server-Sent Events(SSE) 区别 传送门

  • “Headers already sent” 错误是什么意思,如何避免

算法篇

  • 快速排序(手写)
  • 冒泡排序(手写)
  • 二分查找(了解)
  • 查找算法 KMP(了解)
  • 深度、广度优先搜索(了解)
  • LRU 缓存淘汰算法(了解,Memcached 采用该算法)

数据结构篇(了解)

  • 堆、栈特性 详细
    • 堆 自行申请和释放空间,存放对象,空间比较大
    • 栈 系统自动申请释放,执行程序,随函数被调用时分配的空间
  • 队列
  • 哈希表
  • 链表

对比篇

  • Cookie 与 Session 区别 (深入分析区别)[https://juejin.im/entry/5766c29d6be3ff006a31b84e]

    • cookie 存客户端 用户可见 仅支持字符串二进制 缓存时间长 服务器压力少
    • session 存服务端 用户不可见 支持多种数据类型 缓存时间有限 服务器压力大
  • GETPOST 区别 (传送门)[https://www.zhihu.com/question/28586791]

  • includerequire 区别

    • include 使用时加载,require一开始就加载
    • include 错误时继续执行代码, require 停止执行
  • include_oncerequire_once 区别

  • Memcached 与 Redis 区别 [传送门](PHP include()和require()方法的区别)

    • mc 多线程非阻塞IO 只支持K-V类型 key有几率被刷走,非持久化 通过key hashmap分布式
    • redis 单线程阻塞复用IO 支持多类型 key不被刷走,持久化存储,redis-cluster分布式
  • MySQL 各个存储引擎、及区别(一定会问 MyISAM 与 Innodb 区别)传送门

    1
    MyIsam 写锁优先级更高,因此不适合更新操作,适合读,而且索引结构无须遍历主键索引获得记录
  • HTTP 与 HTTPS 区别 传送门

  • Apache 与 Nginx 区别 传送门

  • define() 与 const 区别 传送门

    • define可用在条件判断中,不成立的条件中,定义的不生效,成功定义后全局可用,可是表达式赋值
    • const不可用在条件判断中,不过可定义在类中,不可表达式赋值,必须是标量
  • traits 与 interfaces 区别 及 traits 解决了什么痛点?

    • traits 类似插件 use XXX 直接使用
    • interfaces 接口协议,不带实现方法
  • Git 与 SVN 区别

数据库篇

  • MySQL

  • CRUD

    • 50个基础sql

    • JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN 传送门

    • join 索引等优化 传送门

    • UNION, UNION ALL

    • GROUP BY + COUNT + WHERE 组合案例 详情

    • 常用 MySQL 函数,如:now()、md5()、concat()、uuid()等

    • 1:11:nn:n 各自适用场景

    • 了解触发器是什么,说个使用场景 传送门

    • 数据库优化手段

    • 索引相关

      • 索引,聚集索引, 非聚集索引
    • 会使用 explain 分析 SQL 性能问题,了解各参数含义 传送门

      • 重点理解 typerowskey

      • Slow Log(有什么用,什么时候需要)传送门

        • mysqldumoslow 日志汇总
        • show variables like ‘%slow_query_log%’;
      • 锁了解 传送门

        • 悲观锁,排他锁,共享锁的了解

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          共享锁 共享锁可叠加,排他锁无法加锁
          加锁方式 select * from tb where id = 1 lock in share modeupdate delete 默认加锁
          排它锁 排它锁会阻塞所有的排它锁和共享锁
          加锁方式 select status from TABLE where id=1 for update;

          解锁 commit就好

          表锁
          加锁 lock table xxx read; lock table xxx write;
          解锁 UNLOCK TABLES

        • 死锁的出现和解决

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          查询是否锁表
          show OPEN TABLES where In_use > 0;
          查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)
          show processlist
          杀死进程id(就是上面命令的id列)
          kill id

          查看innodb行锁情况
          show status like 'innodb_row_lock%';
          查表锁
          show open tables where in_use > 0;
* 行锁 表锁  间隙锁

  
1
2
3
4
5
6
7
8
9
10
行锁 InnoDB只有在通过索引条件检索数据时使用行级锁,否则使用表锁!并且是等值过滤条件
表锁 InnoDB未通过索引检索
间隙锁 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录

行锁优化
尽可能让所有数据检索都通过索引来完成,避免无索引行或索引失效导致行锁升级为表锁。
尽可能避免间隙锁带来的性能下降,减少或使用合理的检索范围。
尽可能减少事务的粒度,比如控制事务大小,而从减少锁定资源量和时间长度,从而减少锁的竞争等,提供性能。
尽可能低级别事务隔离,隔离级别越高,并发的处理能力越低。

* 属性值重复率 (行锁升级表锁)
1
当“值重复率”低时,甚至接近主键或者唯一索引的效果,“普通索引”依然是行锁;当“值重复率”高时,MySQL 不会把这个“普通索引”当做索引,即造成了一个没有索引的 SQL,此时引发表锁。
* [脏读及隔离级别](https://www.cnblogs.com/fengzheng/p/12557762.html) [隔离级别实现方式](https://segmentfault.com/a/1190000025156465) * mvcc实现 * mvcc基本版本号实现(事务ID), 隔离级别RU,RC,RR 基于其之上构建
  • MSSQL(了解)

    • 查询最新5条数据
  • NOSQL

    • Redis、Memcached、MongoDB
    • 对比、适用场景(可从以下维度进行对比)
      • 持久化
      • 支持多钟数据类型
      • 可利用 CPU 多核心
      • 内存淘汰机制
      • 集群 Cluster
      • 支持 SQL
      • 性能对比
      • 支持事务
      • 应用场景
    • 你之前为了解决什么问题使用的什么,为什么选它?

服务器篇

  • 查看 CPU、内存、时间、系统版本等信息

  • find 、grep 查找文件

  • awk 处理文本

  • 查看命令所在目录

  • 自己编译过 PHP 吗?如何打开 readline 功能

  • 如何查看 PHP 进程的内存、CPU 占用

    1
    2
    ps -aux | grep php-fpm
    top -p pid
  • 如何给 PHP 增加一个扩展

  • 修改 PHP Session 存储位置、修改 INI 配置参数

  • 负载均衡有哪几种,挑一种你熟悉的说明其原理 4种

  • 数据库主从复制 M-S 是怎么同步的?是推还是拉?会不会不同步?怎么办

  • 如何保障数据的可用性,即使被删库了也能恢复到分钟级别。你会怎么做。

  • 数据库连接过多,超过最大值,如何优化架构。从哪些方便处理?

  • 502 大概什么什么原因? 如何排查 504呢? 传送门

    • 502: 请求的fpm由于某些原因没有执行完毕而终止执行(fpm已执行) max_children,request_terminate_timeout,fpm进程数不够,一般数据库有很多慢查询占用进程数
    • 504:与nginx有关(没有请求到可执行的fpm) fastcgi_connect_timeout fastcgi_send_timeout fastcgi_send_timeout,如nginx的buffer设置太小而挂起504

架构篇

  • 偏运维(了解):

    • 负载均衡(Nginx、HAProxy、DNS)
    • 主从复制(MySQL、Redis)
    • 数据冗余、备份(MySQL增量、全量 原理)
    • 监控检查(分存活、服务可用两个维度)
    • MySQL、Redis、Memcached Proxy 、Cluster 目的、原理
    • mysql分片
    • 高可用集群
    • RAID
    • 源代码编译、内存调优
  • 缓存

    • 工作中遇到哪里需要缓存,分别简述为什么
  • 搜索解决方案 es+solr+lucene

  • 性能调优

  • 各维度监控方案 传送门

  • 日志收集集中处理方案 ELK

  • 国际化(传送门)[]

  • 数据库设计 传送门

  • 静态化方案 传送门

  • 画出常见 PHP 应用架构图 传送门

  • kafka消息队列

    • 原理图

    • 知识点

    • 面试题

    • nsq对比

      1
      2
      3
      通过nsqlookup注册和发现服务,去中心化
      nsq通过先写内存,再刷硬盘,而kafka直接刷硬盘
      nsq更适合二开,和规模小的MQ需求

框架篇

  • ThinkPHP(TP)、CodeIgniter(CI)、Zend(非 OOP 系列)
  • Yaf、Phalcon(C 扩展系)
  • Yii、Laravel、Symfony(纯 OOP 系列)
  • Swoole、Workerman (网络编程框架)
  • 对比框架区别几个方向点
    • 是否纯 OOP
    • 类库加载方式(自己写 autoload 对比 composer 标准)
    • 易用性方向(CI 基础框架,Laravel 这种就是高开发效率框架以及基础组件多少)
    • 黑盒(相比 C 扩展系)
    • 运行速度(如:Laravel 加载一大堆东西)
    • 内存占用

设计模式

  • 单例模式(重点)

    1
    2
    3
    4
    1.多线程运行,实例未创建导致创建多实例 
    2. 多进程运行,子进程使用父进程实例有问题
    3.长时间不使用会被GC回收
    4.单一拓展困难
  • 工厂模式(重点)

  • 观察者模式(重点)传送门

    • 主题Subject实现attach detach notify 观察者Observer实现update()
  • 依赖注入(重点)传送门

    • 依赖注入DI: 具有Interface的工厂类,能力实现在外部
    • 控制反转IOC:DI上的容器container概念,make &bind活用闭包实现
    • 主要概念:超人由固定多能力转换成外部赋予单一能力
  • 装饰器模式 传送门

  • 代理模式 传送门

    • Proxy代理&RealSubject实现Subject的接口方法
    • 可以理解成代理服务器
  • 组合模式

安全篇

高阶篇

  • PHP 数组底层实现 (HashTable + Linked list)传送
1
2
3
1. 查找:key先time33算法再中间映射表找到下标然后找到对应bucket,然后遍历bucket当key相当返回数据,索引数组和字符数组的覆盖原因
2. 插入&删除:影响索引,按2倍拓容,仅当触发阈值才删除
3. 有序:bucket双向链表存储,避免hash冲突
  • Copy on write 原理,何时 GC

  • PHP 进程模型,进程通讯方式,进程线程区别

  • 僵尸进程和孤儿进程和守护进程

    • 孤儿进程: 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
    • 僵尸进程: 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程(ps 进程状态’Z’)
  • yield 核心原理是什么 传送门

  • PDO prepare 原理 (绑定变量 相当于预设输入是字符串)

  • PHP 7 与 PHP 5 区别 原因

1
2
3
4
1. JIT:opcache的增强版本
2. zval的改变
3. php数组变化
4. 函数调用机制

前端篇

  • 原生获取 DOM 节点,属性
  • 盒子模型
  • CSS 文件、style 标签、行内 style 属性优先级
  • HTML 与 JS 运行顺序(页面 JS 从上到下)
  • JS 数组操作
  • 类型判断
  • this 作用域
  • .map() 与 this 具体使用场景分析
  • Cookie 读写
  • JQuery 操作
  • Ajax 请求(同步、异步区别)随机数禁止缓存
  • Bootstrap 有什么好处
  • 跨域请求 N 种解决方案
  • 新技术(了解)
    • ES6
    • 模块化
    • 打包
    • 构建工具
    • vue、react、webpack、
    • 前端 mvc
  • 优化
    • 浏览器单域名并发数限制
    • 静态资源缓存 304 (If-Modified-Since 以及 Etag 原理)
    • 多个小图标合并使用 position 定位技术 减少请求
    • 静态资源合为单次请求 并压缩
    • CDN
    • 静态资源延迟加载技术、预加载技术
    • keep-alive
    • CSS 在头部,JS 在尾部的优化(原理)

网络篇

  • IP 地址转 INT
  • 192.168.0.1/16 是什么意思 解析 在线转换
  • DNS 主要作用是什么?
  • IPv4 与 v6 区别

网络编程篇

  • TCP 三次握手 四次挥手流程 传送门

    • 三次握手 server半连接,伪造大量syn包造成ddos攻击
  • TCP&UDP区别,分别适用场景 传送门

  • OSI七层协议 缩写 物链网 传输会话表示应用

  • 有什么办法能保证 UDP 高可用性(了解)

  • TCP 粘包如何解决?原因及处理

  • 为什么需要心跳? 传送门

    • TCP并无及时的断线检测
    • TCP的keepalive能检查deadLink,但影响全局
  • 什么是长连接?

  • HTTPS 是怎么保证安全的?解析 流程图解

    • 非对称加密+对称加密SSL: 服务器明文传输公钥->客服端使用公钥加密得到密文(对称加密的秘钥x)-> 服务器私钥解密得到对称加密的秘钥x->服务器&客服端使用秘钥x进行对称加密传输数据
    • 第三方认证机构的CA证书:hash
  • 流与数据报的区别 解析

    • tcp流模式协议,可靠
    • udp数据报模式,数据可能会丢失
  • http 1.0 1.1 2.0有哪些改变 参考

    • http 1.0: 增加POST HEADER,支持请求头和相应头,扩充了传输内容格式Content-Type

    • http1.1 :

      1
      2
      3
      4
      1. 增加PUT DETELE
      2. 支持长连接Connection,可以设置keep-alive保持连接不断开
      3. 支持缓存 cache-control,客户端的静态文件缓存
      4. 支持断点重传,Content-Range: bytes 0-499/22400
    • http2.0

      1
      2
      3
      4
      二进制分帧: HTTP2之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率
      多路复用:在共享TCP链接的基础上同时发送请求和响应
      头部压缩: 维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源
      服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
  • http 断点重传原理 goto

  • 进程间通信几种方式,最快的是哪种?解析

    1
    2
    3
    4
    5
    1.管道:速度慢,容量有限,只有父子进程能通讯    
    2.FIFO:任何进程间都能通讯,但速度慢
    3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
    4.信号量:不能传递复杂消息,只能用来同步
    5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
  • fork() 会发生什么?

    • pid=0:子进程 pid=-1:错误失败 pid=1:父进程

API 篇

  • RESTful 是什么 阮一峰

  • 如何在不支持 DELETE 请求的浏览器上兼容 DELETE 请求

    • form表单添加 < input type = hidden name = _method value = DELETE>
  • 常见 API 的 APP_ID APP_SECRET 主要作用是什么?阐述下流程

    • app_id 开发者账号,app_key(账号权限)+app_secret(账号密码) 传送门
  • API 请求如何保证数据不被篡改?

    • https,sign排序签名,数据加密
  • JSON 和 JSONP 的区别 goto

    • jsonp支持跨域,附带callback,header支持Access-Control-Allow-Origin:domain
  • 数据加密和验签的区别 传送门

    • 数据加密 公钥加密,私钥解密,保证接收方数据安全
    • 数据签名 私钥加密,公钥解密,保证发送方数据安全,确保自己发送而不是别人
  • RSA非对称加密 是什么 goto

  • API 版本兼容怎么处理 传送门

    • url参数加版本号?v=2, header头部添加版本号
    • 通过token参数 服务端确认权限和版本
    • token 生成原理 传送门
    1
    2
    1. api_token = md5 ('模块名' + '控制器名' + '方法名' + '2017-07-18' + '加密密钥') = 770fed4ca2aabd20ae9a5dd774711de2
    2. user_token = user_id + 过期时间 + 加密密钥
  • 限流漏桶、令牌桶 传送门

    • 漏桶算法:强调流出速率,以恒定速率处理请求,水满则溢出拒绝服务,类似消息队列
    • 令牌桶: 强调流入,以一定速率往桶里加令牌,处理请求则获取一个令牌,桶满则不加令牌,优点在于能调整令牌加入速率(google Guava的RateLimiter)
  • OAuth 2 主要用在哪些场景下 rbac呢

    • oauth2 流程
    • 接口授权,用户权限
    • oauth2:按规则认证,权限粒度更细(查看按钮)。rbac基于节点认证,粒度比较大
  • JWT 传送门

  • PHP 中 json_encode(['key'=>123]);return json_encode([]); 区别,会产生什么问题?如何解决

拓展项

  • 了解常用语言特性,及不同场景适用性。
    • PHP VS Golang
    • PHP VS Python
    • PHP VS JAVA
  • 了解 PHP 扩展开发
  • 熟练掌握 C

本站点所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!