美文网首页PHP实战
PHP 高级面试115题汇总(含答案)

PHP 高级面试115题汇总(含答案)

作者: 八重樱勿忘 | 来源:发表于2019-11-07 22:22 被阅读0次

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

    勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和如果等于最长的,那么这就是矩形。

    2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 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;

        }

    }

    3、写一个函数,获取一篇文章内容中的全部图片,并下载

    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);

                }

            }

        }

    }

    4、获取当前客户端的 IP 地址,并判断是否在

    (111.111.111.111,222.222.222.222)

    如果没有使用代理服务器:

    $ip = $_SERVER['REMOTE_ADDR'];

    使用透明代理

    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

    5、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 地址?

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

    CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。

    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 张牌是连续的

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

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

    思想:

    如果两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点肯定相同;

    从头到尾遍历两个链表,并记录链表长度,当二者的尾节点不同,则二者肯定不相交;

    尾节点相同,如果 A 长为 LA,B 为 LB,如果 LA>LB, 则 A 前 LA-LB 个先跳过

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

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

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

    12、MYSQL 中主键与唯一索引的区别

    主键:绝对不能有空值。唯一索引:可以有空值

    13、http 与 https 的主要区别

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

    14、http 状态码及其含意

    200 请求已成功,请求所希望的响应头或数据体将随此响应返回。

    301 被请求的资源已永久移动到新位置。

    302 请求的资源现在临时从不同的 URI 响应请求。

    400 1、语义有误,当前请求无法被服务器理解。2、请求参数有误。

    401 当前请求需要用户验证。

    403 服务器已经理解请求,但是拒绝执行它。

    404 请求失败,请求所希望得到的资源未被在服务器上发现。

    500 服务器遇到了一个未曾预料的状况,无法完成对请求的处理,会在程序码出错时出现。

    501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。

    502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

    503 由于临时的服务器维护或者过载,服务器当前无法处理请求。

    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, true

    18、优化 MYSQL 的方法

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

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

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

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

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

    事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,

    事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

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

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

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

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

    22、echo、print、print_r 的区别

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

    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 的区别是什么?

    完整的面试题请加群获取需要的加群(点击→)677079770

    相关文章

      网友评论

        本文标题:PHP 高级面试115题汇总(含答案)

        本文链接:https://www.haomeiwen.com/subject/dwrbbctx.html