一、session和cookie区别
1. 存放位置:Session 保存在服务器,Cookie 保存在客户端。
2. 存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。
3. 用途:Cookies 适合做保存用户的个人设置,爱好等,Session 适合做客户的身份验证
4. 路径:Session 不能区分路径,同一个用户在访问一个网站期间,所有的 Session 在任何一个地方都可以访问到。而 Cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 Cookie 互相是访问不到的。
5. 安全性:Cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session
6. 大小以及数量限制:每个域名所包含的 cookie 数:IE7/8,FireFox:50 个,Opera30 个; Cookie 总大小:Firefox 和 Safari 允许 cookie 多达 4097 个字节,Opera 允许 cookie 多达 4096 个字 节,InternetExplorer 允许 cookie 多达 4095 个字节;一般认为 Session 没有大小和数量限制。
二、并发量
qps:每秒请求或查询数量
pv:综合浏览量
qps=(总pv数*80%)/(6小时秒数*20%)
三、spl函数
spl_autoload、spl_autoload_register、spl_autoload_extensions 、spl_autoload_functions
四、同步请求和异步请求的区别
1、同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
2、异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
五、oop特性
封装、继承、多态
六、git和svn的区别
1、Git是分布式的,而SVN不是分布式的
2、Git把内容按元数据方式存储,而SVN是按文件
3、Git没有一个全局版本号,SVN有,目前为止这是SVN相比Git缺少的最大的一个特征
七、rabbitmq的队列执行过程或通讯过程
假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:
- P1生产消息,发送给服务器端的Exchange
- Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
- Queue1收到消息,将消息发送给订阅者C1
- C1收到消息,发送ACK给队列确认收到消息
- Queue1收到ACK,删除队列中缓存的此条消息
Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:
- 如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
- 如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
- 如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
- rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。
大致流程:
消息的生产者(Producer)与rabbitmq server建立连接,并创建通道(channel);然后把消息传送至rabbitmq server上指定的Exchange中的queue里存放着;当有消息的消费者(Consumer)监听了这个queue时,就会接收该消息。
https://www.cnblogs.com/ysocean/p/9240877.html
八、rabbitmq处理异常的情况,比如邮件发送失败
1.自动重发
2.系统预警人工处理
九、如何防sql注入
1、pdo预处理
2、自定义方法,关键字过滤
select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile
https://blog.csdn.net/weixin_38281213/article/details/84315451
十、mysql锁机制及应用场景
https://www.cnblogs.com/Essaycode/p/10162010.html
十一、接口安全和防刷机制
用redis计数器防刷
INCR key
将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
https://www.cnblogs.com/yaozhengqi/p/7825343.html
十二、索引失效情况
1、条件包含or ,新版mysql支持命中
2、like查询是以%开头,索引不会命中
3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
4、没有查询条件,或者查询条件没有建立索引
5、查询条件中,在索引列上使用函数
6、采用 not in, not exist
7、联合索引遵循最左原则,不满足的不会命中
8、负向条件查询不能使用索引,可以优化为 in 查询。负向条件有:!=、<>、not in、not exists、not like 等
十三、缓存雪崩、缓存击穿和缓存穿透
缓存雪崩:同一批过期时间的缓存数据突然过期,且高并发的访问这批数据,会导致DB崩溃
缓存击穿:某个缓存到了过期时,出现高并发的访问时,db崩溃
缓存穿透:通过不存在的key去查缓存,缓存查找不存在,则去db查找,db返回null,实际就是DB承受了没有必要的查询流量
十四、水平分表查询问题
1、Mysql MERGE 引擎
2、Mysql 表分区,5.1 版本后才支持
3、union
4、按 搜索字段 建简单的冗余表/缓存进行查询
十五、tp3和tp5的区别
https://blog.csdn.net/qq_41846563/article/details/81234036
十六、top的替代命令
htop、vtop
十七、php7和php5的区别
1、性能提升:PHP7比PHP5.0性能提升了两倍。
2、全面一致的64位支持。
3、以前的许多致命错误,现在改成抛出异常。
4、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。
5、PHP 7.0比PHP5.0新增了空接合操作符。
6、PHP 7.0比PHP5.0新增加了结合比较运算符。
7、PHP 7.0比PHP5.0新增加了函数的返回类型声明。
8、PHP 7.0比PHP5.0新增加了标量类型声明。
9、PHP 7.0比PHP5.0新增加匿名类。
十八、rdb和aof的区别
aof是持续的用日志记录写操作,crash后利用日志恢复;
rdb是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
十九、如何设置错误级别
error_reporting
二十、如何捕捉错误
set_error_handler('errorHandler');
/** * @param int $err_no 错误代码 * @param string $err_msg 错误信息 * @param string $err_file 错误文件 * @param int $err_line 错误行号 * @return string */ function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0) { $log = [ '['.date('Y-m-d h-i-s').']', '|', $err_no, '|', $err_msg, '|', $err_file, '|', $err_line ]; $log_path = './test.txt'; error_log(implode(' ',$log)."\r\n",3, $log_path); }
二十一、为什么 PHP7 比 PHP5 性能提升了?
1、变量存储字节减小,减少内存占用,提升变量操作速度
2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率
二十二、http错误代码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息 -- 表示请求已接收,继续处理
2xx:成功 -- 表示请求已被成功接收、理解、接受
3xx:重定向 -- 要完成请求必须进行更进一步的操作
4xx:客户端错误 -- 请求有语法错误或请求无法实现
5xx:服务器端错误 -- 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK // 客户端请求成功
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable // 服务器超时 // 可能恢复正常
304 Not Modifed // 自从上次请求后,请求的网页未修改过
二十三、int10和int11的区别
这里是显示长度,跟存储长度无关
二十四、文件锁
flock、排他锁
二十六、高并发,大流量处理及解决方法
1、确认服务器硬件是否足够支持当前的流量。
2、优化数据库访问
3、禁止外部的盗链
4、控制大文件的下载
5、使用不同主机分流主要流量
6、使用流量分析统计软件
二十七、事务隔离
https://www.cnblogs.com/huanongying/p/7021555.html
二十八、建表原则
3NF,第三范式原则
https://blog.csdn.net/CharlesYooSky/article/details/89204229
二十九、索引的数据结构
https://blog.csdn.net/wufuhuai/article/details/79631466
三十、最优无限分类
https://blog.csdn.net/sunnyxuebuhui/article/details/53538716
三十一、主从数据库延迟
三十二、设计表时要注意:
1、表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。
2、尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。
3、使用枚举或整数代替字符串类型
4、尽量使用TIMESTAMP而非DATETIME
5、单表不要有太多字段,建议在20以内
6、用整型来存IP
三十三、MySQL单表数据量过千万,采坑优化记录,完美解决方案
https://blog.csdn.net/yongtaoli/article/details/88687527
三十四、禁用cookie后session是否还能用?
参考链接 :https://blog.csdn.net/baochao95/article/details/72884803
禁用cookie后,session还是可以使用的。禁用cookie后,服务器每次session_start的时候都会创建一个单独的session文件,后果就是无法让多个页面共享同一份session。
可以url重定向方法解决这个问题,在session_start();前设置session_id
三十五、php-fpm工作原理
FPM是一个PHP进程管理器,包含master和worker两种进程
master进程只有一个,负责监听端口,接收来自服务器的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
从FPM接收到请求,到处理完毕,其具体的流程如下
1).FPM的master进程接收到请求。
2).master进程根据配置指派特定的worker进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合Nginx遇到502错误比较多的原因。
3).worker进程处理请求,如果超时,返回504错误。
4).请求处理结束,返回结果。
三十六、导致502错误的原因有哪些,怎么解决
原因:php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉
解决方案:
1、查看当前的PHP FastCGI进程数是否够用
2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间。
三十七、http请求报文格式和响应报文格式
https://www.cnblogs.com/CodingUniversal/p/7524088.html
HTTP 请求报文
HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成
典型的请求头有:
● User-Agent:产生请求的浏览器类型;
● Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
● Accept-Language:客户端可接受的自然语言;
● Accept-Encoding:客户端可接受的编码压缩格式;
● Accept-Charset:可接受的应答的字符集;
● Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
● connection:连接方式(close 或 keepalive);
● Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
HTTP 响应报文
HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成
支付异常情况
socket的了解
https://www.jianshu.com/p/850da820357c
解决高并发的方案
https://www.cnblogs.com/walblog/articles/8476579.html
mysql 索引原理
https://blog.csdn.net/u013967628/article/details/84305511
sql case when用法
select count(id), (case
when Req.id <= 100 then 100
when Req.id > 100 and Req.id < 200 then 200
when Req.id > 100 then 300
end
) 级别 from ocs_reqs Req group by 级别 limit 10
快速排序
https://www.cnblogs.com/chenhaoyu/p/9093483.html
冒泡排序
// 2019年小米春季上海 PHP 实习生招聘面试题
https://learnku.com/articles/21993
// 基础面试题
https://learnku.com/articles/24140