当前位置: 首页 > 后端技术 > PHP

PHP中高级面试题——后天

时间:2023-03-29 18:27:33 PHP

《PHP学习网》公众号每天都会分享一些面试题,找工作的朋友可以看看。1、写一段代码判断单链表是否有环。如果有环,请找到环的入口,即点P/**单向链表的节点类*/classLNode{//为了简化访问链表在链表中,访问节点中数据项的权限均设置为publicpublicintdata;publicLNodenext;}classLinkListUtli{//单链表无环时返回null,有环时返回环的入口节点publicstaticLNodesearchEntranceNode(LNodeL){LNodeslow=L;//p表示从头节点LNode向后退一步的指针fast=L;//q表示从头节点向后退两步的指针while(fast!=null&&fast.next!=null){if(slow==fast)break;//p等于q,单链表有循环slow=slow.next;快速=快速.下一个.下一个;}if(fast==null||fast.next==null)返回null;//再次遍历,寻找环的入口点slow=L;while(slow!=fast){slow=slow.next;快=快。下一个;}返回缓慢;}}第二,从扑克牌中随机抽取5张牌判断是否顺子,也就是这道题有个关键点就是这5张牌是连续的,扑克牌,1-13不能再多了。这很容易。用PHP来做,定义一个数组分别存放1到13,取出一个,留一个空,最后检查五个空的是否连续。在这种情况下,不考虑提取顺序。3、说说PHP的(内存)垃圾回收机制。每个变量对应一个zval数据结构,在这个结构中还有一个val结构,里面有一个引用计数(对于php7,对于php5,这个引用计数保存在zval结构中),它标识了引用计数目的。当对象的引用计数为0时,表示该对象可以被回收。减少对象refcount的时机:修改变量、函数返回(释放局部变量)、unset变量对于数组和对象,可能会出现变量中的成员引用变量本身的情况,即循环引用,这会导致变量永远不会被内存回收,而是变成垃圾。PHP针对这种情况提供了垃圾回收机制:如果数组和对象的引用计数减少且不为零,则认为是垃圾,将其放入垃圾回收器。垃圾收集器达到一定数量后,进行垃圾处理:将所有可能的垃圾refcounts减1,如果为1则表示是垃圾,然后进行内存回收;如果不为1,说明还有其他变量在使用,refcount重新加1;这种对象重用和垃圾回收机制在其他语言中也有体现:redis也使用引用计数来表示每个对象的引用次数。4、简述如何防止PHP短信验证码被刷?1、限时:60秒后可再次发送。从发送验证码开始,前端(客户端)会进行60秒的倒计时。在这一分钟内,用户不能多次提交发送信息的请求。这种方法虽然常用,但用处不大。技术好的人完全可以绕过这个限制,直接发送短信验证码。2、手机号码限制:同一个手机号码24小时内不能超过5条消息。当使用同一个手机号进行注册或其他发送短信验证码的操作时,系统可以限制该手机号,例如24小时内只能发送5条短信验证码,否则会报错超出限制(例如:系统繁忙,请稍后再试)。但是,这只能避免手动刷短信。对于使用不同手机号批量刷短信的机器,这种方法也无能为力。3、短信验证码限制:30分钟内发送同一个验证码网上还有一种方法:30分钟内,所有请求和发送的短信验证码都是同一个验证码。第一次请求短信接口,然后缓存短信验证码的结果。30分钟内再次请求,直接返回缓存内容。对于这种方式,不太清楚短信接口商家是否会收取发送缓存信息的费用。如果你有兴趣,你可以了解一下。4.前后端验证:提交Token参数验证的方法比较少提及。个人觉得这个方法值得一试。前端(客户端)请求发送短信时,同时向服务器提交一个Token参数,服务器对Token参数进行校验。验证通过后,向请求发送短信的接口发送短信到用户手机。5.唯一限制:微信产品,限制同一个微信号用户的请求次数。如果是微信产品,可以通过微信ID来识别,然后限制同一个微信ID的使用人数,24小时之内。发送一定数量的短信。6.产品流程限制:分步,如使用短信验证码注册,我们将注册步骤分为2步。用户输入手机号并设置好密码后,接下来就是进入验证码的验证步骤。7、图形验证码限制:图形验证通过后,要求接口用户输入图形验证码,验证码通过后,再请求短信接口获取验证码。为了有更好的用户体验,还可以设计成一开始不需要输入图形验证码,只有操作到一定量后才需要输入图形验证码。请根据具体场景进行设计。8、IP和Cookie限制:限制相同IP/Cookie信息的最大数量使用Cookie或IP,可以轻松识别同一用户,进而限制同一用户(例如:24天内只能发送20条短信)小时)。但是可以清除cookies,可以模拟IP,IP也可以在局域网内有相同的IP。因此,在使用该方法时,应根据具体情况进行思考。9、短信预警机制,出现问题后的良好保护以上方法不一定能完全防止短信被刷。管理员发送预警信息,管理员可以立即监控和保护短信接口的状态。5、mySQL中有2000w条数据,redis中只存了20w条数据。如何保证redis中的数据都是热数据。).Redis提供了6种数据淘汰策略:volatile-lru:从设置了过期时间的数据集(server.db[i].expires)中选择最近最少使用的数据volatile-ttl:从设置了过期时间的数据集(server.db[i].expires)选择即将过期的数据。Eliminatevolatile-random:从数据集(server.db[i].expires)中随机选取有过期时间的数据。Eliminateallkeys-lru:从数据集中选择最近最少使用的数据(server.db[i].dict)Eliminateallkeys-random:从数据集中随机选择数据(server.db[i].dict)淘汰no-enviction(驱逐):不驱逐资料最后可以扫描下方二维码关注我公众号,我目前正在更新基础面试题,会更新中高级面试题,redis,后面还有liunx面试题