2020最新大厂内部 PHP 高级工程师面试题汇总(一)

一、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,1],[1,0]) 能组成一个矩形。php

咱们分析这道题, 给4个标点,判断是否矩形mysql

高中知识,矩形有4条边,两两相等, 矩形两条对角线相等, 矩形的长短边与对角线知足勾股定理。linux

故解题思路为,根据坐标点,nginx

  列出全部的两点组合边长的数组,去重,看是否是只剩 3个长度(注意正方形2个长度)laravel

  判断是否知足勾股定理面试

  调优一下,先判断有没有重复的点,有的话确定不是矩形正则表达式

代码以下:redis

<?php


function isRectangle($point1, $point2, $point3, $point4){
    if ($point1 == $point2 || $point1 == $point3  || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4) {
        return false;
    }
    $lengthArr = [];
    $lengthArr[] = getLengthSquare($point1, $point2);
    $lengthArr[] = getLengthSquare($point1, $point3);
    $lengthArr[] = getLengthSquare($point1, $point4);
    $lengthArr[] = getLengthSquare($point2, $point3);
    $lengthArr[] = getLengthSquare($point2, $point4);
    $lengthArr[] = getLengthSquare($point3, $point4);

    $lengthArr = array_unique($lengthArr);
    $lengthCount = count($lengthArr);
    if ($lengthCount == 3 || $lengthCount == 2 ) {
        if ($lengthCount == 2) {
            return(max($lengthArr) == 2*min($lengthArr));
        } else {
            $maxLength = max($lengthArr);
            $minLength = min($lengthArr);
            $otherLength = array_diff($lengthArr, [$maxLength, $minLength]);
            return($minLength + $otherLength == $maxLength);
        }
    } else {
        return false;
    }
}

function getLengthSquare($point1, $point2){
    $res = pow($point1[0]-$point2[0], 2)+pow($point1[1]-$point2[1], 2);
    return $res;
}

var_dump(isRectangle([0,0],[0,2],[2,2],[2,0]));

二、写一段代码判断单向链表中有没有造成环,若是造成环,请找出环的入口处,即 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;
    }
}

三、写一个函数,获取一篇文章内容中的所有图片,并下载sql

function download_images($article_url = '', $image_path = 'tmp'){

    // 获取文章类容
    $content = file_get_contents($article_url);

    // 利用正则表达式获得图片连接
    $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
    $ret = preg_match_all($reg_tag, $content, $match_result); 
    $pic_url_array = array_unique($match_result1[1]);

    // 建立路径
    $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
    mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);

    foreach($pic_url_array as $pic_url){
        // 获取文件信息
        $ch = curl_init($pic_url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_NOBODY, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $fileInfo = curl_exec($ch);
        $httpinfo = curl_getinfo($ch);
        curl_close($ch);

        // 获取图片文件后缀
        $ext = strrchr($pic_url, '.');
        $filename = $dir . '/' . uniqid() . $ext; 

        // 保存图片信息到文件
        $local_file = fopen($filename, 'w');
        if(false !== $local_file){
            if( false !== fwrite($local_file, $filecontent) ){
            fclose($local_file);
            }
        }
    }

}

四、获取当前客户端的 IP 地址,并判断是否在(111.111.111.111,222.222.222.222)

若是没有使用代理服务器:

$ip = $_SERVER['REMOTE_ADDR'];

使用透明代理

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

五、nginx 的 log_format 配置以下:

log_format main ‘remoteaddr−remote_user [timelocal]"request”’ 
‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';

从今天的 nginx log 文件 access.log 中:

  • a、列出 “request_time” 最大的 20 行?
  • b、列出早上 10 点访问量作多的 20 个 url 地址?

六、什么是 CSRF 攻击?XSS 攻击?如何防范?

CSRF:跨站请求伪造,能够经过经过判断来源和加 Token 的方式来防范。

XSS:跨站脚本攻击,能够经过对内容转义和过滤来防范,还有 CSP

七、应用中咱们常常会遇到在 user 表随机调取 10 条数据来展现的状况,简述你如何实现该功能。

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

八、从扑克牌中随机抽 5 张牌,判断是否是一个顺子,即这 5 张牌是连续的

这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用 PHP 来作,定义一个数组分别存着 1 到 13, 拿出一个,置空一个,最后看下 这五个置空的 是否是连续的。这种状况不考虑抽出的顺序。

九、两条相交的单向链表,如何求它们的第一个公共节点

思想:

  1. 若是两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点确定相同;
  2. 从头至尾遍历两个链表,并记录链表长度,当两者的尾节点不一样,则两者确定不相交;
  3. 尾节点相同,若是 A 长为 LA,B 为 LB,若是 LA>LB, 则 A 前 LA-LB 个先跳过

若是两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的 m_pNext 都指向同一个结点。但因为是单向链表的结点,每一个结点只有一个 m_pNext,所以从第一个公共结点开始,以后它们全部结点都是重合的,不可能再出现分叉。因此,两个有公共结点而部分重合的链表,拓扑形状看起来像一个 Y,而不可能像 X。

十、最长公共子序列问题 LCS,若有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 两个数组,找到它们共同都拥有的数,写出时间复杂度最优的代码,不能用 array_intersect(这里有坑,须要去研究一下动态规划)。

十一、linux 的内存分配和多线程原理

十二、MYSQL 中主键与惟一索引的区别

主键:绝对不能有空值。惟一索引:能够有空值

1三、http 与 https 的主要区别

关键是 S 上。简而言之,https 创建链接后要先把 SSL 的证书发下去,有了公钥和私钥,就能够解密了。

1四、http 状态码及其含意

  • 200 请求已成功,请求所但愿的响应头或数据体将随此响应返回。
  • 301 被请求的资源已永久移动到新位置。
  • 302 请求的资源如今临时从不一样的 URI 响应请求。
  • 400 一、语义有误,当前请求没法被服务器理解。二、请求参数有误。
  • 401 当前请求须要用户验证。
  • 403 服务器已经理解请求,可是拒绝执行它。
  • 404 请求失败,请求所但愿获得的资源未被在服务器上发现。
  • 500 服务器遇到了一个不曾预料的情况,没法完成对请求的处理,会在程序码出错时出现。
  • 501 服务器不支持当前请求所须要的某个功能。没法识别请求的方法。
  • 502 做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503 因为临时的服务器维护或者过载,服务器当前没法处理请求。

1五、linux 中怎么查看系统资源占用状况

top、htop、free、uptime

1六、SQL 注入的原理是什么?如何防止 SQL 注入

原理:第一 SQL 自己有问题(这个不是主要问题)。第二你写的 SQL 颇有问题(这是最主要的)

防范:第一,绝对不要相信用户输入的任何东西。第二,预编译。如今的框架通常都会有 SQL 过滤的。

1七、isset (null) isset (false) empty (null) empty (false) 输出

PHP 入门问题,isset 和 empty 的区别

分别是 false, true, true, true

1八、优化 MYSQL 的方法

第一,数据超过必定数量或者体积,请拆分表,垂直或者水平分(最有效果的优化)

第二,务必有自增主键。经过自增主键来查数据是最快的。

第三,经常使用的查询字段创建联合索引,写 SQL 必定要尊从最左原则,用到这个索引。

第四,不要把逻辑运算放到 sql 里。言外之意是,不要写太复杂的 SQL,你能写复杂的 SQL 你确定也能经过 PHP 实现。

1九、数据库中的事务是什么?

事务(transaction)是做为一个单元的一组有序的数据库操做。若是组中的全部操做都成功,则认为事务成功,即便只有一个操做失败,事务也不成功。若是全部操做完成,

事务则提交,其修改将做用于全部其余数据库进程。若是一个操做失败,则事务将回滚,该事务全部操做的影响都将取消。

20、写一个函数,尽量高效的从一个标准 URL 中取出文件的扩展名

会 写正则最好。我反正不会正则,须要用的时候就百度。

2一、参数为多个日期时间的数组,返回离当前时间最近的那个时间

遍历数组,求当前时间差,和第一个进行对比,小于第一个交换位置。最后取第一个便可。

2二、echo、print、print_r 的区别

这三个放在一块儿,回答的点在于,print_r 是函数,echo、print 是结构语言。

至于他们具体的区别参考:https://www.cnblogs.com/xiaotaoing/p/66873...

2三、http 协议的 header 中有哪些 key 及含义

这个问题,很难。一会半会说不清楚。若是作过 PHP restful 接口开发,也踩过这里面的坑,那应该是能够答出来经常使用的几个 KEY 的。

2四、二叉树前中后遍历代码

  1. 层序遍历
  2. 先序遍历
  3. 中序遍历
  4. 后序遍历

2五、PHP 的数组和 C 语言的数组结构上有何区别?

但从 PHP 来说,考的是 PHP 数组的实现。能够简单的认为,PHP 的数组是 hash 桶 + 十字链表(其实是数列 Array,列表 List,散列表 / 关联数组 / 字典 Hashtable 的聚合体)。优势是查询效率很高,遍历很方便,缺点是,占内存较多。(仍是空间换时间的思路,毕竟如今内存又不值钱)

C 语言的数组,就是定长定类型的数列。

2六、Redis 的跳跃表怎么实现的

跳跃表 (skiplist) 是一种有序数据结构,它经过在每一个节点中维持多个指向其余节点的指针,从而达到快速访问节点的目的。

2七、哈希是什么?hash 冲突后,数据怎么存?

2八、聚簇索引,汇集索引的区别?

2九、B+Tree 是怎么进行搜索的

30、数组和 hash 的区别是什么?

3一、写个函数,判断下面扩号是否闭合,左右对称即为闭合: ((())),)(()),(()))),(((((()),(()()),()()

3二、 找出数组中不重复的值 [1,2,3,3,2,1,5]

用普通方法,确定很容易的。

3三、32 题你的时间复杂度是多少?有的状况下,你写了个算法,而后面试官会让你把你的算法的时间复杂度表达式写出来

3四、PHP 的的这种弱类型变量是怎么实现的?

考 zval 的,PHP 的八种类型,本质只有一个结构。

3五、在 HTTP 通信过程当中,是客户端仍是服务端主动断开链接?

三次握手和四次挥手,以及他们每步的状态。

这个问题最好能一步到位回答的全面的。通常都是有客户端告诉服务端,我这边东西发完了,能够断链接了么。可是若是客户端发完 FIN 服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也同样,超过期间,服务端就断了。

3六、PHP 中发起 http 请求有哪几种方式?它们有何区别?

  1. GET
  2. POST
  3. HEAD
  4. PUT
  5. DELETE
  6. OPTIONS
  7. TRACE
  8. CONNECT

3七、有一颗二叉树,写代码找出来从根节点到 flag 节点的最短路径并打印出来,flag 节点有多个。好比下图这个树中的 6 和 14 是 flag 节点,请写代码打印 八、三、6 和 八、十、14 两个路径

典型的二叉搜索树。大学数据结构的基础题。

3八、有两个文件文件,大小都超过了 1G,一行一条数据,每行数据不超过 500 字节,两文件中有一部份内容是彻底相同的,请写代码找到相同的行,并写到新文件中。PHP 最大容许内内为 255M。

将文件拆分红若干个小文件,根据内容计算 hash 值,分散到不一样文件。

3九、请写出自少两个支持回调处理的 PHP 函数,并本身实现一个支持回调的 PHP 函数

array_map,array_filter, array_walk

40、请写出自少两个获取指定文件夹下全部文件的方法(代码或思路)。

核心方法是 scandir, 核心思想是递归。

4一、请写出自少三种截取文件名后缀的方法或函数(PHP 原生函数和本身实现函数都可)

echo substr(strrchr($file, '.'), 1);

echo substr($file, strrpos($file, '.')+1);

$arr=explode('.', $file);
echo $arr[count($arr)-1];

$arr=explode('.', $file);
echo end($arr);

echo strrev(explode('.', strrev($file))[0]);

echo pathinfo($file)['extension'];

echo pathinfo($file, PATHINFO_EXTENSION);

4二、PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。对于分布式系统,如何来保存 session 值。

这个题有点绕。考的仍是 COOKIE 和 SESSION 的基础知识。服务端经过 set-cookie 命令来通知客户端保存 cookie。

只要按照 domain path 过时时间等规则 用 header 函数就能够实现。

分布式系统 session,集中处理。按咱们公司的架构,为了实现高可用和高容灾,提供一个分布式的验签服务。具体的能够看下 redis 的分布式服务架构。

4三、请用 SHELL 统计 5 分钟内,nginx 日志里访问最多的 URL 地址,对应的 IP 是哪些?

4四、写一段 shell 脚本实现备份 mysql 指定库(如 test) 到指定文件夹并打包,并删除 30 天前的备份,而后将新的备份推送到远端服务器,完成后送邮件通知。

4五、mysql 数据库中 innodb 和 myisam 引擎的区别

区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。

4六、从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。

入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。

以 PHP 为例:一般最简单的回答,从用户的电脑找到最近的 DNS 服务,而后解析到对应的 IP 而后双方开始 HTTP 链接,而后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要通过 nginx 转发到 frstCGI (PHP-FPM), 而后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就从新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。

4七、如何分析一条 sql 语句的性能。

explain,具体的请百度。(基本不多用性能分析语句。MYSQL 的表设计上尽可能冗余一部分字段,避免在 MYSQL 里处理大量的逻辑运算。咱们是作 PHP 服务开发的,mysql 语句能简单尽可能简单。逻辑运算的地方能够在 PHP 里作。)

4八、ping 一个服务器 ping 不通,用哪一个命令跟踪路由包?

linux:traceroute,windows:tracert

4九、$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等于多少?

基础问题。本质仍是考 PHP 数组的结构和特色。

结果是 01235。PHP 用数字索引和 STRING 索引差异仍是很大的

50、$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少;

122
此处有一坑。foreach 完以后,$index , $value 并不会消失保留最后一次赋值。
这里的第一次 foreach 以后,数组中最后一个元素变成引用,引用变量 $v 继续存在且指向数组的最后一个元素。第二次遍历,由于遍历变量名是 $v , 因此等于说每次遍历都将这次遍历的值修改为最后元素的值,直至到遍历最后一个元素(引用元素),由于此时数组的最后一个元素已被修改为上一个元素的值,最后一次赋值就是 本身 == 本身。 故最后一个等于倒数第二个


更多学习内容能够访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人PHP技术交流群953224940

进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

相关文章
相关标签/搜索