2021年最新PHP 面试、笔试题汇总(一)

一、秒杀(商品超卖,高并发,同一用户多次抢购)

后端:redis+队列

redis队列实现,三个队列(库存队列,排队队列,抢购结果队列)

用户先进入排队队列,先进先出,判断是否已经在抢购结果队列,如果在,则直接下一个,如果不在,将用户信息加入抢购结果队列,库存-1,等待数据库空闲时,将抢购结果写入数据库

前端:

面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】

扩容:加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。

静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

限流:一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。或者活动入口的时候增加游戏或者问题环节进行消峰操作。

有损服务:在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

二、订单模块(同一订单,多家商户结算问题)

订单拆分:用户支付后,将订单拆分,生成子订单

三、用户下单

先判断有没有登录

点击下单,生成唯一订单号,状态为未支付

四、接口安全

使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密,比如:我想通过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign),然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。

五、如何处理负载、高并发

1、HTML静态化

其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

2、图片服务器分离

把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛云

3、数据库集群和库表散列及缓存

数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

4、镜像:

尽量减少下载,可以把不同的请求分发到多个镜像端。

5、负载均衡:

Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。

六、修改会话的生存时间

  1. 在php.ini中 设置 session.gc_maxlifetime = 1440 //默认时间

  2. 代码实现;

$lifeTime = 24 * 3600; //保存一天
session_set_cookie_params($lifeTime);
session_start();

七、PHP的垃圾收集机制

PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间

八、正则的引擎

正则引擎主要可以分为两大类:一种是DFA,一种是NFA。

一般而论,DFA引擎则搜索更快一些。但是NFA以表达式为主导,更容易操纵,因此一般程序员更偏爱NFA引擎!
可以使用是否支持忽略优先量词和分组捕获来判断引擎类型:支持 NFA,不支持 DFA

九、对一个大文件进行逐行遍历,如下方法性能较高的是?

写一个实现了IteratorAggregate 接口的类,通过该类使用foreach遍历。

(使用 IteratorAggregate 可将文件打开后通过移动指针的方式逐行遍历,不受文件大小影响。使用 file_get_contents 处理大文件很容易导致PHP内存溢出;调用exec 会产生额外的进程,影响性能;其他人写的类库质量不一定高。)

十、读取文件加锁和解锁

$fp = fopen("lock.txt","w+");
    if (flock($fp,LOCK_EX)) {
   
        //获得写锁,写数据
        fwrite($fp, "write something");
        // 解除锁定
        flock($fp, LOCK_UN);
    } else {
   
        echo "file is locking...";
    }
    fclose($fp);

十一、array_merge() 数组合并函数

定义:array_merge() 函数把一个或多个数组合并为一个数组。(您可以向函数输入一个或者多个数组。)

注释:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。

如果两个数组都是索引数组,则不会覆盖

如果您仅向 array_merge() 函数输入一个数组,且键名是整数,则该函数将返回带有整

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值