当前位置:网站首页>PHP高级面试题 - 第二天
PHP高级面试题 - 第二天
2022-08-03 14:42:00 【PHP学习网】
一、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 P 点
/*
*单链表的结点类
*/
class LNode{
//为了简化访问单链表,结点中的数据项的访问权限都设为public
public int data;
public LNode next;
}
class LinkListUtli {
//当单链表中没有环时返回null,有环时返回环的入口结点
public static LNode searchEntranceNode(LNode L)
{
LNode slow=L;//p表示从头结点开始每次往后走一步的指针
LNode fast=L;//q表示从头结点开始每次往后走两步的指针
while(fast !=null && fast.next !=null)
{
if(slow==fast) break;//p与q相等,单链表有环
slow=slow.next;
fast=fast.next.next;
}
if(fast==null || fast.next==null) return null;
// 重新遍历,寻找环的入口点
slow=L;
while(slow!=fast)
{
slow=slow.next;
fast=fast.next;
}
return slow;
}
}
二、从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是连续的
这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用PHP来做,定义一个数组分别存着1到13, 拿出一个,置空一个,最后看下这五个置空的 是不是连续的。这种情况不考虑抽出的顺序。
三、说一下 PHP 的(内存)垃圾回收机制
每一个变量对应一个 zval 数据结构,在该结构内还有一个 val 结构体,该结构体内有一个引用计数(php7 而言,对于 php5,这个引用计数是保存在 zval 结构中的),标识该对象的引用数,当对象的引用计数为 0 时代表这个对象可被回收。
对象的 refcount 减少的时机:修改变量、函数返回(释放局部变量)、unset 变量
对于数组和对象而言,可能存在变量中的成员引用变量本身的情况,也就是循环引用,这样会造成这个变量永远不会被内存回收,而成为垃圾。
PHP 对于这种情况给出了垃圾回收机制:如果数组、对象的引用计数减少而且不为零,则认为他们可能是垃圾,把他们放到垃圾收集器里。等垃圾收集器到了一定的数量之后,进行垃圾处理:对所有可能的垃圾 refcount 减 1,如果为 1,说明是垃圾,则进行内存回收;如果不为 1,说明还有其他变量在使用,refcount 重新加 1;这种对象复用以及垃圾回收机制在其他语言中也有体现:redis 中也使用了引用计数表示每个对象的引用数量。
四、简述一下PHP短信验证码如何防刷?
1、时间限制:60 秒后才能再次发送
从发送验证码开始,前端(客户端)会进行一个 60 秒的倒数,在这一分钟之内,用户是无法提交多次发送信息的请求的。这种方法虽然使用得比较普遍,但是却不是非常有用,技术稍微好点的人完全可以绕过这个限制,直接发送短信验证码。
2、手机号限制:同一个手机号,24 小时之内不能够超过 5 条
对使用同一个手机号码进行注册或者其他发送短信验证码的操作的时候,系统可以对这个手机号码进行限制,例如,24 小时只能发送 5 条短信验证码,超出限制则进行报错(如:系统繁忙,请稍后再试)。然而,这也只能够避免人工手动刷短信而已,对于批量使用不同手机号码来刷短信的机器,这种方法也是无可奈何的。
3、短信验证码限制:30 分钟之内发送同一个验证码
网上还有一种方法说:30 分钟之内,所有的请求,所发送的短信验证码都是同一个验证码。第一次请求短信接口,然后缓存短信验证码结果,30 分钟之内再次请求,则直接返回缓存的内容。对于这种方式,不是很清楚短信接口商会不会对发送缓存信息收取费用,如果有兴趣可以了解了解。
4、前后端校验:提交 Token 参数校验
这种方式比较少人说到,个人觉得可以这种方法值得一试。前端(客户端)在请求发送短信的时候,同时向服务端提交一个 Token 参数,服务端对这个 Token 参数进行校验,校验通过之后,再向请求发送短信的接口向用户手机发送短信。
5、唯一性限制:微信产品,限制同一个微信 ID 用户的请求数量
如果是微信的产品的话,可以通过微信 ID 来进行识别,然后对同一个微信 ID 的用户限制,24 小时之内最多只能够发送一定量的短信。
6、产品流程限制:分步骤进行
例如注册的短信验证码使用场景,我们将注册的步骤分成 2 步,用户在输入手机号码并设置了密码之后,下一步才进入验证码的验证步骤。
7、图形验证码限制:图形验证通过后再请求接口
用户输入图形验证码并通过之后,再请求短信接口获取验证码。为了有更好的用户体验,也可以设计成:一开始不需要输入图形验证码,在操作达到一定量之后,才需要输入图形验证码。具体情况请根据具体场景来进行设计。
8、IP 及 Cookie 限制:限制相同的 IP/Cookie 信息最大数量
使用 Cookie 或者 IP,能够简单识别同一个用户,然后对相同的用户进行限制(如:24 小时内最多只能够发送 20 条短信)。然而,Cookie 能够清理、IP 能够模拟,而且 IP 还会出现局域网相同 IP 的情况,因此,在使用此方法的时候,应该根据具体情况来思考。
9、短信预警机制,做好出问题之后的防护
以上的方法并不一定能够完全杜绝短信被刷,因此,我们也应该做好短信的预警机制,即当短信的使用量达到一定量之后,向管理员发送预警信息,管理员可以立刻对短信的接口情况进行监控和防护。
五、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据
相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db [i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db [i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db [i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db [i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db [i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
边栏推荐
- 在北极都可以穿短袖了,温度飙升至32.5℃
- 使用域名注册服务 Domains配置域名【华为云至简致远】
- 0代码4步体验物联网设备上云
- 图形学-粒子系统 (Particle System)
- 【常见 error】Vivado 综合出现中断、失败、“PID not specified”
- 【报错】ImportError: libpng16-57e5e0a0.so.16.37.0: cannot open shared object file: No such file or direc
- 用1000行代码统计西安新房价格后,我有一个惊人的发现……
- LeetCode169:多数元素
- PAT乙级-B1011 A+B 和 C(15)
- ffplay视频播放原理分析
猜你喜欢
DeepLink在转转的实践
Day1:面试必考真题
Day2:面试必考题目
阿里大牛最新总结分享的高并发编程核心笔记(终极版),高并发系统架构场景一应俱全
图形学-粒子系统 (Particle System)
Controller层代码这么写,简洁又优雅!
162_Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv_2.0
162_Power Query is a custom function for quickly merging tables in a folder TableXlsxCsv_2.0
手摸手带你完成智慧路灯构建及避坑【华为云至简致远】
MMA安装及使用优化
随机推荐
R7 6800H+RTX3050+120Hz 2.8K OLED屏,无畏Pro15 2022开启预售
【问题】使用pip安装第三方库的时候遇到“timeout”的解决方法
大势,又一关乎中美竞争的关键行业,走到关键时刻了
PAT乙级-B1015 德才论(25)
0代码4步体验物联网设备上云
Chrome browser corresponding driver_chrome mobile browser
redis的使用方法
【重构map】【重构filter】【重构Some】【重构reduce方法】【重构flat函数】
PostgreSQL 每周新闻 2022-7-27
Jupyter Notebook 交互式编程 & 低代码拖拽式编程 | 数据科学生态下的理想平台
进程通信的方式
162_Power Query is a custom function for quickly merging tables in a folder TableXlsxCsv_2.0
varchar2 and varchar2(char)_datetime data types
基于.NET 6 的开源访客管理系统
地球自转加快
兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
Use Typora+EasyBlogImageForTypora to write a blog and upload pictures quickly without a picture bed
DeepLink在转转的实践
【常见 error】Vivado 综合出现中断、失败、“PID not specified”
树莓派 USB摄像头 实现网络监控( MJPG-Streamer)