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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容