2020最新大厂内部 PHP 高级工程师面试题汇总(一)
1、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,0]) 能组成一个矩形。 我们分析这道题, 给4个标点,判断是否矩形 高中知识,矩形有4条边,两两相等, 矩形两条对角线相等, 矩形的长短边与对角线满足勾股定理。 故解题思路为,根据坐标点, 列出所有的两点组合边长的数组,去重,看是不是只剩 3个长度(注意正方形2个长度) 判断是否满足勾股定理 调优一下,先判断有没有重复的点,有的话肯定不是矩形 代码如下:
2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 P 点
3、写一个函数,获取一篇文章内容中的全部图片,并下载
4、获取当前客户端的 IP 地址,并判断是否在(111.111.111.111,222.222.222.222) 如果没有使用代理服务器:
使用透明代理
5、nginx 的 log_format 配置如下:
从今天的 nginx log 文件 access.log 中:
6、什么是 CSRF 攻击?XSS 攻击?如何防范? CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。 XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP 7、应用中我们经常会遇到在 user 表随机调取 10 条数据来展示的情况,简述你如何实现该功能。
8、从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是连续的 这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用 PHP 来做,定义一个数组分别存着 1 到 13,拿出一个,置空一个,最后看下 这五个置空的 是不是连续的。这种情况不考虑抽出的顺序。 9、两条相交的单向链表,如何求它们的第一个公共节点 思想:
10、最长公共子序列问题 LCS,如有 [1,2,5,11,32,15,77] 和 [99,1,77] 两个数组,找到它们共同都拥有的数,写出时间复杂度最优的代码,不能用 array_intersect(这里有坑,需要去研究一下动态规划)。 11、linux 的内存分配和多线程原理 12、MYSQL 中主键与唯一索引的区别 主键:绝对不能有空值。唯一索引:可以有空值 13、http 与 https 的主要区别 关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。 14、http 状态码及其含意
15、linux 中怎么查看系统资源占用情况 top、htop、free、uptime 16、SQL 注入的原理是什么?如何防止 SQL 注入 原理:第一 SQL 本身有问题(这个不是主要问题)。第二你写的 SQL 很有问题(这是最主要的) 防范:第一,绝对不要相信用户输入的任何东西。第二,预编译。现在的框架一般都会有 SQL 过滤的。 17、isset (null) isset (false) empty (null) empty (false) 输出 PHP 入门问题,isset 和 empty 的区别 分别是 false,true,true 18、优化 MYSQL 的方法 第一,数据超过一定数量或者体积,请拆分表,垂直或者水平分(最有效果的优化) 第二,务必有自增主键。通过自增主键来查数据是最快的。 第三,常用的查询字段建立联合索引,写 SQL 一定要尊从最左原则,用到这个索引。 第四,不要把逻辑运算放到 sql 里。言外之意是,不要写太复杂的 SQL,你能写复杂的 SQL 你肯定也能通过 PHP 实现。 19、数据库中的事务是什么? 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成, 事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。 20、写一个函数,尽可能高效的从一个标准 URL 中取出文件的扩展名 会 写正则最好。我反正不会正则,需要用的时候就百度。 21、参数为多个日期时间的数组,返回离当前时间最近的那个时间 遍历数组,求当前时间差,和第一个进行对比,小于第一个交换位置。最后取第一个即可。 22、echo、print、print_r 的区别 这三个放在一起,回答的点在于,print_r 是函数,echo、print 是结构语言。 至于他们具体的区别参考:https://www.cnblogs.com/xiaotaoing/p/66873... 23、http 协议的 header 中有哪些 key 及含义 这个问题,很难。一会半会说不清楚。如果做过 PHP restful 接口开发,也踩过这里面的坑,那应该是可以答出来常用的几个 KEY 的。 24、二叉树前中后遍历代码
25、PHP 的数组和 C 语言的数组结构上有何区别? 但从 PHP 来讲,考的是 PHP 数组的实现。可以简单的认为,PHP 的数组是 hash 桶 + 十字链表(实际上是数列 Array,列表 List,散列表 / 关联数组 / 字典 Hashtable 的聚合体)。优点是查询效率很高,遍历很方便,缺点是,占内存较多。(还是空间换时间的思路,毕竟现在内存又不值钱) C 语言的数组,就是定长定类型的数列。 26、Redis 的跳跃表怎么实现的 跳跃表 (skiplist) 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 27、哈希是什么?hash 冲突后,数据怎么存? 28、聚簇索引,聚集索引的区别? 29、B+Tree 是怎么进行搜索的 30、数组和 hash 的区别是什么? 31、写个函数,判断下面扩号是否闭合,左右对称即为闭合: ((())),)(()),(()))),(((((()),(()()),()() 32、 找出数组中不重复的值 [1,3,5] 用普通方法,肯定很容易的。 33、32 题你的时间复杂度是多少?有的情况下,你写了个算法,然后面试官会让你把你的算法的时间复杂度表达式写出来 34、PHP 的的这种弱类型变量是怎么实现的? 考 zval 的,PHP 的八种类型,本质只有一个结构。 35、在 HTTP 通讯过程中,是客户端还是服务端主动断开连接? 三次握手和四次挥手,以及他们每步的状态。 这个问题最好能一步到位回答的全面的。一般都是有客户端告诉服务端,我这边东西发完了,可以断连接了么。但是如果客户端发完 FIN 服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也一样,超过时间,服务端就断了。 36、PHP 中发起 http 请求有哪几种方式?它们有何区别?
37、有一颗二叉树,写代码找出来从根节点到 flag 节点的最短路径并打印出来,flag 节点有多个。比如下图这个树中的 6 和 14 是 flag 节点,请写代码打印 8、3、6 和 8、10、14 两个路径 典型的二叉搜索树。大学数据结构的基础题。 38、有两个文件文件,大小都超过了 1G,一行一条数据,每行数据不超过 500 字节,两文件中有一部分内容是完全相同的,请写代码找到相同的行,并写到新文件中。PHP 最大允许内内为 255M。 将文件拆分成若干个小文件,根据内容计算 hash 值,分散到不同文件。 39、请写出自少两个支持回调处理的 PHP 函数,并自己实现一个支持回调的 PHP 函数 array_map,array_filter,array_walk 40、请写出自少两个获取指定文件夹下所有文件的方法(代码或思路)。 核心方法是 scandir,核心思想是递归。 41、请写出自少三种截取文件名后缀的方法或函数(PHP 原生函数和自己实现函数均可)
42、PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。对于分布式系统,如何来保存 session 值。 这个题有点绕。考的还是 COOKIE 和 SESSION 的基础知识。服务端通过 set-cookie 命令来通知客户端保存 cookie。 只要按照 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 语句的性能。 explain,具体的请百度。(基本很少用性能分析语句。MYSQL 的表设计上尽量冗余一部分字段,避免在 MYSQL 里处理大量的逻辑运算。我们是做 PHP 服务开发的,mysql 语句能简单尽量简单。逻辑运算的地方可以在 PHP 里做。) 48、ping 一个服务器 ping 不通,用哪个命令跟踪路由包?
49、$a=[0,3]; $b=[1,4,5]; $a+=$b; var_dump ($a) 等于多少? 基础问题。本质还是考 PHP 数组的结构和特点。 结果是 01235。PHP 用数字索引和 STRING 索引差别还是很大的 50、$a=[1,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少; 122 更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新) 以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940 进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |