2020最新大厂内部 PHP 高级工程师面试题汇总(二)

51、数据库中的存放了用户 ID, 扣费很多行,redis 中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到 redis 中,每 5 分钟执行一次。请问要考虑哪些问题?

思路:生产者和消费者模式。这个问题也没有说其他的状态,比如数据库的数据会实时增加么?redis 中每个钱包是否有其他服务在读取或者写入啊。什么的。数据库和 REDIS 放一起,要么考数据一致性,要么考出现锁,导致效率降低。

52、MYSQL 主从服务器,如果主服务器是 innodb 引擎,从服务器是 myisam 引擎,在实际应用中,会遇到什么问题?

53、linux 中进程信号有哪些?

54、redis 的底层实现

面试官这么样问你,你就反问他,你要的底层实现是字段的设计?内存分配管理?网络模型?数据同步?还是分布式的实现?(TIPS: 面试就是两个人的博弈。面试官给出一个描述不清晰的问题,我们没必要回答。让他把问题讲清楚再思考怎么回复)

55、异步模型

问清楚是 IO 异步模型。还是 AJAX 这类的异步请求模型。差别非常大的。

56、10g 文件,用 php 查看它的行数

粗暴一点的方法 ini_set (‘memory_limit‘,‘-1‘); 先把当前内存限制解除了 然后直接逐行统计。时间会非常的久。

有更好的方法请留言。

57、有 10 亿条订单数据,属于 1000 个司机的,请取出订单量前 20 的司机

(TIPS)不要中招。不要用常用思路来处理,10 亿数据 你再怎么优化,全表求和,都是要死人的。

我们从设计上解决这个问题。只有一千个司机。我们可以做个简单哈希,分库分表,% 求余数。保证这一千个司机分在一千个表里,每个人有每个人的单独表。引擎用 MYSAIM,求表中数据的总数,效率飞快,遍历一千张表,求最大前二十即可。

58、设计一个微信红包的功能

没做过。其实题目表达不清楚。如果做过微信公众号开发,知道微信事件模型的 XML 数据结构,应该会好做一点。

59、根据 access.log 文件统计最近 5 秒的 qps,并以如下格式显示,01 1000(难点在 01 序号)

tail -f access.log | awk -F ‘[‘ ‘{print $2}‘ | awk ‘{print $1}‘ | uniq -c

60、php7 性能为什么提升这么高

不逼逼,直接参考:http://www.laruence.com/php-internal

鸟哥的文章要多读,多读。

61、遍历一个多维数组

递归。array_map 传入一个回调函数。

62、有这样一个字符串 abcdefgkbcdefab...... 随机长度,写一个函数来求 bcde 在这个字符串中出现的次数

substr_count();

63、有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 个字节,内存限制大小是 1M。返回频数最高的 100 个词

方法太多了,但是实现起来 各有各的问题。

我可能只会用 HASH 映射做。其他的,不会。

参考:第 64 题。

64、十道海量数据处理面试题与十个方法大总结

https://blog.csdn.net/v_JULY_v/article/details/6279498

65、php 进程模型,php 怎么支持多个并发

守护进程模型(需要知道 php-fpm 的各种配置了)

参考:https://www.jianshu.com/p/542935a3bfa8

66、nginx 的进程模型,怎么支持多个并发

这个三言两语说不清楚。

参考:https://www.zhihu.com/question/22062795

67、php-fpm 各配置含义,fpm 的 daemonize 模式

php-fpm 的配置并不多,常用的就更少了。

参考:http://www.4wei.cn/archives/1002061

static - 子进程的数量是固定的(pm.max_children)
ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动
dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

68、让你实现一个简单的架构,并保持高可用,两个接口,一个上传一条文本,一个获取上传的内容,你怎么来设计?要避免单机房故障,同时要让代码层面无感。

69、两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的

不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。

如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。

以上全是应急操作。实际上数据库的容灾设计要复杂的多。

面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,你们每秒多少写入操作。按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。这个级别的数据同步,出现差异的概率 可以忽略不计的。有一台出现问题,另一台也可以抗住。

(正常的操作,还是先停写,等数据一致,切换,开写。我们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个。前后耽搁不到 20 秒)。

70、http 协议具体的定义

这种题 有是很难回答的。太宽泛了,我们面试早就不问这种问题了。

71、什么是锁,怎么解决锁的问题

计算机原理学的,生产者消费者模型,银行家模型,都可以解决锁的问题。

72、rand 与 mt_rand 的区别

我实习的时候遇到这个坑。

说是 mt_rand 比 rand 快 4 倍。

在随机数区间不大的情况下并没有很大的效率差距。但是出现重复数的几率,rand 要比 mt_rand 高很多。

73、mysql 事务隔离是怎么实现的

通过各种行锁表锁,各种乐观锁悲观锁,排他锁实现的呀。

74、mysql 的锁怎么实现的

https://blog.csdn.net/alexdamiao/article/d...

https://www.cnblogs.com/luyucheng/p/629775...

https://blog.csdn.net/tangkund3218/article...

75、对称加密和非对称加密的方式

对称加密:我们俩共用一个秘钥,你加密,我解密。

非对称加密:我给你一个公钥,你加密完了,我还能有我的私钥把密文解开。但是你没有我的私钥。

扩展:椭圆加密算法。

76、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,会在 24 小时后死亡,问:最少用几只小白鼠可以在 24 小时后找到具体是哪一瓶水有毒。

四只

二进制问题。薛定谔的老鼠。

一只老鼠有两个状态,死活,对应 01。假设老鼠的个数为 A,则有 2^A>=10; A=4;

思路很简单,十瓶药编号:0,1,10,11....1001;

0 不喝。第一只老鼠喝所有个位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。

24 小时后,看下死了的是 1,活着的是 0。按老鼠的顺序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有问题。

77、redis 是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问 MYSQL 的同步方式和相关异常情况

redis 集群主从同步的简单原理

  Redis 的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。

  当 Slave 启动并连接到 Master 之后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个

Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。

  Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中。

  当第一次链接 或者是 故障后 重新连接 都会先判断 Slave 的存活状态 在做全部数据的同步 , 之后只会同步 Master 的写操作 (将命令发送给 Slave)

问题:

  当 Master 同步数据时 若数据量较大 而 Master 本身只会启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 而且 Slave 恢复的时间也会很慢!

  • redis 主从复制的优点:

    (1)在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供
    读服务从而提高了响应和读取速度。
    (2) 在一个 Redis 集群中,如果 master 宕机,slave 可以介入并取代 master 的位置,因此对于整个 Redis 服务来说不至于提供不了服务,这样使得整个 Redis 服务足够安全。
    (3) 水平增加 Slave 机器可以提高性能

78、怎么解决跨域

  • JSONP
  • 添加响应头,允许跨域
  • 代理的方式

79、json 和 xml 区别,各有什么优缺点

(1)可读性方面:基本相同,XML 的可读性比较好;

(2)可扩展性方面:都具有良好的扩展性;

(3)编码难度方面:相对而言,JSON 的编码比较容易;

(4)解码难度:JSON 的解码难度基本为零,XML 需要考虑子节点和父节点;

(5)数据体积方面:JSON 相对于 XML 来讲,数据体积小,传递的速度比较快;

(6)数据交互方面:JSON 与 javascript 的交互更加方便,更容易解析处理,更好的数据交互;

(7)数据描述方面:XML 对数据描述性比较好;

(8)传输速度方面:JSON 的速度远远快于 XML。

80、Trait 优先级
在 trait 继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法


更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940

进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

2020最新大厂内部 PHP 高级工程师面试题汇总(二)

上一篇:CSS-列表样式练习


下一篇:AspNetcore搭配Serilog利用docker发布CentOs7