PHP知识点汇总
本文最后更新于:2 年前
phper-knowledge
该仓库主要记录php开发遇到的知识点。
针对相应知识点,附上便于理解的链接,若有更好的资源,欢迎提交更正交流。
基础篇
-
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了
-
- isset=>false: var $x; $x=null;unset($x)
-
static 未实现时,将其指向了运行时最初调用的类
self 未实现方法时指向父类,实现后指向当前
$this 指向对象的方法,不能静态方法
private、protected、public、final 区别
public实例能调用 protected实例不能直接调用 final不能继承和重写
OOP 思想
php 499 500 502 504 错误原因 参考
499 Client Closed Request 客户端超时,nginx&php-fpm正常执行
curl -m 3
500 Server Internetel Error php-fpm无法正常工作(代码错误)
502 Bad GateWay php-fpm执行超时,返回给网关无法解析内容(不按套路出牌,fpm数量不够)
504 GateWay Timeout nginx超时,fastcgi_read_timeout,php-fpm 正常执行
进阶篇
Autoload、Composer 原理 PSR-4 、原理
必须有顶级命名空间
必须有最终类名
类名必须大小写敏感
必须文件php后缀
子命名空间 必须 与相应的「文件基目录」相匹配
一定不可 抛出异常、一定不可 触发任一级别的错误信息
-
- 存活: 默认存活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 预定义接口如何获取客户端 IP 和服务端 IP 地址
如何开启 PHP 异常提示
- php.ini 开启
display_errors
设置error_reporting
等级 - 运行时,使用
ini_set(k, v);
动态设置
- php.ini 开启
-
- [WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用
die
orexit
- [WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用
如何获取扩展安装路径
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”);检测、去除
- win记事本保存默认开头
什么是 MVC
-
<img src="xxx.php">
- ajax异步 但需要onload后执行
- 异步执行php脚本 如执行shell脚本exec() 但只能本机脚本
- 使用curl 但是timeout最小是1s
- 使用fsockopen 需要自己拼写发送内容
-
- __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’
1 |
|
实践篇
给定二维数组,根据某个字段排序 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 存服务端 用户不可见 支持多种数据类型 缓存时间有限 服务器压力大
GET
与POST
区别 (传送门)[https://www.zhihu.com/question/28586791]include
与require
区别- include 使用时加载,require一开始就加载
- include 错误时继续执行代码, require 停止执行
include_once
与require_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
-
JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN 传送门
join 索引等优化 传送门
UNION, UNION ALL
GROUP BY + COUNT + WHERE 组合案例 详情
1:1
、1:n
、n:n
各自适用场景了解触发器是什么,说个使用场景 传送门
数据库优化手段
索引相关
- 索引,聚集索引, 非聚集索引
会使用
explain
分析 SQL 性能问题,了解各参数含义 传送门重点理解
type
、rows
、key
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 mode; update 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
2ps -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消息队列
框架篇
- 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
41.多线程运行,实例未创建导致创建多实例
2. 多进程运行,子进程使用父进程实例有问题
3.长时间不使用会被GC回收
4.单一拓展困难工厂模式(重点)
观察者模式(重点)传送门
- 主题Subject实现attach detach notify 观察者Observer实现update()
依赖注入(重点)传送门
- 依赖注入DI: 具有Interface的工厂类,能力实现在外部
- 控制反转IOC:DI上的容器container概念,make &bind活用闭包实现
- 主要概念:超人由固定多能力转换成外部赋予单一能力
装饰器模式 传送门
代理模式 传送门
- Proxy代理&RealSubject实现Subject的接口方法
- 可以理解成代理服务器
组合模式
安全篇
- SQL 注入
- XSS 与 CSRF
- 输入过滤 (goto)[https://laravelacademy.org/post/4610.html]
- Cookie 安全
- 禁用
mysql_
系函数 - 数据库存储用户密码时,应该是怎么做才安全 (sha加密 md5+salt)
- 验证码 Session 问题 验证通过后清空
- 安全的 Session ID (让即使拦截后,也无法模拟使用)
- 目录权限安全 770 750 640
- 包含本地与远程文件
- 文件上传 PHP 脚本
eval
函数执行脚本disable_functions
关闭高危函数- FPM 独立用户与组,给每个目录特定权限
- 了解 Hash 与 Encrypt 区别
- hash不可逆但能被穷举
- encrypt 可逆
高阶篇
- PHP 数组底层实现 (HashTable + Linked list)传送
1 |
|
Copy on write 原理,何时 GC
实例代码
1
2
3$a = array( 'one' );
$a[] =& $a;
unset($a);
PHP 进程模型,进程通讯方式,进程线程区别
僵尸进程和孤儿进程和守护进程
- 孤儿进程: 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
- 僵尸进程: 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程(ps 进程状态’Z’)
yield 核心原理是什么 传送门
PDO prepare 原理 (绑定变量 相当于预设输入是字符串)
1 |
|
- Swoole 适用场景,协程实现方式 swoole文档
前端篇
- 原生获取 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 在尾部的优化(原理)
网络篇
网络编程篇
TCP 三次握手 四次挥手流程 传送门
- 三次握手 server半连接,伪造大量syn包造成ddos攻击
TCP&UDP区别,分别适用场景 传送门
OSI七层协议 缩写 物链网 传输会话表示应用
TCP 粘包如何解决?原因及处理
为什么需要心跳? 传送门
- TCP并无及时的断线检测
- TCP的keepalive能检查deadLink,但影响全局
什么是长连接?
-
- 非对称加密+对称加密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
41. 增加PUT DETELE
2. 支持长连接Connection,可以设置keep-alive保持连接不断开
3. 支持缓存 cache-control,客户端的静态文件缓存
4. 支持断点重传,Content-Range: bytes 0-499/22400http2.0
1
2
3
4二进制分帧: HTTP2之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率
多路复用:在共享TCP链接的基础上同时发送请求和响应
头部压缩: 维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源
服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
http 断点重传原理 goto
进程间通信几种方式,最快的是哪种?解析
1
2
3
4
51.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存fork()
会发生什么?- pid=0:子进程 pid=-1:错误失败 pid=1:父进程
API 篇
RESTful 是什么 阮一峰
- 如何设计RESTful 阮一峰
- php 实现RESTful
如何在不支持
DELETE
请求的浏览器上兼容DELETE
请求- form表单添加
< input type = hidden name = _method value = DELETE>
- form表单添加
常见 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
21. 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([]);
区别,会产生什么问题?如何解决输出
1
2
3
4
5
6json_encode(['key'=>123]);
return json_encode([]);
#输出
string(11) "{"key":123}"
string(2) "[]"- 区别 {}是对象(key是string),[]是数组(key是int) (传送门)[https://blog.csdn.net/weihuiblog/article/details/79124364]
拓展项
- 了解常用语言特性,及不同场景适用性。
- PHP VS Golang
- PHP VS Python
- PHP VS JAVA
- 了解 PHP 扩展开发
- 熟练掌握 C
本站点所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!