PHP一次面试的面试题

本文最后更新于:2 年前

blah blah blah
# 面试题汇总

1、秒杀流程的清楚?

使用异步处理的思路来做的秒杀活动,我们先接受秒杀时间段内的所有订单请求,单我们没有实际进行秒杀成功还是失败的结果,而是放到了redis 队列里面,给了用户一个排队等待的结果的页面,当然用户也可以退出这个页面去待支付订单 页面里面去完成支付。然后我们从队列里面获取订单的请求,然后再交给生成订单的业务,进行生成订单,然后再把秒杀结果告诉用户,用户进行支付成功之后,扣减库存。

2、laravel 的依赖注入?

  由容器动态的将某个依赖关系注入到组件中,他的目的是为了提升组件使用的频率,来灵活使用它。说白了就是一个对象依赖于另一个对象的技术,他可以通过构造函数直接注入,也可通过接口的方式注入

3、Laravel 中的 app 类实现单利模式?

4、left join 效率低?

它把两个表中的你要查询的数据组成一张新的表,产生临时表,所有查询

起来比较慢。如果使用 join 语句的话,需要让小表做驱动表。但条件是能使用到驱动表中的索引。

5、订单回收问题。

如果没有使用缓存的话,就写一个定时任务,定期去回收未支付的订单。
如果有使用缓存的话,放到队列里面,加一个过期的时间。
    也可以使用消息队列中间件

6、埋点上报怎么处理?

如果前端埋点的事件较多,或者说网页内部交互频繁,可以通过本地存储的方式先缓存上报信息,然后定期上报。然后后台再进行处理,
如果前端实时上报到后端的话,那就通过消费队列的方式定期去处理上报数据。

7、说一下缓存穿透和缓存雪崩?

如果缓存失效了或者查出来的值是空的,不是立即去数据库进行查询,而是使用缓存本身成功操作的返回值进行返回,并利用redis的互斥锁(mutex key)的方式重新把数据缓存起来。
雪崩的话,就像解决穿透一样加互斥锁,建立备份的缓存,有一份缓存不设置缓存失效时间,如果A没读到缓存就去读取B,并更新A和B的缓存。

8、在工作中使用 Git 的基本流程?

提交 git add 、写更新内容 git commit -m 、查不同 git diff 、建立分支 git branch 、切换分支 git checkout、分支合并:git merge、显示本地仓库的所有分支:git branch、

9、简单说下非对称加密?

非对称加密是有公钥和私钥,他们是成对使用的,公钥是可以给外人看的,私钥要自己保护好。用公钥进行加密而用私钥进行解密。同一队公钥和私钥。

10、你们是怎么把 mysql 的数据同步到 es 上去的?

最方便的方式可以同时更新,写入数据库的时候,同时写一个队列模块,通过队列的方式同步更新到 es
我们就简单的使用 mysql 的binlog (ROW模式)日志进行同步的。
或者使用mysqldump工具进行同步。或者使用第三方的工具

11、简单说下你怎么实现 mysql 主从

因为mysql binlog的强大,我们把从库和主库维持一个长链接,从你设置的一些访问主库的Ip啊端口啊,用户名密码啊binlog读取的位置啊和主库进行交互,主库验证成功了之后,会从自己本地读取binlog 然后发送给从库。
当然你也可以使用第三方的工具比如 mycat 去实现。

12、说下你理解的 php-fpm。

php-FPM 是一个PHP进程管理器 ,包含master 和worker 两种进程,
首先它会启动一个 master 进程有且有一个,只负责监听端口,接收来自服务器的请求,然后会有多个 worker 进程具体多少根据你的配置,当请求过来的时候,master 会传递给一个 worker,然后立即接受下一个请求,当worker不够用的时候会直接返回502的错误。worker 请求超时的话会返回504,
当然 php-fpm 也可以配置为动态模式,这样子的话,worker 的进程数量就是按照需求去启动的了。

13、进程线程协程

进程是通过CPU运行的,一个进程挂了不影响另一个,
线程属于进程,但是一个线程挂了不但影响其他的线程,还会把整个进程搞挂。
协程是属于线程的。协程实在线程里面跑的,它没有上下文的切换,它之间的调度切换是通过程序员代码实现的,所以它特别灵活,因此也叫用户态的线程。

14、php 关联数组底层结构

在PHP中, 数组是用一种HASH结构(HashTable)来实现的。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!