PHP 高级面试115题汇总(含答案)
1、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,0]) 能组成一个矩形。 2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 P 点 1 /* 2 *单链表的结点类 3 */ 4 class LNode{ 5 //为了简化访问单链表,结点中的数据项的访问权限都设为public 6 public int data; 7 public LNode next; 8 } 9 10 class LinkListUtli { 11 //当单链表中没有环时返回null,有环时返回环的入口结点 12 public static LNode searchEntranceNode(LNode L) 13 { 14 LNode slow=L;//p表示从头结点开始每次往后走一步的指针 15 LNode fast=L;//q表示从头结点开始每次往后走两步的指针 16 while(fast !=null && fast.next !=null) 17 { 18 if(slow==fast) break;//p与q相等,单链表有环 19 slow=slow.next; 20 fast=fast.next.next; 21 } 22 if(fast==null || fast.next==null) return null; 23 24 // 重新遍历,寻找环的入口点 25 slow=L; 26 while(slow!=fast) 27 { 28 slow=slow.next; 29 fast=fast.next; 30 } 31 32 return slow; 33 } 34 } 35 3、写一个函数,获取一篇文章内容中的全部图片,并下载 36 37 function download_images($article_url = '',$image_path = 'tmp'){ 38 39 // 获取文章类容 40 $content = file_get_contents($article_url); 41 42 // 利用正则表达式得到图片链接 43 $reg_tag = '/<img.*?"([^"]*(jpg|bmp|jpeg|gif|png)).*?>/'; 44 $ret = preg_match_all($reg_tag,$content,$match_result); 45 $pic_url_array = array_unique($match_result1[1]); 46 47 // 创建路径 48 $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path; 49 mkdir(iconv("UTF-8","GBK",$dir),0777,true); 50 51 foreach($pic_url_array as $pic_url){ 52 // 获取文件信息 53 $ch = curl_init($pic_url); 54 curl_setopt($ch,CURLOPT_HEADER,0); 55 curl_setopt($ch,CURLOPT_NOBODY,0); 56 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE ); 57 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE ); 58 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 59 $fileInfo = curl_exec($ch); 60 $httpinfo = curl_getinfo($ch); 61 curl_close($ch); 62 63 // 获取图片文件后缀 64 $ext = strrchr($pic_url,'.'); 65 $filename = $dir . '/' . uniqid() . $ext; 66 67 // 保存图片信息到文件 68 $local_file = fopen($filename,'w'); 69 if(false !== $local_file){ 70 if( false !== fwrite($local_file,$filecontent) ){ 71 fclose($local_file); 72 } 73 } 74 } 75 76 } ? 4、获取当前客户端的 IP 地址,并判断是否在 (111.111.111.111,222.222.222.222) 如果没有使用代理服务器: $ip = $_SERVER['REMOTE_ADDR']; 使用透明代理 $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; ? 5、nginx 的 log_format 配置如下: 1 log_format main ‘remoteaddr?remote_user [timelocal]"request”’ 2 ‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"'; ? 从今天的 nginx log 文件 access.log 中:
a、列出 “request_time” 最大的 20 行? 6、什么是 CSRF 攻击?XSS 攻击?如何防范? XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP 7、应用中我们经常会遇到在 user 表随机调取 10 条数据来展示的情况,简述你如何实现该功能。 SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1; ? 8、从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是连续的 9、两条相交的单向链表,如何求它们的第一个公共节点 如果两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点肯定相同; 10、最长公共子序列问题 LCS,如有 [1,2,5,11,32,15,77] 和 [99,1,77] 两个数组,找到它们共同都拥有的数,写出时间复杂度最优的代码,不能用 array_intersect(这里有坑,需要去研究一下动态规划)。 11、linux 的内存分配和多线程原理 12、MYSQL 中主键与唯一索引的区别 13、http 与 https 的主要区别 14、http 状态码及其含意
15、linux 中怎么查看系统资源占用情况
16、SQL 注入的原理是什么?如何防止 SQL 注入 防范:第一,绝对不要相信用户输入的任何东西。第二,预编译。现在的框架一般都会有 SQL 过滤的。 17、isset (null) isset (false) empty (null) empty (false) 输出 分别是 false,true,true 18、优化 MYSQL 的方法 第二,务必有自增主键。通过自增主键来查数据是最快的。 第三,常用的查询字段建立联合索引,写 SQL 一定要尊从最左原则,用到这个索引。 第四,不要把逻辑运算放到 sql 里。言外之意是,不要写太复杂的 SQL,你能写复杂的 SQL 你肯定也能通过 PHP 实现。 19、数据库中的事务是什么? 事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。 20、写一个函数,尽可能高效的从一个标准 URL 中取出文件的扩展名 21、参数为多个日期时间的数组,返回离当前时间最近的那个时间 22、echo、print、print_r 的区别 23、http 协议的 header 中有哪些 key 及含义 24、二叉树前中后遍历代码
25、PHP 的数组和 C 语言的数组结构上有何区别? C 语言的数组,就是定长定类型的数列。 26、Redis 的跳跃表怎么实现的 27、哈希是什么?hash 冲突后,数据怎么存? 28、聚簇索引,聚集索引的区别? 29、B+Tree 是怎么进行搜索的 30、数组和 hash 的区别是什么? 31、写个函数,判断下面扩号是否闭合,左右对称即为闭合:((())),)(()),(()))),(((((()),(()()),()() 32、 找出数组中不重复的值 [1,3,5] 33、32 题你的时间复杂度是多少?有的情况下,你写了个算法,然后面试官会让你把你的算法的时间复杂度表达式写出来 34、PHP 的的这种弱类型变量是怎么实现的? 35、在 HTTP 通讯过程中,是客户端还是服务端主动断开连接? 这个问题最好能一步到位回答的全面的。一般都是有客户端告诉服务端,我这边东西发完了,可以断连接了么。但是如果客户端发完 FIN 服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也一样,超过时间,服务端就断了。 36、PHP 中发起 http 请求有哪几种方式?它们有何区别?
37、有一颗二叉树,写代码找出来从根节点到 flag 节点的最短路径并打印出来,flag 节点有多个。比如下图这个树中的 6 和 14 是 flag 节点,请写代码打印 8、3、6 和 8、10、14 两个路径 典型的二叉搜索树。大学数据结构的基础题。 38、有两个文件文件,大小都超过了 1G,一行一条数据,每行数据不超过 500 字节,两文件中有一部分内容是完全相同的,请写代码找到相同的行,并写到新文件中。PHP 最大允许内内为 255M。 39、请写出自少两个支持回调处理的 PHP 函数,并自己实现一个支持回调的 PHP 函数
40、请写出自少两个获取指定文件夹下所有文件的方法(代码或思路)。 41、请写出自少三种截取文件名后缀的方法或函数(PHP 原生函数和自己实现函数均可)
42、PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。对于分布式系统,如何来保存 session 值。 只要按照 domain path 过期时间等规则 用 header 函数就可以实现。 分布式系统 session,集中处理。按我们公司的架构,为了实现高可用和高容灾,提供一个分布式的验签服务。具体的可以看下 redis 的分布式服务架构。 43、请用 SHELL 统计 5 分钟内,nginx 日志里访问最多的 URL 地址,对应的 IP 是哪些? 44、写一段 shell 脚本实现备份 mysql 指定库(如 test) 到指定文件夹并打包,并删除 30 天前的备份,然后将新的备份推送到远端服务器,完成后送邮件通知。 45、mysql 数据库中 innodb 和 myisam 引擎的区别 46、从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。 以 PHP 为例:通常最简单的回答,从用户的电脑找到最近的 DNS 服务,然后解析到对应的 IP 然后双方开始 HTTP 连接,然后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要经过 nginx 转发到 frstCGI (PHP-FPM),然后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就重新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。 47、如何分析一条 sql 语句的性能。 48、ping 一个服务器 ping 不通,用哪个命令跟踪路由包?
49、
50.
51、数据库中的存放了用户 ID,扣费很多行,redis 中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到 redis 中,每 5 分钟执行一次。请问要考虑哪些问题? 52、MYSQL 主从服务器,如果主服务器是 innodb 引擎,从服务器是 myisam 引擎,在实际应用中,会遇到什么问题? 53、linux 中进程信号有哪些? 54、redis 的底层实现 这篇文章 要多读几遍。 55、异步模型 狗东某风控研发必考题。 56、10g 文件,用 php 查看它的行数 有更好的方法请留言。 57、有 10 亿条订单数据,属于 1000 个司机的,请取出订单量前 20 的司机 我们从设计上解决这个问题。只有一千个司机。我们可以做个简单哈希,分库分表,% 求余数。保证这一千个司机分在一千个表里,每个人有每个人的单独表。引擎用 MYSAIM,求表中数据的总数,效率飞快,遍历一千张表,求最大前二十即可。 58、设计一个微信红包的功能 59、根据 access.log 文件统计最近 5 秒的 qps,并以如下格式显示,01 1000(难点在 01 序号)
60、php7 性能为什么提升这么高 鸟哥的文章要多读,多读。 61、遍历一个多维数组 62、有这样一个字符串 abcdefgkbcdefab…… 随机长度,写一个函数来求 bcde 在这个字符串中出现的次数 63、有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 个字节,内存限制大小是 1M。返回频数最高的 100 个词 我可能只会用 HASH 映射做。其他的,不会。 参考:第 64 题。 64、十道海量数据处理面试题与十个方法大总结
65、php 进程模型,php 怎么支持多个并发 参考:https://www.jianshu.com/p/542935a3bfa8 66、nginx 的进程模型,怎么支持多个并发 参考:https://www.zhihu.com/question/22062795 67、php-fpm 各配置含义,fpm 的 daemonize 模式
68、让你实现一个简单的架构,并保持高可用,两个接口,一个上传一条文本,一个获取上传的内容,你怎么来设计?要避免单机房故障,同时要让代码层面无感。 69、两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的 如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。 以上全是应急操作。实际上数据库的容灾设计要复杂的多。 面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,你们每秒多少写入操作。按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。这个级别的数据同步,出现差异的概率 可以忽略不计的。有一台出现问题,另一台也可以抗住。 (正常的操作,还是先停写,等数据一致,切换,开写。我们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个。前后耽搁不到 20 秒)。 70、http 协议具体的定义 参考:日本人写的《图解 HTTP》 71、什么是锁,怎么解决锁的问题 72、rand 与 mt_rand 的区别 说是 mt_rand 比 rand 快 4 倍。 在随机数区间不大的情况下并没有很大的效率差距。但是出现重复数的几率,rand 要比 mt_rand 高很多。 73、mysql 事务隔离是怎么实现的 74、mysql 的锁怎么实现的 75、对称加密和非对称加密的方式 非对称加密:我给你一个公钥,你加密完了,我还能有我的私钥把密文解开。但是你没有我的私钥。 扩展:椭圆加密算法。 76、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,会在 24 小时后死亡,问:最少用几只小白鼠可以在 24 小时后找到具体是哪一瓶水有毒。 二进制问题。薛定谔的老鼠。 一只老鼠有两个状态,死活,对应 01。假设老鼠的个数为 A,则有 2^A>=10; A=4; 思路很简单,十瓶药编号:0,10,11….1001; 0 不喝。第一只老鼠喝所有个位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。 24 小时后,看下死了的是 1,活着的是 0。按老鼠的顺序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有问题。 77、redis 是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问 MYSQL 的同步方式和相关异常情况 Redis 的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。 当 Slave 启动并连接到 Master 之后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个 Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。 Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中。 当第一次链接 或者是 故障后 重新连接 都会先判断 Slave 的存活状态 在做全部数据的同步 , 之后只会同步 Master 的写操作 (将命令发送给 Slave) 问题: 当 Master 同步数据时 若数据量较大 而 Master 本身只会启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 而且 Slave 恢复的时间也会很慢! redis 主从复制的优点: (1)在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供 (2) 在一个 Redis 集群中,如果 master 宕机,slave 可以介入并取代 master 的位置,因此对于整个 Redis 服务来说不至于提供不了服务,这样使得整个 Redis 服务足够安全。 (3) 水平增加 Slave 机器可以提高性能 78、怎么解决跨域 79、json 和 xml 区别,各有什么优缺点 (2)可扩展性方面:都具有良好的扩展性; (3)编码难度方面:相对而言,JSON 的编码比较容易; (4)解码难度:JSON 的解码难度基本为零,XML 需要考虑子节点和父节点; (5)数据体积方面:JSON 相对于 XML 来讲,数据体积小,传递的速度比较快; (6)数据交互方面:JSON 与 javascript 的交互更加方便,更容易解析处理,更好的数据交互; (7)数据描述方面:XML 对数据描述性比较好; (8)传输速度方面:JSON 的速度远远快于 XML。 80、Trait 优先级 81、a 引用 b,报错 c 里面类重复定义,循环引用会出现什么问题 82、下面员工 3 的薪水大于其主管的薪水,一条 SQL 找到薪水比下属低的主管
82、在一个坐标系内有一个 N 个点组成的多边形,现在有一个坐标点,写代码或思路来判断这个点是否处于多边形内 83、数据库如果出现了死锁,你怎么排查,怎么判断出现了死锁? 84、写一个一个程序来查找最长子串 85、分析一个问题:php-fpm 的日志正常,但客户端却超时了,你认为可能是哪里出了问题,怎么排查? 86、nginx 的工作流程是什么样的,可以画图描述 87、进程间通信方式有哪些 2) 信号量 3) 信号 4) 消息队列 5) 共享内存 6) 套接字:可用于不同及其间的进程通信 88、主从复制,从服务器会读取到主服务器正在回滚的数据吗?主数据库写成功,从服务器因为一些原因写失败,最后会出现什么情况?主从复制如果键冲突怎么办? 89、事务有几种隔离级别?事务的隔离级别是怎么实现的?
90、什么是 B + 树,请画 b + 树的结构 91、mysql 中的字符集,客户端与数据库不一致,怎么办?MYSQL 中字符串到显示到界面,字符转换的过程是怎样的?数据库中的字符集是 latin1,你现在将 utf8 的字符串存到 latin1 字符集的数据库表,你能将 utf8 的字符串存进去吗?假如你说能存,追问:能否恢复?假如能,那怎么恢复? 92、
93、
94、设计一个缓存系统,可以定期或空间占满之后自动删除长期不用的数据,不能使用用遍历。 95、
96、一个排序好的数组,将它从中间任意一个位置切分成两个数组,然后交换它们的位置并合并,合并后新数组元素如:20,21,22,25,30,6,7,8,18,19,写一个查询函数来查找某个值是否存在。 97、设计一个树形结构,再写一个函数对它进行层序遍历 98、
99、self 和 static 的区别 self: 是类内指针,不管子类有没有重写过父类中的方法、属性都指向本类的静态方法、属性 101、描述 autoload 的机制 102、mysql 中字段类型各占几个字节:smallint、int、bigint、datetime、varchar (8)
103、哪些属性唯一确定一条 TCP 连接 104、myisam 和 innodb 的区别,为什么 myisam 比 innodb 快,myisam 和 innodb 的索引数据结构是什么样的?innodb 主键索引和非主键索引的区别?其索引上存放的数据是什么样的? 105、断开 TCP 连接时,timewait 状态会出现在发起分手的一端还是被分手的一端 为什么断开 TCP 连接需要进行四次握手 ? TIME_WAIT 状态的意义 在 TCP 连接中,当被动关闭连接的一方 (图中 client) 发送的 FIN 报文到达时,被动关闭连接的一方会发送 ACK 确认报文,并且进入 TIME_WAIT 状态,并且等待 2MSL 时间段 (MSL:maximum segment life)。这么做有下述两个原因: 被动关闭连接的一方 (图中的 server) 在一段时间内没有收到对方的 ACK 确认数据包,会重新发送 FIN 数据包,因而主动关闭连接的一方需要停留在等待状态以处理对方重新发送的 FIN 数据包。否则他会回应一个 RST 数据包给被动关闭连接的一方,使得对方莫名其妙。 在 TIME_WAIT 状态下,不允许应用程序在当前 ip 和端口上和之前通信的 client (这个 client 的 ip 和端口号不变) 建立一个新的连接。这样就能避免新的连接收到之前的 ip 和端口一致的连接残存在网络中的数据包。这也是 TIME_WAIT 状态的等待时间被设置为 2MSL 的原因,以确保网络上当前连接两个方向上尚未接收的 TCP 报文已经全部消失。 106、AWK 各种数据分析考得非常多,要多练习,题目不再一一写了 107、redis 中集合、有序集合、hyperLog、hash 的数据结构是啥样的 108、描述一下:一个请求到达 nginx 的全部处理过程(nginx 自身会调用哪些逻辑)、然后怎么与 php 通信,中间的流程是什么样的等等? 109、nginx 和 php-fpm 的相关配置,随便问里面各种参数啥意思 110、假如有一张地图,如下图,"-" 代表海洋、"+" 代表陆地,用你最擅长的方式,取出陆地的坐标。
111、Jsonp 的实现原理,你还知道哪些跨域方式? 112、如果某个博客通过判断 referer 方式来进行图片防盗链,如何破解? 113、简述 mysql 查询优化的本质,并举 2 个例子 115、单例模式的优点是什么?抽象类是什么?还了解哪些设计模式? 它们必须拥有一个构造函数,并且必须被标记为 private (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |