「PHP面试题」跳槽面试必背-自己最近5年的整理(一)
大厂最全面试题:分享一波腾讯PHP面试题2021最新大厂PHP面试题(附答案)php面试题之PHP核心技术PHP 2021经典面试题集100 个常见的 PHP 面试题和答案分享面试10家公司,收获9个offer,2021年PHP 面试问题1. 实现删除一个数组里面的重复值?
使用键值反转
最全PHP进阶架构资料,为打造自己可以在工作中休息时间学习哦!!
array_flip();
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$result=array_flip($a1);
print_r($result);
?>
function unique3(array){
var n=[array[0]];//结果数组
//从第二项开始遍历
for(var i=1; i<array.length; i++){
//如果当前数组的第i项在当前数组中第一次出现的位置不是i;
//那么表示第i项是重复的,忽略掉。否则存入结果数组。
if(array.indexOf(array[i])==i){
n.push(array[i]);
}
}
return n;}2. 什么是 redis?
开源 先进的 key-value 存储
远程字典服务器 内存级数据库 数据结构服务器
一个基于内存的网络存储系统
3is 数据类型有哪几种?
值(value)可以是:字符串 (String),
哈希 (hash),
列表 (list),
集合 (sets)
有序集合 (sorted sets)
4is 持久化是如何操作的?
为了保证效率数据都缓存在内存中,可以周期性写入磁盘或者把修改操作写入文件(持久化)。
RDB 持久化,将 redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。
AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 redis 的协议格式来保存的。
社区福利安排PHP进阶架构资料,免费获取5is 适应的一些场景
1、取最新 N 个数据的操作
2、排行榜应用,取 TOP N 操作
3、需要精准设定过期时间的应用
4、计数器应用
5、Uniq 操作,获取某段时间所有数据排重值
6、实时系统,反垃圾系统
7、Pub/Sub 构建实时消息系统
8、构建队列系统
9、缓存
6is 的三个特点?
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
7.ECS 与虚拟主机的区别介绍
一个是服务器
一个相当于是服务器里的文件夹
云主机是在集群服务器上划分出来的独立的内存.硬盘.带宽等资源搭建而成的 一个虚拟服务器.有独立的IP和带宽,可以根据需求安装各版本操作系统以及 配置各种网站运行环境,有远程桌面连接东西.是完全独立的.
而虚拟主机是在服务器硬盘上划分出来的一部分存储空间,它共享的是服务器 的IP和带宽.没有独立的资源和独立的操作系统.没有远程桌面功能,通常虚拟主机所支持的网站程序也是默认分配好的.没有办法由用户自己配置环境.功能相对单一.
8. 重启 redis
service redis-server restart
9. 有序集合是怎么排序的?
? 它给集合中的每一个元素设置分数,按照其分数进行排序,也不允许有重复值
10. 谈谈你对 memcache 的理解
免费并且开源,高性能的,分布式的内存对象缓存系统
数据形态以key->value结构
用于从数据库调用、API调用或页面呈现的结果中获得少量任意数据(字符串、对象)。
11. 谈谈你对 redis 的理解
- 开源 先进的key-value存储
- 远程字典服务器 内存级数据库 数据结构服务器
- 一个基于内存的网络存储系统
五种数据类型 字符串(String), 哈希(hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)
三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 储。
Redis支持数据的备份,即master-slave模式的数据备份。
应用场景:
1、取最新 N 个数据的操作
2、排行榜应用,取 TOP N 操作
3、需要精准设定过期时间的应用
4、计数器应用
5、Uniq 操作,获取某段时间所有数据排重值
6、实时系统,反垃圾系统
7、Pub/Sub 构建实时消息系统
8、构建队列系统
9、缓存
12. memcached 与 redis 的区别
两者对比:
redis提供数据持久化功能,memcached无持久化;redis的数据结构比memcached要丰富,能完成场景以外的事情;memcached的单个key限制在250B,value限制在1MB;redis的K、V都为512MB;当然这些值可以在源码中修改;memcached数据回收基于LRU算法,Redis提供了多种回收策略(包含LRU),但是redis的回收策的过期逻辑不可依赖,没法根据是否存在一个key判断是否过期。但是可根据ttl返回值判断是否过期;memcached使用多线程,而redis使用单线程,基于IO多路复用实现高速访问。所以可以理解为在极端情况下memcached的吞吐大于redis。
结论:
普通KV场景:memcached、redis都可以。
从功能模块单一这个角度考虑的话,推荐memcached,只做cache一件事。
在KV长度偏大、数据结构复杂(比如取某个value的一段数据)、需要持久化的情况下,用redis更适合:但是在使用redis的时候单个请求的阻塞会导致后续请求的积压,需要注意
13. 缓存的原理
? 有缓存则读缓存,没缓存则读数据库然后做缓存
14. memcache 和 memcached 的区别
memcached是php连接memcached服务器的php扩展它的名字就叫memcached
以前有个叫memcache也是php连接memcached服务器的扩展,它的名字叫memcache
php的memcache和memcached扩展都是作为客户端去连接memcached服务器
但memcached作为客户端比memcache性能更好功能更强大,而且memcache已经停止更新了,因此现在使用扩展的 话就用memcached
15. 存放 session 的三种方法
1、如果你能修改到服务器配置文件,那就打开打开php.ini
修改下面两项:
session.save_handler=memcache
session.save_path="tcp://127.0.0.1:11211"
2、修改网站根目录下的.htaccess文件
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
3、最常用的方法 在程序代码中修改(推荐)
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
16. mysql 优化的一般步骤?
1. sql及索引
索引优化
开启慢查询日志 分析sql语句 分析是否加上索引 分析是否用上索引
2. 数据库表结构
3.系统配置
4. 优化计算机硬件
17. 对 mysql 事物的理解?
是多个步骤为一个过程的事务(整体)
1. 事务使用 INNODB 数据库引擎
如果你不是INNODB ,开启事务,删除那就真的删除了.
2. 要么成批的sql全部执行,要么不执行
3. 事务用来管理 insert update delete 的语句
事务条件:
原子性 一组事务,要么成功,要么撤回.
稳定性 有非法数据(外键约束),事务撤回
隔离性 事务独立运行. 一个事务,处理后的结果影响到了其他事务,则事务撤回!
可靠性 软件或者硬件崩溃,Innodb 表驱动,会利用日志文件,重构修改. 可靠 性 高速度 不可兼得
关键字:
Commit 提交 当一个事务完成后,发出commit 命令使所有的参与表 完成更改.
Rollback 回滚 如果发送故障,发出rollback命令 使事务返回到 所有表以前的状态.
语句:
set autocommit=0;
sql操作
savepoint p1;
sql操作
savepoint p2;
sql操作
ROLLBACK to p2;
commit;
18. mysql 触发器是什么?
? 监视某种事件,并触发某种操作 (商品的添加,订单的删除 等等 连贯操作时候使用)
###触发四要素
1. 监视地点 table
2. 触发时间 (after/ before)
3. 监视事件 (insert/update/delete)
4. 触发事件 (insert/update/delete)
1、创建一个名为tg1的触发器,当向t1表中插入数据前,就向a表中插入一条数据
delimiter // mysql中可以转换结束符
mysql>create trigger tg1 before insert on t1 for each row #固定写法
->begin
-> insert into a values (4);
->end//
19. 什么是组合索引,及使用情况?
将两个字段共同添加一条索引
例子:当前组合索引是这样一个顺序 ind_status_email(status,email)
单独查询status时,可以用到这个索引,单独查询email时,却用不到
再问: id name password 建立组合索引 怎么建立?为什么?
name,password
因为先到先得, name查询是多!!! 很少会通过password来查
先到先得 如何设置我索引?
根据字段的辨识度来做
20. 为什么 like 在 % 第一个字符用不到索引?
like % 校 会查处当前所有的姓,再去查名中有没有校 所以 会进行全表扫描,浪费性能
21. 测试分析 sql 语句
普通查询分析:
desc select * from users 或 explain select * from users 效果一样
关键字段: table:输出结果集的表名
key:表示实际使用的索引
keys_possible (可能用到的索引)
rows:扫描行的数量
22. 为什么不分开加索引?而非要加组合索引?
1. 索引不是越多越好. 浪费资源 索引暂用资源,影响插入性能

浙公网安备 33010602011771号