PHP面试试题及详细答案(实战完整版)_第1页
PHP面试试题及详细答案(实战完整版)_第2页
PHP面试试题及详细答案(实战完整版)_第3页
PHP面试试题及详细答案(实战完整版)_第4页
PHP面试试题及详细答案(实战完整版)_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP面试试题及详细答案(实战完整版)一、PHP基础语法篇(10题)1、简述PHP中echo、print、print_r、var_dump的区别答案:echo:语言结构,无返回值,支持输出多个字符串,执行效率最高,只能输出字符串、数字等基础类型,日常页面输出最常用。print:语言结构,有返回值(固定返回1),一次只能输出一个值,效率比echo低,使用场景极少。print_r:专门用于打印复合类型(数组、对象),只会输出值,不显示类型,输出字符串、数字时会简化展示,适合快速查看数组数据。var_dump:调试专用,会同时输出变量的类型、值、长度,支持所有变量类型,数组、对象会完整递归展示,开发调试首选。2、PHP中null、空字符串、0、false、空数组的区别,以及empty和isset的差异答案:等值判断下:0、''、null、false、[]都会被判定为假,但本质完全不同:null:变量未定义、赋值为null,无任何数据空字符串'':字符串类型,有变量、有类型,值为空0:整型数字0,数值类型false:布尔假值空数组[]:数组类型,无元素的空集合empty():判断变量是否为空,0、''、null、false、[]、'0'都会返回true;变量未定义也不会报错。isset():仅判断变量是否存在且不为null,0、''、false、空数组都会返回true,只有未定义、值为null时返回false。3、PHP传值和传引用的区别,什么场景用引用传递答案:传值(默认):函数内部会拷贝一份变量副本,内部修改不会影响外部原变量,占用内存更高。传引用(&):函数内部和外部共用同一个变量内存地址,内部修改直接改变原变量,无内存拷贝,效率更高。使用场景:处理超大数组、大数据量变量,避免内存拷贝;需要函数无需return直接修改外部变量时(如数组排序、批量修改数据)。4、PHP常量和变量的区别,define和const的差异答案:常量一经定义无法修改、销毁,变量可随时赋值修改。definevsconstdefine是函数,const是语言结构,const效率更高const支持类常量,可修饰类属性;define只能定义全局常量const必须写在顶层或类中,不能条件判断内使用;define可在if、循环内动态定义PHP7.3之前define不支持数组,const全程支持数组常量5、session和cookie的区别及使用场景答案:存储位置:cookie存客户端浏览器,session存服务端服务器安全性:cookie可被篡改、窃取,安全性低;session数据在服务端,安全性更高大小限制:cookie单个约4KB,数量有限;session无大小限制生命周期:cookie可设置永久/过期时间,浏览器关闭可保留;默认session浏览器关闭即失效依赖关系:session默认依赖cookie存储session_id场景:cookie用于记住登录状态、用户偏好设置;session用于保存用户登录信息、临时会话数据、敏感数据。6、PHP超全局变量有哪些答案:共9个,全局任意位置可直接使用:$_GET:接收URL地址栏参数$_POST:接收POST表单提交数据$_REQUEST:包含GET/POST/COOKIE数据(不推荐使用,安全性差)$_SERVER:服务器及请求头信息$_COOKIE:客户端cookie数据$_SESSION:服务端会话数据$_FILES:文件上传信息$_ENV:服务器环境变量$GLOBALS:全局所有变量集合7、PHP如何防止SQL注入,有几种方式答案:工作中主流防护方式:PDO/MYSQLI预处理语句(参数绑定):最优方案,彻底杜绝拼接SQL,参数和语句分离关闭魔术引号:避免自动转义导致数据冗余数据过滤与验证:对用户输入做正则、类型、长度校验,过滤特殊字符禁止直接拼接SQL:杜绝变量直接写入SQL语句数据库权限最小化:业务账号仅赋予查询、写入权限,禁止删改、库操作权限8、PHP中include、require、include_once、require_once的区别答案:include:引入文件,文件不存在抛出警告,脚本继续执行,可重复引入require:引入文件,文件不存在抛出致命错误,脚本终止,可重复引入include_once:只引入一次,重复引入自动忽略,报错级别同includerequire_once:只引入一次,重复引入自动忽略,报错级别同require,项目核心文件、配置文件首选日常开发:配置、核心文件用require_once,模板、视图文件用include。9、PHP面向对象三大特性及实际应用答案:封装:将属性、方法私有化,通过public方法对外提供访问,隐藏内部逻辑,保证数据安全。例:模型类私有字段,通过get/set方法操作数据。继承:子类继承父类属性和方法,代码复用,减少冗余。例:基础控制器封装公共登录验证、返回方法,所有业务控制器继承。多态:子类重写父类方法,同一方法不同子类实现不同逻辑。例:支付接口,微信支付、支付宝支付子类重写统一支付方法。10、PHP静态变量、静态方法的特点答案:静态属性/方法属于类,不属于对象,无需实例化可直接调用静态变量生命周期跟随脚本,函数执行结束不会重置,值会保留静态方法中不能使用$this,只能使用self/static静态资源全局共享,过度使用会占用内存,不易回收二、MySQL数据库篇(8题)1、MySQL索引的分类、作用及失效场景答案:索引分类:主键索引、唯一索引、普通索引、联合索引、全文索引作用:大幅提升查询速度,降低数据库IO;缺点是增加写入、更新、删除开销,占用磁盘空间。索引失效常见场景:where条件中使用函数、运算、正则(如left、substr、字段+1)!=、<>、notin、notexists大部分情况失效like%xxx左模糊查询,索引失效;xxx%右模糊可走索引字符类型字段传入数字,隐式类型转换导致失效or前后字段未全部建立索引联合索引不遵循最左匹配原则2、联合索引最左匹配原则详解答案:建立联合索引(a,b,c)时,查询条件必须从最左侧字段开始匹配,跳过左侧字段、中断匹配都会导致后续索引失效。有效场景:wherea=1、wherea=1andb=2、wherea=1andb=2andc=3失效场景:whereb=2、wherec=3、wherea=1andc=3(仅a走索引,c失效)优化建议:高频查询字段放左侧,区分度高的字段优先靠前。3、InnoDB和MyISAM引擎的区别答案:项目主流使用InnoDB,MyISAM基本淘汰事务支持:InnoDB支持事务、ACID;MyISAM不支持锁机制:InnoDB行级锁+表级锁;MyISAM只有表级锁,并发差外键:InnoDB支持外键;MyISAM不支持崩溃恢复:InnoDB有redo/undo日志,断电可恢复;MyISAM易数据损坏查询性能:MyISAM简单查询略快,InnoDB并发读写远超MyISAM4、MySQL事务四大特性及隔离级别答案:四大ACID特性原子性:事务要么全部执行成功,要么全部回滚一致性:事务前后数据状态合法,约束不被破坏隔离性:多个事务之间相互隔离,互不干扰持久性:事务提交后,数据永久保存,断电不丢失四大隔离级别(从低到高)读未提交:可读取未提交数据,存在脏读、不可重复读、幻读读已提交(默认):解决脏读,存在不可重复读、幻读可重复读:解决脏读、不可重复读,存在幻读(InnoDB默认级别)串行化:最高级别,全部问题都解决,读写串行,并发极低5、脏读、不可重复读、幻读的区别答案:脏读:一个事务读取到另一个事务未提交的修改数据,对方回滚后,读取的数据无效不可重复读:同一事务内,两次查询同一数据,结果不一致(被其他事务更新修改)幻读:同一事务内,两次范围查询,数据条数不一致(被其他事务新增/删除数据)6、MySQL慢查询如何优化,完整优化思路答案:开启慢查询日志,定位慢SQL,通过explain分析执行计划检查是否缺索引、索引失效,优化联合索引顺序避免select*,只查询需要的字段,减少数据传输避免大分页、深分页,用where条件分页替代limitoffset优化join、子查询,避免笛卡尔积,关联字段建立索引超大表分表分库、读写分离,减轻单表压力高频查询数据缓存到Redis,减少数据库查询次数7、limit100000,10为什么慢,如何优化答案:原理:数据库需要先遍历前100010条数据,丢弃前100000条,只返回后10条,偏移量越大,遍历数据越多,耗时越长。优化方案:利用主键索引覆盖查询:select*fromtablewhereid>100000limit10业务层面禁止超大分页,采用下拉刷新、条件筛选替代延迟关联:先查主键,再关联查询详情数据8、数据库读写分离原理及PHP实现方式答案:原理:主库负责增、删、改,从库负责查询,主库数据同步到从库,分担数据库压力,提升并发能力。PHP实现:项目配置多数据库连接,封装数据库类,判断SQL语句类型,写操作连主库,读操作连从库;框架(Laravel/ThinkPHP)自带读写分离配置,直接配置主从地址即可。三、Redis缓存篇(5题)1、Redis常用数据类型及业务场景答案:String字符串:缓存用户信息、配置、计数器、验证码、登录tokenList列表:消息队列、点赞列表、动态列表、有序队列Hash哈希:存储结构化数据,如用户详情、商品信息、订单数据(比string更省内存)Set集合:去重场景、好友列表、点赞用户、交集差集计算ZSet有序集合:排行榜、积分排名、延时队列、有序去重数据2、Redis缓存穿透、击穿、雪崩区别及解决方案答案:缓存穿透问题:查询不存在的数据,缓存、数据库都无数据,请求直接打穿数据库解决:空值缓存、布隆过滤器、接口参数校验、限流拦截缓存击穿问题:热点key过期瞬间,大量并发请求同时访问数据库解决:互斥锁、热点key永不过期、定时主动更新缓存缓存雪崩问题:大量key同时过期/Redis宕机,所有请求全部访问数据库,导致数据库崩溃解决:过期时间加随机值、Redis集群高可用、服务熔断降级、多级缓存3、Redis过期删除策略和内存淘汰策略答案:过期删除策略(删除过期key)惰性删除:访问key时才判断是否过期,节省CPU,浪费内存定期删除:定时随机抽查过期key,主动删除,平衡性能与内存内存淘汰策略(内存满了删哪些key):常用volatile-lru(过期key优先淘汰最近最少使用)、allkeys-lru(所有key淘汰最少使用)4、Redis持久化RDB和AOF区别答案:RDB:快照持久化,定时保存全量数据,文件小、恢复快,会丢失最后一次快照后的数据,适合冷备份AOF:日志持久化,记录每一条写命令,数据基本不丢失,文件大、恢复慢,适合保证数据安全生产环境主流:RDB+AOF混合持久化,兼顾性能和数据安全。5、Redis为什么速度比数据库快答案:Redis是内存数据库,所有操作基于内存,无磁盘IO开销;MySQL主要操作磁盘Redis单线程模型,无线程切换、锁竞争开销数据结构简单,底层优化极致多路IO复用,支持高并发连接四、框架与实战场景篇(6题)1、ThinkPHP和Laravel框架的优缺点对比答案:ThinkPHP优点:上手简单、文档中文友好、开发速度快、适合中小型项目、入门门槛低缺点:规范相对松散,大型项目架构可控性差,生态不如Laravel完善Laravel优点:架构规范严谨、生态丰富、中间件、事件、队列、权限功能完善,适合大型项目、企业级开发缺点:框架较重、入门稍难、运行速度略慢于TP2、PHP如何实现接口限流,防止高频请求刷接口答案:主流Redis限流方案:以用户ID/IP为key,Redisstring记录请求次数设置过期时间(如1分钟),每次请求次数+1判断次数超过阈值,直接返回请求频繁,拦截请求高级方案:滑动窗口限流、令牌桶限流,解决临界时间点突发流量问题;框架可结合中间件全局拦截限流。3、PHP文件上传完整流程及安全防护答案:上传流程:前端form表单提交文件-后端获取$_FILES-校验文件-移动临时文件到正式目录-返回文件地址安全防护:校验文件后缀、MIME类型,禁止php、exe、脚本文件上传重命名文件,杜绝脚本覆盖、路径遍历漏洞上传目录禁止执行脚本权限限制文件大小,防止超大文件攻击图片文件二次验证,防止伪装图片木马4、PHP如何解决高并发秒杀场景答案:秒杀核心:防超卖、抗高并发页面静态化:秒杀页面静态化,减少服务器请求压力Redis预减库存:库存提前写入Redis,请求先操作Redis,拦截无库存请求限流拦截:IP、用户限流,防止恶意刷秒杀队列削峰:合格请求进入消息队列,异步处理订单,避免瞬间压垮数据库数据库最终落地:队列消费完成后,更新数据库库存、生成订单分布式锁:防止多服务并发超卖5、TP5/6中路由、中间件、钩子的作用答案:路由:统一请求地址、隐藏控制器方法、美化URL、权限匹配、请求绑定中间件:请求前后拦截处理,如登录验证、接口限流、跨域设置、参数过滤,全局/单独路由生效钩子:系统预留事件点位,在框架执行生命周期触发,实现代码解耦,如下单后发送通知、日志记录6、PHP异步任务实现方式答案:基础方案:file_put_contents日志、fsockopen异步请求(简单轻量,适合小任务)进阶方案:Redis+消息队列、RabbitMQ,实现可靠异步、延时任务框架方案:Laravel队列、ThinkPHP任

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论