一、PHP 新版本特性
PHP 7是一个重大版本,引入了许多新特性和性能优化,比如返回类型声明、泛型、异步函数、NUllable类型和标量类型声明等。
PHP 8 (2018 - 今)
PHP 8 引入了许多新特性和改进,在性能上有大幅提升,包括Just-in-Time (JIT) 编译器、属性的初始化简化语法、Union Types(联合类型)等
二、http 状态码
HTTP协议中几个状态码的含义:1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx (成功)
表示成功处理了请求的状态代码
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备 完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本
三、tcp三次握手和四次挥手
三次握手
TCP连接是通过三次握手来连接的。
第一次握手
当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为m,等待服务器确认,这时客户端的状态为SYN_SENT。
第二次握手
当服务器收到客户端发送的SYN后,服务器要做的是确认客户端发送过来的SYN,在这里服务器发送确认包ACK,这里的ACK为m+1,意思是说“我收到了你发送的SYN了”,同时,服务器也会向客户端发送一个SYN包,这里我们设SYN为n。这时服务器的状态为SYN_RECV。
一句话,服务器端发送SYN和ACK两个包。
第三次握手
客户端收到服务器发送的SYN和ACK包后,需向服务器发送确认包ACK,“我也收到你发送的SYN了,我这就给你发个确认过去,然后我们即能合体了”,这里的ACK为n+1,发送完毕后,客户端和服务器的状态为ESTABLISH,即TCP连接成功。
在三次握手中,客户端和服务器端都发送两个包SYN和ACK,只不过服务器端的两个包是一次性发过来的,客户端的两个包是分两次发送的。
四次挥手
当A端和B端要断开连接时,需要四次握手,这里称为四次挥手。
断开连接请求可以由客户端发出,也可以由服务器端发出,在这里我们称A端向B端请求断开连接。
第一次挥手
A端向B端请求断开连接时会向B端发送一个带有FIN标记的报文段,这里的FIN是FINish的意思。
第二次挥手
B端收到A发送的FIN后,B端现在可能现在还有数据没有传完,所以B端并不会马上向A端发送FIN,而是先发送一个确认序号ACK,意思是说“你发的断开连接请求我收到了,但是我现在还有数据没有发完,请稍等一下呗”。
第三次挥手
当B端的事情忙完了,那么此时B端就可以断开连接了,此时B端向A端发送FIN序号,意思是这次可以断开连接了。
第四次挥手
A端收到B端发送的FIN后,会向B端发送确认ACK,然后经过两个MSL时长后断开连接。
MSL是Maximum Segment Lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。
四、laravel 问题
1、laravel的生命周期
1、从public\index.php,进入框架;
2、注册加载composer自动生成的class loader,初始化第三方依赖;
3、生成容器(bootstrap/app.php),注册核心组件(Kernel::class);
4、处理请求,生成并返回响应;
5、结束请求,进行回调
2、yii和laravel 和thinkPHP 的区别?
yii和laravel 和thinkPHP 的优缺点
Yii、Laravel和ThinkPHP都是流行的PHP框架,每个都有其特点和适用场景。
Yii:
优点:性能出色,生产环境优化良好,功能丰富,社区活跃,有丰富的扩展。
缺点:学习曲线陡峭,对PHP新特性支持不够灵活。
Laravel:
优点:简洁的语法,支持PHP新特性,强大的功能如Eloquent ORM和依赖注入,社区生态丰富。
缺点:性能调优可能不如Yii高效,对PHP版本更新较为保守。
ThinkPHP:
优点:入门简单,有清晰的文档和教程,适合快速开发,易于学习和使用。
缺点:功能不如Yii和Laravel全面,社区活跃度不及前两者,可能缺乏某些高级特性。
五、MySQL 相关
1、视图(View)的是什么? 优点是?
MySQL视图是一种虚拟存在的表,它由一个SQL查询定义,并不存储实际的数据。 视图的定义保存在数据字典内,而创建视图所基于的表称为“基表”。视图的数据来自于查询执行的结果,并且可以像表一样被查询、更新和删除
视图可以简化复杂的SQL查询,保护数据(通过限制对特定数据的访问),更改数据格式和表示等。
2、存储过程(Stored Procedure)是什么?
存储过程是一组为了完成特定功能的SQL语句,存储在数据库中,可以通过指定的名称和参数进行调用。存储过程可以提高SQL代码的重用性,减少网络通信量,提高性能。
3、归一化是什么?它有哪些类型?
归一化是数据库设计中的一个过程,目的是减少数据冗余和提高数据完整性。常见的归一化形式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和博耶-科得范式(BCNF)。
MySQL的三大范式是数据库设计的基本原则,它们分别是:
第一范式(1NF):
确保数据库表字段的原子性。
第二范式(2NF):
首先要满足第一范式,另外包含两部分内容,一是表必须有一个主键;二是非主键列必须完全依赖于主键,而不能只依赖于主键的一部分
第三范式(3NF):
首先要满足第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
4、外键(Foreign Key)是什么?
外键是一种数据库约束,用于建立两个表之间的关系。在一个表中的外键会指向另一个表的主键,主要作用是维护跨表的数据完整性,确保参照完整性。
5、事务隔离级别是什么?它们如何影响并发?
https://blog.youkuaiyun.com/m0_48904153/article/details/126630012
MySQL支持四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。这些隔离级别逐渐增强了事务之间的隔离,防止了不同程度的并发问题,但同时可能降低并发性能。
5.1 事务的特性?
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。这保证了事务的完整性,即事务的每一步操作要么全部成功,要么全部失败回滚
一致性(Consistency):一致性确保事务前后数据的状态转换是一个合法状态。这意味着事务执行前后的数据必须满足业务规则和约束条件,保持数据的一致性和正确性。
隔离性(Isolation):隔离性保证了多个并发事务的执行是相互隔离的。这防止了一个事务在执行过程中被其他事务干扰,从而保持了数据的隔离和独立性。隔离级别包括读未提交、读提交、可重复读和串行化,可以根据具体应用场景选择合适的隔离级别。
持久性(Durability):持久性意味着一旦事务被提交,它对数据库中数据的修改就是永久性的。即使系统发生故障,已提交的事务修改仍然保持不变。这是通过事务日志(redo log 和 undo log)来保证的,确保在系统故障后能够恢复数据
脏读 事务B读取事务A 修改但未提交的数据
不可重复读 事务A多次读取一条数据,这时事务B修改了这条数据,导致事务A 多次读取的数据不一致
幻读 当数据管理员A 在批量修改增加或者修改数据的时候,此时数据管理员在此时插入或者删除了一条数据,当数据管理员A修改完数据发现还有一条数据
没有修改到,就像发生了幻觉一样。
读未提交 产生脏读、不可重复读、幻读
读已提交 产生不可重复读、幻读 解决脏读
可重复读 产生幻读 解决脏读、不可重复读
串行化 执行效率慢,资源消耗大 解决幻读
6、如何在MySQL中使用索引优化查询?
使用索引优化查询的一种方式是确保WHERE子句中的条件使用了索引。例如,如果有一个名为students的表,其中包含name和age列,对age列有索引,那么查询SELECT * FROM students WHERE age > 18;将利用age列的索引,提高查询效率。
7、慢查询日志是什么?如何使用它来优化性能?
慢查询日志记录执行时间超过设定阈值的SQL语句,通过分析这些日志,可以找出需要优化的查询语句。开启数据库的慢查询记录功能后,可以从慢查询日志中获取哪些SQL语句执行缓慢,进而进行分析和优化。
查询五子句
where having group by limit order by
7.9. 索引有什么分类?
1、主键索引:名为primary的唯一非空索引,不允许有空值。
2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:唯一索引
字段可以为null且可以存在多个null值,而主键索引字段不可以为null。唯一索引的用途:唯一标识数据
库表中的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下:
3、组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,
索引才会被使用,使用组合索引时需遵循最左前缀原则。
4、全文索引:只能在 CHAR 、 VARCHAR 和 TEXT 类型字段上使用全文索引。
5、普通索引:普通索引是最基本的索引,它没有任何限制,值可以为空。