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



一、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,1],[1,0]) 能组成一个矩形。
勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和若是等于最长的,那么这就是矩形。javascript

二、写一段代码判断单向链表中有没有造成环,若是造成环,请找出环的入口处,即 P 点php

 1 /*
 2  *单链表的结点类
 3  */
 4 class LNode{
 5     //为了简化访问单链表,结点中的数据项的访问权限都设为public
 6     public int data;
 7     public LNode next;
 8 }
 9 
10 class LinkListUtli {
11     //当单链表中没有环时返回null,有环时返回环的入口结点
12     public static LNode searchEntranceNode(LNode L)
13     {
14         LNode slow=L;//p表示从头结点开始每次日后走一步的指针
15         LNode fast=L;//q表示从头结点开始每次日后走两步的指针
16         while(fast !=null && fast.next !=null) 
17         {
18             if(slow==fast) break;//p与q相等,单链表有环
19             slow=slow.next;
20             fast=fast.next.next;
21         }
22         if(fast==null || fast.next==null) return null;
23 
24         // 从新遍历,寻找环的入口点
25         slow=L;
26         while(slow!=fast)
27         {
28             slow=slow.next;
29             fast=fast.next;
30         }
31 
32         return slow;
33     }
34 }
35 3、写一个函数,获取一篇文章内容中的所有图片,并下载
36 
37 function download_images($article_url = '', $image_path = 'tmp'){
38 
39     // 获取文章类容
40     $content = file_get_contents($article_url);
41 
42     // 利用正则表达式获得图片连接
43     $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
44     $ret = preg_match_all($reg_tag, $content, $match_result); 
45     $pic_url_array = array_unique($match_result1[1]);
46 
47     // 建立路径
48     $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
49     mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
50 
51     foreach($pic_url_array as $pic_url){
52         // 获取文件信息
53         $ch = curl_init($pic_url);
54         curl_setopt($ch, CURLOPT_HEADER, 0);
55         curl_setopt($ch, CURLOPT_NOBODY, 0);
56         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
57         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
58         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
59         $fileInfo = curl_exec($ch);
60         $httpinfo = curl_getinfo($ch);
61         curl_close($ch);
62 
63         // 获取图片文件后缀
64         $ext = strrchr($pic_url, '.');
65         $filename = $dir . '/' . uniqid() . $ext; 
66 
67         // 保存图片信息到文件
68         $local_file = fopen($filename, 'w');
69         if(false !== $local_file){
70             if( false !== fwrite($local_file, $filecontent) ){
71             fclose($local_file);
72             }
73         }
74     }
75 
76 }

 

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

(111.111.111.111,222.222.222.222)
若是没有使用代理服务器:

$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

 

五、nginx 的 log_format 配置以下:mysql

1 log_format main ‘remoteaddr−remote_user [timelocal]"request”’ 
2 ‘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 地址?linux

六、什么是 CSRF 攻击?XSS 攻击?如何防范?
CSRF:跨站请求伪造,能够经过经过判断来源和加 Token 的方式来防范。nginx

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, 拿出一个,置空一个,最后看下 这五个置空的 是否是连续的。这种状况不考虑抽出的顺序。redis

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

若是两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点确定相同;
从头至尾遍历两个链表,并记录链表长度,当两者的尾节点不一样,则两者确定不相交;
尾节点相同,若是 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 是结构语言。

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 请求有哪几种方式?它们有何区别?

GET
POST
HEAD
PUT
DELETE
OPTIONS
TRACE
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 - 雷】foreach 與 reference 的雷

5一、数据库中的存放了用户 ID, 扣费不少行,redis 中存放的是用户的钱包,如今要写一个脚本,将数据库中的扣费记录同步到 redis 中,每 5 分钟执行一次。请问要考虑哪些问题?
思路:生产者和消费者模式。这个问题也没有说其余的状态,好比数据库的数据会实时增长么?redis 中每一个钱包是否有其余服务在读取或者写入啊。什么的。数据库和 REDIS 放一块儿,要么考数据一致性,要么考出现锁,致使效率下降。

5二、MYSQL 主从服务器,若是主服务器是 innodb 引擎,从服务器是 myisam 引擎,在实际应用中,会遇到什么问题?
不知道,没用过,为何这么设计?故意给本身找不愉快?

5三、linux 中进程信号有哪些?
kill -l 不多用

5四、redis 的底层实现
面试官这么样问你,你就反问他,你要的底层实现是字段的设计?内存分配管理?网络模型?数据同步?仍是分布式的实现?(TIPS: 面试就是两我的的博弈。面试官给出一个描述不清晰的问题,咱们不必回答。让他把问题讲清楚再思考怎么回复)

这篇文章 要多读几遍。

5五、异步模型
问清楚是 IO 异步模型。仍是 AJAX 这类的异步请求模型。差异很是大的。

狗东某风控研发必考题。

5六、10g 文件,用 php 查看它的行数
粗暴一点的方法 ini_set ('memory_limit','-1'); 先把当前内存限制解除了 而后直接逐行统计。时间会很是的久。

有更好的方法请留言。

5七、有 10 亿条订单数据,属于 1000 个司机的,请取出订单量前 20 的司机
(TIPS)不要中招。不要用经常使用思路来处理,10 亿数据 你再怎么优化,全表求和,都是要死人的。

咱们从设计上解决这个问题。只有一千个司机。咱们能够作个简单哈希,分库分表,% 求余数。保证这一千个司机分在一千个表里,每一个人有每一个人的单独表。引擎用 MYSAIM,求表中数据的总数,效率飞快,遍历一千张表,求最大前二十便可。

5八、设计一个微信红包的功能
没作过。其实题目表达不清楚。若是作过微信公众号开发,知道微信事件模型的 XML 数据结构,应该会好作一点。

5九、根据 access.log 文件统计最近 5 秒的 qps,并以以下格式显示,01 1000(难点在 01 序号)

tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c

60、php7 性能为何提高这么高
不逼逼,直接参考:

鸟哥的文章要多读,多读。

6一、遍历一个多维数组
递归。array_map 传入一个回调函数。

6二、有这样一个字符串 abcdefgkbcdefab…… 随机长度,写一个函数来求 bcde 在这个字符串中出现的次数
substr_count();

6三、有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 个字节,内存限制大小是 1M。返回频数最高的 100 个词
方法太多了,可是实现起来 各有各的问题。

我可能只会用 HASH 映射作。其余的,不会。

参考:第 64 题。

6四、十道海量数据处理面试题与十个方法大总结

https://blog.csdn.net/v_JULY_v/article/details/6279498

6五、php 进程模型,php 怎么支持多个并发
守护进程模型(须要知道 php-fpm 的各类配置了)

参考:

6六、nginx 的进程模型,怎么支持多个并发
这个三言两语说不清楚。

参考:

6七、php-fpm 各配置含义,fpm 的 daemonize 模式

php-fpm 的配置并很少,经常使用的就更少了。

参考:http://www.4wei.cn/archives/1002061

static - 子进程的数量是固定的(pm.max_children)
ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动
dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

6八、让你实现一个简单的架构,并保持高可用,两个接口,一个上传一条文本,一个获取上传的内容,你怎么来设计?要避免单机房故障,同时要让代码层面无感。
参考:分布式架构设计必备 CAP 原理。

6九、两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常状况下讲台服务器的数据是一致的
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。

若是是核心业务的话,如今全部的写操做都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。

以上全是应急操做。实际上数据库的容灾设计要复杂的多。

面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,大家每秒多少写入操做。按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。这个级别的数据同步,出现差别的几率 能够忽略不计的。有一台出现问题,另外一台也能够抗住。

(正常的操做,仍是先停写,等数据一致,切换,开写。咱们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操做,只有十几个。先后耽搁不到 20 秒)。

70、http 协议具体的定义
这种题 有是很难回答的。太宽泛了,咱们面试早就不问这种问题了。

参考:日本人写的《图解 HTTP》

7一、什么是锁,怎么解决锁的问题
计算机原理学的,生产者消费者模型,银行家模型,均可以解决锁的问题。

7二、rand 与 mt_rand 的区别
我实习的时候遇到这个坑。

说是 mt_rand 比 rand 快 4 倍。

在随机数区间不大的状况下并无很大的效率差距。可是出现重复数的概率,rand 要比 mt_rand 高不少。

7三、mysql 事务隔离是怎么实现的
经过各类行锁表锁,各类乐观锁悲观锁,排他锁实现的呀。

7四、mysql 的锁怎么实现的

7五、对称加密和非对称加密的方式
对称加密:咱们俩共用一个秘钥,你加密,我解密。

非对称加密:我给你一个公钥,你加密完了,我还能有个人私钥把密文解开。可是你没有个人私钥。

扩展:椭圆加密算法。

7六、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水以后,会在 24 小时后死亡,问:最少用几只小白鼠能够在 24 小时后找到具体是哪一瓶水有毒。
四只

二进制问题。薛定谔的老鼠。

一只老鼠有两个状态,死活,对应 01。假设老鼠的个数为 A,则有 2^A>=10; A=4;

思路很简单,十瓶药编号:0,1,10,11….1001;

0 不喝。第一只老鼠喝全部个位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。

24 小时后,看下死了的是 1,活着的是 0。按老鼠的顺序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有问题。

7七、redis 是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问 MYSQL 的同步方式和相关异常状况
redis 集群主从同步的简单原理

  Redis 的复制功能是基于内存快照的持久化策略基础上的,也就是说不管你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就必定会有内存快照发生。

  当 Slave 启动并链接到 Master 以后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个

Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将全部写命令发送到 Slave )。

  Slave 首先会将数据文件保存到本地 以后再将 数据 加载到内存中。

  当第一次连接 或者是 故障后 从新链接 都会先判断 Slave 的存活状态 在作所有数据的同步 , 以后只会同步 Master 的写操做 (将命令发送给 Slave)

问题:

  当 Master 同步数据时 若数据量较大 而 Master 自己只会启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 并且 Slave 恢复的时间也会很慢!

redis 主从复制的优势:

(1)在一个Redis集群中,master负责写请求,slave负责读请求,这么作一方面经过将读请求分散到其余机器从而大大减小了master服务器的压力,另外一方面slave专一于提供
读服务从而提升了响应和读取速度。

  (2) 在一个 Redis 集群中,若是 master 宕机,slave 能够介入并取代 master 的位置,所以对于整个 Redis 服务来讲不至于提供不了服务,这样使得整个 Redis 服务足够安全。

  (3) 水平增长 Slave 机器能够提升性能

7八、怎么解决跨域
JSONP
添加响应头,容许跨域
代理的方式

7九、json 和 xml 区别,各有什么优缺点
(1)可读性方面:基本相同,XML 的可读性比较好;

(2)可扩展性方面:都具备良好的扩展性;

(3)编码难度方面:相对而言,JSON 的编码比较容易;

(4)解码难度:JSON 的解码难度基本为零,XML 须要考虑子节点和父节点;

(5)数据体积方面:JSON 相对于 XML 来说,数据体积小,传递的速度比较快;

(6)数据交互方面:JSON 与 javascript 的交互更加方便,更容易解析处理,更好的数据交互;

(7)数据描述方面:XML 对数据描述性比较好;

(8)传输速度方面:JSON 的速度远远快于 XML。

80、Trait 优先级
在 trait 继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法

8一、a 引用 b,报错 c 里面类重复定义,循环引用会出现什么问题

8二、下面员工 3 的薪水大于其主管的薪水,一条 SQL 找到薪水比下属低的主管

id    username    salary  pid
1    a   3000    null
2    b   8000    null
3    c   5000    1
4    d   6000    3
SELECT a.*, b.*
FROM `user` as a
LEFT JOIN `user` as b ON a.pid = b.id AND a.salary > b.salary
WHERE b.id > 0;

8二、在一个坐标系内有一个 N 个点组成的多边形,如今有一个坐标点,写代码或思路来判断这个点是否处于多边形内

8三、数据库若是出现了死锁,你怎么排查,怎么判断出现了死锁?

8四、写一个一个程序来查找最长子串

8五、分析一个问题:php-fpm 的日志正常,但客户端却超时了,你认为多是哪里出了问题,怎么排查?
检查 nginx log,请求是否达到 nginx 和是否正常转发给 php-fpm

8六、nginx 的工做流程是什么样的,能够画图描述

8七、进程间通讯方式有哪些
1) 管道
管道分为有名管道和无名管道
无名管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系通常指的是父子关系。无明管道通常用于两个不一样进程之间的通讯。当一个进程建立了一个管道,并调用 fork 建立本身的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
有名管道也是一种半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

2) 信号量
信号量是一个计数器,能够用来控制多个线程对共享资源的访问., 它不是用于交换大批数据,而用于多线程之间的同步。它常做为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。所以,主要做为进程间以及同一个进程内不一样线程之间的同步手段.

3) 信号
信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生.

4) 消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特色。消息队列是 UNIX 下不一样进程之间可实现共享资源的一种机制,UNIX 容许不一样进程将格式化的数据流以消息队列形式发送给任意进程。对消息队列具备操做权限的进程均可以使用 msget 完成对消息队列的操做控制。经过使用消息类型,进程能够按任何顺序读信息,或为消息安排优先级顺序.

5) 共享内存
共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC (进程间通讯) 方式,它是针对其它进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步与通讯.

6) 套接字:可用于不一样及其间的进程通讯

8八、主从复制,从服务器会读取到主服务器正在回滚的数据吗?主数据库写成功,从服务器由于一些缘由写失败,最后会出现什么状况?主从复制若是键冲突怎么办?
不会;主从数据不一致;正常是不会出现这种情景,具体看状况,是否能够修复,恢复到以前的时间点,而后追回同步。

8九、事务有几种隔离级别?事务的隔离级别是怎么实现的?

读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

90、什么是 B + 树,请画 b + 树的结构

9一、mysql 中的字符集,客户端与数据库不一致,怎么办?MYSQL 中字符串到显示到界面,字符转换的过程是怎样的?数据库中的字符集是 latin1, 你如今将 utf8 的字符串存到 latin1 字符集的数据库表,你能将 utf8 的字符串存进去吗?假如你说能存,追问:可否恢复?假如能,那怎么恢复?

9二、

写一段代码,找到全部子集合,如 [a,b,c] 的子集合有 {},{a},{b},{c},{ab},{ac},{abc}

9三、

['a'=>200,'b'=>100,'c'=>100], 写一个自定义排序函数,按值降序,若是值同样,按键排序
冒泡排序

9四、设计一个缓存系统,能够按期或空间占满以后自动删除长期不用的数据,不能使用用遍历。
我当时的答案是用链表来存,缓存命中就将该缓存移到链表头,而后链表尾就都是冷数据了。
我记得以前是在哪里看过这个设计,但我忘记在链接了,请知道朋友的把链接贴上来。

9五、

== 和 === 的区别,写出如下输出:"aa"==1,"bb"==0,1=="1"
== 等于,不须要对比数据类型
=== 全等,须要对比类型
false, true, true

9六、一个排序好的数组,将它从中间任意一个位置切分红两个数组,而后交换它们的位置并合并,合并后新数组元素如:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19, 写一个查询函数来查找某个值是否存在。

9七、设计一个树形结构,再写一个函数对它进行层序遍历

9八、

'$var' 和 "$var" 的区别
双引号串中的内容能够被解释并且替换,而单引号串中的内容总被认为是普通字符。

在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠 \ 和插入单引号 \')。因此,当你想在字串中进行变量代换和包 含 \n(换行符)等转义序列时,你应该使用双引号。单引号串能够用在其余任何地方,脚本中使用单引号串处理速度会更快些。

9九、self 和 static 的区别
static:若是在子类中重写了父类中的 static 方法、属性,父类就会去访问了子类的 static 方法

self: 是类内指针,无论子类有没有重写过父类中的方法、属性都指向本类的静态方法、属性
100、PHP 的协程以及用途

10一、描述 autoload 的机制

10二、mysql 中字段类型各占几个字节:smallint、int、bigint、datetime、varchar (8)

smallint 2 字节
int 4 字节
bigint 8 字节
datetime 8 字节
varchar (8) 8*3 字节

10三、哪些属性惟一肯定一条 TCP 链接

10四、myisam 和 innodb 的区别,为何 myisam 比 innodb 快,myisam 和 innodb 的索引数据结构是什么样的?innodb 主键索引和非主键索引的区别?其索引上存放的数据是什么样的?
区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。

10五、断开 TCP 链接时,timewait 状态会出如今发起分手的一端仍是被分手的一端
为何创建 TCP 链接须要三次握手?
缘由:为了应对网络中存在的延迟的重复数组的问题
例子:
假设 client 发起链接的链接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,致使延迟到达 server。原本这是一个已经失效的链接报文,可是 server 接收到这个链接报文以后,误认为 client 发起了新的链接,因而向 client 发送确认报文段。此时由于没有了链接的 3 次握手,client 不会对 server 的确认报文做出回应,也不会向 server 发送数据,server 就觉得链接已经创建,一直在空等 client 的数据,这样 server 的这一部分网络资源就被浪费了。

为何断开 TCP 链接须要进行四次握手 ?
由于 TCP 链接是全双工的网络协议,容许同时通讯的双方同时进行数据的收发,一样也容许收发两个方向的链接被独立关闭,以免 client 数据发送完毕,向 server 发送 FIN 关闭链接,而 server 还有发送到 client 的数据没有发送完毕的状况。因此关闭 TCP 链接须要进行四次握手,每次关闭一个方向上的链接须要 FIN 和 ACK 两次握手。

TIME_WAIT 状态的意义

在 TCP 链接中,当被动关闭链接的一方 (图中 client) 发送的 FIN 报文到达时,被动关闭链接的一方会发送 ACK 确认报文,而且进入 TIME_WAIT 状态,而且等待 2MSL 时间段 (MSL:maximum segment life)。这么作有下述两个缘由:

被动关闭链接的一方 (图中的 server) 在一段时间内没有收到对方的 ACK 确认数据包,会从新发送 FIN 数据包,于是主动关闭链接的一方须要停留在等待状态以处理对方从新发送的 FIN 数据包。不然他会回应一个 RST 数据包给被动关闭链接的一方,使得对方莫名其妙。

在 TIME_WAIT 状态下,不容许应用程序在当前 ip 和端口上和以前通讯的 client (这个 client 的 ip 和端口号不变) 创建一个新的链接。这样就能避免新的链接收到以前的 ip 和端口一致的链接残存在网络中的数据包。这也是 TIME_WAIT 状态的等待时间被设置为 2MSL 的缘由,以确保网络上当前链接两个方向上还没有接收的 TCP 报文已经所有消失。

10六、AWK 各类数据分析考得很是多,要多练习,题目再也不一一写了

10七、redis 中集合、有序集合、hyperLog、hash 的数据结构是啥样的
key value

10八、描述一下:一个请求到达 nginx 的所有处理过程(nginx 自身会调用哪些逻辑)、而后怎么与 php 通讯,中间的流程是什么样的等等?

10九、nginx 和 php-fpm 的相关配置,随便问里面各类参数啥意思
php-fpm 能够经过 tcp socket 和 unix socket 两种方式实现。

1十、假若有一张地图,以下图,"-" 表明海洋、"+" 表明陆地,用你最擅长的方式,取出陆地的坐标。

--++----++--+++---
-++++----+++++++--
-+++----++++------
-----++------++++-
---++++++-----+++-
-----+++------+++-
好比上图在数组中表示成,1 表示成陆地,0 表示海洋:

[
    [0,0,1,1,0,0,0,1,1....],
    [0,1,1,1.....],
]
写个算法取出全部陆地的坐标,并按块放到一块儿,如地图上左上角第一个陆地的坐标是:

[
    [0,2],[0,3],
    [1,1],[1,2],[1,3],[1,4],
    [2,1],[2,2],[2,3]
]

1十一、Jsonp 的实现原理,你还知道哪些跨域方式?
JSONP
添加响应头,容许跨域
代理的方式

1十二、若是某个博客经过判断 referer 方式来进行图片防盗链,如何破解?
curl 设置来源地址来欺骗对方服务器验证

11三、简述 mysql 查询优化的本质,并举 2 个例子
11四、设计一个秒杀系统,如何保证商品不超卖?

11五、单例模式的优势是什么?抽象类是什么?还了解哪些设计模式?
单例模式又称为职责模式,它用来在程序中建立一个单一功能的访问点,通俗地说就是实例化出来的对象是惟一的。
全部的单例模式至少拥有如下三种公共元素:

它们必须拥有一个构造函数,而且必须被标记为 private它们拥有一个保存类的实例的静态成员变量它们拥有一个访问这个实例的公共的静态方法单例类不能再其它类中直接实例化,只能被其自身实例化。它不会建立实例副本,而是会向单例类内部存储的实例返回一个引用。抽象的类不能被实例化。任何一个类,若是它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

相关文章
相关标签/搜索