http://www.panwenbin.com/38
PHP进阶学习交流QQ群:983229225
PHP运行原理
FastCGI
与cgi区别:cgi是请求过来再初始化进程并执行代码,FastCGI预先初始化一些进程,请求过来可以直接分发处理,并且进程重复使用,实现了一个进程池。
与php-fpm关系:php-fpm是一个被纳入php核心的FastCGI进程管理程序(FastCGI Process Manager),FastCGI模式的关键部分是对fastcgi进程的有效管理。
与nginx通讯:nginx通过tcp socket或者unix socket与fastcgi进程通讯。
swoole
与fastcgi区别:swoole接管了nginx和php-fpm这部分的功能,由类似的进程结构实现。避免了fastcgi每次请求初始化后所有文件都需要重新加载。
进程结构:一个master(相当于nginx角色),一个manager(相当于fpm角色),若干worker(相当于fastcgi进程),若干taskWorker(用于异步处理长时间的任务)。
异步事件模型,并实现了一些异步IO库。
2.0开始内置协程(Coroutine)
垃圾回收
PHP使用基于引用计数的垃圾回收机制,垃圾回收周期为引用数减到非零值时。
简单算法描述
冒泡排序(2轮循环)
第一层通过连续比较交换,把最大的值放到末尾
循环此过程(不含上一轮末尾的值)
快速排序(递归)
与预选值比较,把要排序的数据分为2部分:<=预选值和>预选值。
对每部分递归调用,直到最后不能再分(只剩一个值)。
MySQL
存储引擎(这可能是个过时的问题)
MySQL5.5之后默认引擎已改为InnoDB,使用MyISAM(读更快,不支持事务,不支持行锁)的理由更小了。MyISAM to InnoDB: Why and How
其他引擎平时并不常用,只做了解。Alternative Storage Engines
MyISAM、MEMORY、CSV、ARCHIVE、BLACKHOLE、MERGE、FEDERATED、EXAMPLE、其他
索引
种类:主键(Primary)、唯一索引(unique)、普通索引(index)、组合索引(unique或index)、全文索引(fulltext)
聚集索引:其中InnoDB的主键是聚集索引,与数据存储结构一致。所以查询时可直接拿到数据,不需要二次取数据。
组合索引:组合索引的存储结构是一棵树,使用索引的条件是查询字段要按照树的主干节点往后连续。
B树与Hash索引:B树索引用于可比较大小的值,支持范围查找;Hash索引只能精确匹配,不能范围查找。
explain查看索引使用情况
type值从好到坏:const、eq_reg、ref、range、index、ALL
更详细的可以用performance_schema
如何优化MySQL(套路)
设计表时遵循三大范式,适当反范式
合理设计索引,针对慢查询调整索引
实时性低、消耗大的查询加缓存
大量数据写入可以攒一些批量写入
选用SSD作为存储介质
主从分离,分担查询负担
使用MySQL自带分区功能,对外透明(不常用)
分库分表降低单实例、单表的负担
参考: MySQL如何优化
一致性Hash算法解释
先准备0~2^32的圆盘
将存储数据key的hash值映射到圆盘上
将服务器标识的hash值也映射到圆盘上
顺时针查找,将数据存储到第一个找到的服务器上
设计模式
可以知道一些设计模式:
单例、工厂、池;注入(IoC/DI);观察者;适配器;代理;策略;装饰器;
平时使用框架和思考过程中就一直在使用设计模式,不建议过分强调设计模式,它是自然而然的产物。为了设计模式而设计模式就是本末倒置了!
熟悉设计模式可作为参考,设计模式都是比较成熟的处理特定问题的方案,不需要在这些常见问题上绞尽脑汁。
消息队列
消息队列适用于异步/串行化处理任务。架构上可用于解耦消息通讯。
按角色分为生产者和消费者:
生产者,产生消息的应用
消费者,处理消息的应用
实现:Redis、Beanstalkd、RabbitMQ、RocketMQ、Kafka等
Redis
数据结构:String(字符串)、List(列表)、Set(集合)、Hash(Map)、Zset(有序集合);
应用场景:
缓存
计数器(原子操作)
队列(列表)
位操作(大量状态数据)
分布式锁与单线程机制(Redis单线程)
排行榜(Zset)
依赖注入
依赖注入(DI)/控制反转(Ioc):将依赖关系从程序中提取到外部,并在运行时注入回去。
好处:可以解耦调用与实现,方便的替换实现。
注入方法:通过读取配置或者传参。
实现方式:通常不同实现会实现同一套接口,调用处只调用接口。
SSL原理
这里说一下SSL通讯过程。
客户端与服务端建立连接
互相Hello(包含支持的版本、算法;加上随机数)
服务端发送公钥
客户端发送公钥(双向验证才需要,单向跳过)
服务端验证客户端公钥(双向验证才需要,单向跳过)
客户端验证服务端公钥
交换DH参数(如果用DH密钥交换算法)
客户端生成PreMaster Secret,并发送给服务端(DH根据随机数和参数直接算)
服务端解密PreMaster Secret,得到对称密钥(DH根据随机数和参数直接算)
使用对称密钥通讯
HTTP/2新特性
二进制分帧、多路复用、流优先级、服务器推送、头部压缩、应用层协商协议
*强制SSL,虽然规范没有强制,但是所有浏览器均只支持SSL下的HTTP/2
HTTP/2 Frequently Asked Questions。
需要自己总结的内容
项目过程中遇到的问题及如何解决的
自己做出的比较突出的成绩
您还有什么问题要问的吗?
对于优秀的面试官,应该知道应聘者如果入职,需要知道哪些东西,而主动告知。
比如:所属团队,工作环境,工作内容,工作强度;
人事可以告知公司特有的文化、规范;
如果这些面试官没有主动告知,请问清楚。
也可以问一些生活相关的事宜。
关注 架构师学习路线 升职涨薪不是梦