PHP 高级工程面试题汇总

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'];

 

(点击此处加入php高级交流群一起学习交流,11年架构师带你解读年薪50万面试通关秘籍。)

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;

参考文章:

https://www.cnblogs.com/riasky/p/3367558.h...

http://www.jb51.net/article/48801.htm

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

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

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

思想:

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

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

参考文献:

https://blog.csdn.net/wcyoot/article/detai...

https://blog.csdn.net/Lieacui/article/deta...

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

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

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

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

参考:https://www.cnblogs.com/lonelyxmas/p/45946...

13、http 与 https 的主要区别

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

参考:https://www.cnblogs.com/zyl-Tara/p/7079696...

14、http 状态码及其含意

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

参考:h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值