Introduction to VPS and Web Technology Development

面试题

自由vps 新闻

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

参考文章

https://www.cnblogs.com/rendd/p/6183094.html

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.html

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

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

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

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

思想:

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

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

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

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

参考文献:

https://blog.csdn.net/wcyoot/article/details/6426436

https://blog.csdn.net/Lieacui/article/details/52046548

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/4594624.html

13、http与https的主要区别

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

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

14、http状态码及其含意

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

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

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

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

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

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

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

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

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

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

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

参考:http://tool.oschina.net/commons?type=5

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实现。

参考:https://cloud.tencent.com/developer/article/1004367

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

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

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

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

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

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

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

22、echo、print、print_r的区别

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

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

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

这个问题,很难。一会半会说不清楚。如果做过PHP restful 接口开发,也踩过这里面的坑,那应该是可以答出来常用的几个KEY的。

参考:https://blog.csdn.net/u014175572/article/details/54861813

24、二叉树前中后遍历代码

1.层序遍历

2.先序遍历

3.中序遍历

4.后序遍历

参考:https://blog.csdn.net/wk199351/article/details/65936001

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

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

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

26、Redis的跳跃表怎么实现的

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

参考:https://blog.csdn.net/universe_ant/article/details/51134020

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

28、聚簇索引,聚集索引的区别?

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

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

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

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

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

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

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

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

参考:https://blog.csdn.net/ohmygirl/article/details/41542445

35、在HTTP通讯过程中,是客户端还是服务端主动断开连接?

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

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

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

GET

POST

HEAD

PUT

DELETE

OPTIONS

TRACE

CONNECT

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

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

参考:https://blog.csdn.net/BaiHuaXiu123/article/details/52488443

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

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

39、请写出自少两个支持回调处理的PHP函数,并自己实现一个支持回调的PHP函数

array_map,array_filter, array_walk

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

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

41、请写出自少三种截取文件名后缀的方法或函数(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);

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

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

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

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

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

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

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

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

参考:https://blog.csdn.net/chajinglong/article/details/56666771

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

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

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

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

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

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

linux:traceroute,windows:tracert

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

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

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

参考:http://www.jb51.net/article/38593.htm

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

122

此处有一坑。foreach 完之后,$index , $value 并不会消失保留最后一次赋值。

这里的第一次foreach之后,数组中最后一个元素变成引用,引用变量 $v 继续存在且指向数组的最后一个元素。第二次遍历,因为遍历变量名是 $v , 所以等于说每次遍历都将此次遍历的值修改成最后元素的值,直至到遍历最后一个元素(引用元素),因为此时数组的最后一个元素已被修改成上一个元素的值,最后一次赋值就是 自己==自己。 故最后一个等于倒数第二个

https://laravel-china.org/articles/7001/php-ray-foreach-and-references-thunder

51、数据库中的存放了用户ID,扣费很多行,redis中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到redis中,每5分钟执行一次。请问要考虑哪些问题?

思路:生产者和消费者模式。这个问题也没有说其他的状态,比如数据库的数据会实时增加么?redis中每个钱包是否有其他服务在读取或者写入啊。什么的。数据库和REDIS放一起,要么考数据一致性,要么考出现锁,导致效率降低。

52、MYSQL主从服务器,如果主服务器是innodb引擎,从服务器是myisam引擎,在实际应用中,会遇到什么问题?

不知道,没用过,为什么这么设计?故意给自己找不愉快?

53、linux中进程信号有哪些?

kill -l 很少用

54、redis的底层实现

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

参考:https://cloud.tencent.com/developer/article/1004377

这篇文章 要多读几遍。

55、异步模型

问清楚是IO异步模型。还是AJAX这类的异步请求模型。差别非常大的。

参考:https://cloud.tencent.com/developer/article/1005481

狗东某风控研发必考题。

56、10g文件,用php查看它的行数

粗暴一点的方法 ini_set('memory_limit','-1'); 先把当前内存限制解除了 然后直接逐行统计。时间会非常的久。

有更好的方法请留言。

57、有10亿条订单数据,属于1000个司机的,请取出订单量前20的司机

(TIPS)不要中招。不要用常用思路来处理,10亿数据 你再怎么优化,全表求和,都是要死人的。

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

58、设计一个微信红包的功能

没做过。其实题目表达不清楚。如果做过微信公众号开发,知道微信事件模型的XML数据结构,应该会好做一点。

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

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

参考:https://blog.csdn.net/dong_007_007/article/details/78330337

60、php7性能为什么提升这么高

不逼逼,直接参考:http://www.laruence.com/php-internal

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

61、遍历一个多维数组

递归。array_map传入一个回调函数。

62、有这样一个字符串abcdefgkbcdefab......随机长度,写一个函数来求bcde在这个字符串中出现的次数

substr_count();

63、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词

方法太多了,但是实现起来 各有各的问题。

我可能只会用HASH映射做。其他的,不会。

参考:第64题。

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

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

65、php进程模型,php怎么支持多个并发

守护进程模型(需要知道php-fpm的各种配置了)

参考:https://www.jianshu.com/p/542935a3bfa8

66、nginx的进程模型,怎么支持多个并发

这个三言两语说不清楚。

参考:https://www.zhihu.com/question/22062795

67、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

68、让你实现一个简单的架构,并保持高可用,两个接口,一个上传一条文本,一个获取上传的内容,你怎么来设计?要避免单机房故障,同时要让代码层面无感。

参考:分布式架构设计必备CAP原理。

69、两台mysql服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的

不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。

如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。

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

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

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

70、http协议具体的定义

这种题 有是很难回答的。太宽泛了,我们面试早就不问这种问题了。

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

71、什么是锁,怎么解决锁的问题

计算机原理学的,生产者消费者模型,银行家模型,都可以解决锁的问题。

72、rand与mt_rand的区别

我实习的时候遇到这个坑。

说是mt_rand比rand快4倍。

在随机数区间不大的情况下并没有很大的效率差距。但是出现重复数的几率,rand要比mt_rand高很多。

73、mysql事务隔离是怎么实现的

通过各种行锁表锁,各种乐观锁悲观锁,排他锁实现的呀。

74、mysql的锁怎么实现的

https://blog.csdn.net/alexdamiao/article/details/52049993

https://www.cnblogs.com/luyucheng/p/6297752.html

https://blog.csdn.net/tangkund3218/article/details/47704527

75、对称加密和非对称加密的方式

对称加密:我们俩共用一个秘钥,你加密,我解密。

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

扩展:椭圆加密算法。

76、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 有问题。

77、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机器可以提高性能

参考:

https://blog.csdn.net/hxpjava1/article/details/78347890/

https://www.cnblogs.com/zhao-blog/p/6131524.html

78、怎么解决跨域

JSONP

添加响应头,允许跨域

代理的方式

79、json和xml区别,各有什么优缺点

(1)可读性方面:基本相同,XML的可读性比较好;

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

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

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

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

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

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

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

参考:https://blog.csdn.net/java19880223/article/details/20054111

80、Trait优先级

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

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

82、下面员工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;

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

83、数据库如果出现了死锁,你怎么排查,怎么判断出现了死锁?

https://www.cnblogs.com/huanyou/p/5775965.html

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

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

85、分析一个问题:php-fpm的日志正常,但客户端却超时了,你认为可能是哪里出了问题,怎么排查?

检查nginx log,请求是否达到nginx 和是否正常转发给 php-fpm

86、nginx的工作流程是什么样的,可以画图描述

87、进程间通信方式有哪些

1)管道

管道分为有名管道和无名管道

无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。

2)信号量

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

3)信号

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

4)消息队列

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

5)共享内存

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

6)套接字:可用于不同及其间的进程通信

88、主从复制,从服务器会读取到主服务器正在回滚的数据吗?主数据库写成功,从服务器因为一些原因写失败,最后会出现什么情况?主从复制如果键冲突怎么办?

不会;主从数据不一致;正常是不会出现这种情景,具体看情况,是否可以修复,恢复到之前的时间点,然后追回同步。

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

读未提交(read-uncommitted)

不可重复读(read-committed)

可重复读(repeatable-read)

串行化(serializable)

https://www.cnblogs.com/huanongying/p/7021555.html

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

https://blog.csdn.net/qq_23217629/article/details/52510485

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

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

93、['a'=>200,'b'=>100,'c'=>100],写一个自定义排序函数,按值降序,如果值一样,按键排序

冒泡排序

94、设计一个缓存系统,可以定期或空间占满之后自动删除长期不用的数据,不能使用用遍历。

我当时的答案是用链表来存,缓存命中就将该缓存移到链表头,然后链表尾就都是冷数据了。

我记得之前是在哪里看过这个设计,但我忘记在连接了,请知道朋友的把连接贴上来。

95、==和===的区别,写出以下输出:"aa"==1,"bb"==0,1=="1"

== 等于,不需要对比数据类型

=== 全等,需要对比类型

false, true, true

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

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

98、'$var'和"$var"的区别

双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。

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

99、self和static的区别

static:如果在子类中重写了父类中的static方法、属性,父类就会去访问了子类的static方法

self: 是类内指针,不管子类有没有重写过父类中的方法、属性都指向本类的静态方法、属性

100、PHP的协程以及用途

http://www.laruence.com/2015/05/28/3038.html

https://blog.csdn.net/gavin_new/article/details/54603490

101、描述autoload的机制

https://blog.csdn.net/zhihua_w/article/details/52723402

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

smallint 2字节

int 4字节

bigint 8字节

datetime 8字节

varchar(8) 8*3字节

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

103、哪些属性唯一确定一条TCP连接

104、myisam和innodb的区别,为什么myisam比innodb快,myisam和innodb的索引数据结构是什么样的?innodb主键索引和非主键索引的区别?其索引上存放的数据是什么样的?

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

参考:https://blog.csdn.net/chajinglong/article/details/56666771

105、断开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报文已经全部消失。

https://www.cnblogs.com/zhoudayang/p/6012257.html

106、AWK各种数据分析考得非常多,要多练习,题目不再一一写了

107、redis中集合、有序集合、hyperLog、hash的数据结构是啥样的

key value

108、描述一下:一个请求到达nginx的全部处理过程(nginx自身会调用哪些逻辑)、然后怎么与php通信,中间的流程是什么样的等等?

https://www.jianshu.com/p/df89b530db89

https://blog.csdn.net/xiajun07061225/article/details/9309273

109、nginx和php-fpm的相关配置,随便问里面各种参数啥意思

php-fpm可以通过tcp socket和unix socket两种方式实现。

https://blog.csdn.net/koastal/article/details/52303316

110、假如有一张地图,如下图,"-"代表海洋、"+"代表陆地,用你最擅长的方式,取出陆地的坐标。

--++----++--+++---

-++++----+++++++--

-+++----++++------

-----++------++++-

---++++++-----+++-

-----+++------+++-

比如上图在数组中表示成,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]

]

111、Jsonp的实现原理,你还知道哪些跨域方式?

JSONP

添加响应头,允许跨域

代理的方式

112、如果某个博客通过判断 referer 方式来进行图片防盗链,如何破解?

curl 设置来源地址来欺骗对方服务器验证

113、简述 mysql 查询优化的本质,并举2个例子

114、设计一个秒杀系统,如何保证商品不超卖?

https://blog.csdn.net/zhoudaxia/article/details/38067003

115、单例模式的优点是什么?抽象类是什么? 还了解哪些设计模式?

单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。

所有的单例模式至少拥有以下三种公共元素:

它们必须拥有一个构造函数,并且必须被标记为private

它们拥有一个保存类的实例的静态成员变量

它们拥有一个访问这个实例的公共的静态方法

单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

https://www.cnblogs.com/kangxl/p/6347179.html

工厂模式

适配器模式

116、斗地主中,地主比农民得到王炸的概率多多少?

转载:https://laravel-china.org/articles/20714

1.填PHP中用来完成如下功6的能数 

(1)问断一个变量的值处否为空: 

(2)个变量是否为NUL:

照片

 (3)判断一个变量是是否存在:  

(4)特放一个变量:unset

2.日期的差数,制如2015-37 2015-67的日期

通过时间戳计算

3.nginx配置某个ip以外的的访问频率

http中的配置

http {

 

    #$limit_conn_zone:限制并发连接数

    limit_conn_zone $binary_remote_addr zone=one1:10m;

 

    #limit_req_zone:请求频率

    #$binary_remote_addr:以客户端IP进行限制

    #zone=one:10m:创建IP存储区大小为10M,用来存储访问频率

    #rate=10r/s:表示客户端的访问评率为每秒10次

    limit_req_zone $binary_remote_addr zone=one2:10m   rate=30r/s;

      

}

2、server配置

server {

        listen       80;

        server_name  localhost;

        

 

        location / {

            #限制并发数2

            limit_conn  one1  2; 

            #burst:如果请求的频率超过了限制域配置的值,请求处理会被延迟

            #nodelay:超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503

            limit_req   zone=one2 burst=10 nodelay;

            root   html;

            index  index.html index.htm;

        }

 

}

  

3、访问白名单设置

http {

# geo:指令定义了一个白名单$limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0

    geo $limited{

        default 1;

        10.0.0.140 0;  #把10.0.0.140设置为白名单

        10.0.0.141 0;  #白名单ip,可继续添加

    }

    #使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip

    #这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问

 

    map $limited $limit {   

$binary_remote_addr;  

"";   

    } 

    limit_conn_zone $limit zone=one:20m;

    limit_req_zone $limit zone=one2:20m   rate=30r/s;

}

 4.Linux系统 SFESION就认放在存放目录?

Linux:

/tmp 或 /var/lib/php/session

Windows:

C:\WINDOWS\Temp

5. COOKIE和 SESSION 的区别最什么?

6 get最大传输容量是什么 原因

get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。很多文章都说GET方式提交的数据最多只能是1024字节,而 实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制 是2083字节(2K+35字节)。对于其他浏览器,如FireFox,Netscape等,则没有长度限制,这个时候其限制取决于服务器的操作系统。即 如果url太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。

7(满足头部分实现)增加一个请求在网起时5秒后新升请求?

$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);

if (!$fp) {

  echo "$errstr ($errno)<br />\n";

} else {

  $out = "GET / HTTP/1.1\r\n";

  $out .= "Host: www.baidu.com\r\n";

  $out .= "Connection: Close\r\n\r\n";

  fwrite($fp, $http);

  while (!feof($fp)) {

    echo fgets($fp, 128);

  }

  fclose($fp);

}

8.从以下题目二逃一做一个(如会,请先做第一道题)

https://www.jb51.net/article/75973.htm

(1)列举常用见设计视式,用 php实现桥或用 UML摇述 

2)声明一个名 Myblog的类 ,在构造函数中打开一个文件,在析构函数中关闭这个文件

9.编写一个接口,从安全角度考虑

10.对服务器安全方面对权限管理的考虑

11.linux从nginx访问日志里面找出访问次数最多的10个ip,倒序排列

cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10

12.vi常用命令

1、模式转换

        正常-->输入:以下这几个参数实现的功能都是转为输入模式,只不过转换后的光标所在的位置不同(感兴趣可以试一试,虽然意义不大!)

            i:在当前光标所在字符的前面,转为输入模式;

            a:在当前光标所在字符的后面,转为输入模式;

            o:在当前光标所在行的下方,新建一行,并转为输入模式;

            I:在当前光标所在行的行首,转为输入模式;

            A:在当前光标所在行的行尾,转为输入模式;

            O:在当前光标所在行的上方,新建一行,并转为输入模式;

        输入-->正常:

            ESC

        正常-->末行:

            :(英文冒号)

        末行-->正常:

            ESC,ESC

注意:输入模式和末行模式之间不能直接切换。

2、关闭文件(末行模式)

        :q        退出;

        :q!        不保存退出;

        :w        保存;

        :w!        强行保存;

        :wq        保存退出

        :wq!        强制保存并退出

注意:在正常模式下按组合键shift zz可以保存并退出

3、移动光标(正常模式)

    1)逐字符移动:

       h: 左;

        l: 右;

        j: 下;

        k: 上;

        #h: 移动#个字符

    2)以单词为单位移动

        w: 移至下一个单词的词首;

        e: 跳至当前或下一个单词的词尾;

        b: 跳至当前或前一个单词的词首;

        #w: 移动#个单词

    3)行内跳转:

        0: 绝对行首;

        ^: 行首的第一个非空白字符;

        $: 绝对行尾

    4)行间跳转

        #G:跳转至第#行;

        gg: 第一行;

        G:最后一行

    5)末行模式

        .: 表示当前行;

        $: 最后一行;

        #:第#行;

        +#: 向下的#行

4、翻屏(正常模式)

        Ctrl+f: 向下翻一屏;

        Ctrl+b: 向上翻一屏;

        Ctrl+d: 向下翻半屏;

        Ctrl+u: 向上翻半屏

5、复制字符

    1)正常模式

        复制:

        yy:复制当前行

        nyy:复制当前行至下面的n行

        粘贴:

        p:粘贴到光标的后面

        P:粘贴到光标的前面

    2)可视模式

        复制:

        y:复制当前行

        ny:复制当前行至下面的n行

        粘贴:

        p:粘贴到光标的后面

        P:粘贴到光标的前面

6、删除字符(正常模式)

        x: 删除光标所在处的单个字符;

        #x: 删除光标所在处及向后的共#个字符;

        d$或D:从当前光标处删除至行尾;

        d^:从当前光标处删除之行首;

        dd: 删除当前光标所在行;

        #dd: 删除包括当前光标所在行在内的#行;

注:dd相当于剪切操作,如果你dd之后按p或者P可以进行粘贴。

7、替换字符

        r:替换单个字符(按完r在按你要替换的字符即可)

        R:替换多个字符(从你要替换的位置开始替换,直至你退出正常模式)

8、撤销编辑操作:u

        u:撤消前一次的编辑操作;

        #u:直接撤消最近#次编辑操作;

        温馨提示:连续u命令可撤消此前的n次编辑操作;

9、将另外一个文件(/path/sunhui.txt)的内容填充在当前文件夹中

:r   /path/sunhui.txt :填充到当前文件所在光标的后面

10、修改vim配置文件

        vim   ~/.vimrc:修改当前用户的vim配置文件

        vim    /etc/vimrc:修改所有用户的vim配置文件

        例:在当前用户的vim配置文件中添加显示行数的命令

        vim    ~/.vimrc:在末行添加 set nu 即可

11、拓展(末行模式)

    1)显示或取消显示行号

        :set    nu            //显示

        :set    number    //显示

        :set    nonu        //取消

    2)设置语法高亮

        :syntax    on    //开启

        :syntax    off    //关闭

    3)分屏

        :vsp xxx.x    //将两个文件垂直分屏

        :ctrl+w w   //切屏

13.画日百万pv缓存架构拓扑图

 14.什么是队列?你所知道的队列的实现方式有哪些?

1.基于链表来实现队列。2.使用linkedList来实现队列。3.使用两个栈来实现一个队列。


15.PHP的运行方式有哪些,区别是什么?

php一共分为五大运行模式:包括cgi 、fast-cgi、cli、isapi、apache 模块的 DLLCGI

16.还你所知道的php编码规范。以及你是如何管理备份源代码

 http://phpfig.p2hp.com/

17varcahar与char存储和速度上的区别,分引擎来描述

https://www.cnblogs.com/grefr/p/6088507.html

18查看mysql语句性能方式

https://www.cnblogs.com/xyzq/p/11581146.html

21inodb与myissam数据解构方面的区别

https://www.cnblogs.com/chenjiacheng/p/6628355.html

22列举你的使用过的分表方式,如果使用过 请说说你的使用场景

https://blog.csdn.net/winy_lm/article/details/50708493

23.mysql分区实现与分区合并

https://www.cnblogs.com/wujuntian/p/6403619.html

24.ab两个站点 表解构一样,a不能停服 b课停服,b如何迁移i数据合并到a

cannal

25.大表  不停服 表结构数据结构修改,列举工具与原理

http://www.freevpsweb.com/post-85.html

26.mycat使用

27. redis的单线程应用哨兵模式

https://www.cnblogs.com/ysocean/p/12290364.html

28. mysql的myisam与innodb的数据结构 索引数据结构

https://blog.csdn.net/qq_36520235/article/details/82871368
https://www.cnblogs.com/muuu520/p/12960389.html

29` 面向对象设计的五个基本原则

https://www.cnblogs.com/z00377750/p/9153615.html

30.(1) 依赖注入你怎么理解

https://www.cnblogs.com/alltime/p/6729295.html

30.(2)laravel 的ioc容器

https://blog.csdn.net/php12345679/article/details/102739791


31.写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处

https://www.detechn.com/amp/3735.html

32.linux 的内存分配和多线程原理

https://blog.csdn.net/wangcg123/article/details/52635632

33.两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的

https://www.cnblogs.com/guantou1992/p/9729465.html
https://blog.csdn.net/weixin_42193400/article/details/82149078


34.php常用设计模式实现

https://www.cnblogs.com/yuanwanli/p/8796402.html

35.mysql事务

https://www.cnblogs.com/snifferhu/p/4746030.html

36.mysql死锁处理

https://blog.csdn.net/noaman_wgs/article/details/82529908?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&dist_request_id=ae31b8a6-3b9e-4c6c-952e-845283f77eb6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control




1、请选择以下代码运行的结果: <?php if ('1e3' == '1000') echo 'LOL'; ?>

  A 无任何输出结果      B   LOL        C 不执行且报错

解析:1e3 是 科学计数法 实数的指数形式 为1乘以10的三次方,故‘1e3’=='1000'是成立的,输出echo ‘LOL’;

 

 

2、请选出以下代码运行的结果: <?php $a = "aabbzz"; $a++; echo $a; ?>

  A b            B aabbzz            C aabcaa

解析: 字符串字母相加其实就是在末尾字母加一 如:$a = "a"; $a++;答应结果就是 b,$a=''aa';结果就是ab 故$a = "aabb";打印结果就是 aabc ,如$a = "aabbz";结果就是 aabca,因为Z是末尾字母故加一变为a,向前一位进一,b就变为c,故结果为C;

3,写出一下程序的输出结果:<?php    

$data = ['a','b','c']; 

foreach($data as $k=>$v){

    $v = &$data[$k];

}

>

A $data = ['a','b','c'];            B $data = ['b','b','c'];             C $data = ['b','c','c']; 

解析:这里有个考点要记得 就是&是引用;修改引用变量的值,那么空间的值也会改变,第一次循环 得到$v=&$data[0]=>'a',第二次循环$v=&$data[1]=>'b',可见第一次引用的$data[0]的值已经被改变,所以此时的$data[0]=b,此时$v引用的$data[1],进入第三次循环 此时$v又变为 $v=&$data[2]=>'c',,$v又一次改变,引用的$data[1]的值也被改变为C,所以此时的$data[1]=c,这样循环结束 $data[0]=>'b', $data[1]=>'c', $data[2]=>'c',

    3,写出一下程序的输出结果:<?php $a= 0.1; $b = 0.7;if($a+$b ==0.8){ echo true; }else{ echo false; } >

    A 空;     B true;      C false;     D、1;  E、0;  F:报错

    解析:这里的考点有两个:1,echo false和true的值;2、浮点类型不能用于精确计算;首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有一定的损耗,故它无限接近于0.8,也就是0.79999999...,所以echo 应该是个false;echo false;结果是空;echo true;结果是1;

    4,用PHP写出显示客户端的IP和服务端的IP

    echo $_SERVER[‘REMOTE_ADDR’];//客户端IP

    echo gethostbyname(“www.baidu.com”)//服务端

    5,以下表达式的结果是:

$a= 0;

$b= 0;

if($a= 3>0 || $b= 3>0){

$a++;

$b++;

}

echo $a,$b;

A报错;    B:1,1;    (要是真的只有两个选项该多好肯定大家都选B)

解析:此题考查的是运算符的优先级问题,首先在此题中比较运算符>逻辑运算符>赋值,所以1,先看 3>0为true,2,因为是||运算所以后面的$b=3>0 形成短路作用,这时的$a=true,$b=0;

  故$a++;为1;$b++;为1这里解释下布尔类型运算不影响布尔类型结果;但是$b=0;$b++;就改变为1, echo true;结果为1,

6.PHP中如何优化多个if...esleif语句的情况
        解析:首先尽可能将表达式可能性越大的越往前面放,其次如果我们判断的内容比较复杂且 判断的值只是字符串,整型,浮点 那么就可以用switch...case来代替

7.

复制代码

val1= 5;
$val2 = 10;
function foo(&$my_val){
    global $val1;
    $val1+=2;//7
    $val2 =4;//4
    $my_val +=3;//8
    return $val2;//4
}
$my_val = 5;
echo foo($my_val)."\n";//4
echo $my_val;//8
echo $val1."\n".$val2;//7   10
$bar = 'foo';
$my_val =10;
echo $bar($my_val)."\n";//4s

复制代码

 

8.用正则 写出以139开头的手机号码

$str = '13812345678';
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$macth);
var_dump($macth);

 

9.用PHP方式对目录进行遍历
$dir = './test';

function loopDir($dir){
$handle = opendir($dir);
while(false !==($file =readdir($handle))){
if($file!='.'&&$file!='..'){
echo $file."<br>";
if(filetype($dir.'/'.$file)=='dir'){
loopDir($dir.'/'.$file);
}
}
}
}

loopDir($dir);
10请简单叙述 CGI fastCGI h和 PHP-FPM的区别
CGI 代表为了联系PHP 和websevae 的一个桥梁
fastCGI 是CGI的改良版
PHP-FPM 进程管理器
 

 

 

 

 

 

 

  

----------------------------------------------------------------------------------------------------------------------------------

1,冒泡排序很实用要记得

复制代码

function maopao($arr){
    $len = count($arr);
    $n = count($arr)-1;
    for($i=0;$i<$len;$i++){
        for($j=0;$j<$n;$j++){
            if($arr[$j]<$arr[$j+1]){
                $temp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] =$temp;
            }
        }
    }
    return $arr;
}

复制代码

2,快速排序

复制代码

function quick_sort($array) {

    if (count($array) <= 1) return $array;

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

        if ($array[$i] <= $key)

            $left_arr[] = $array[$i];

        else

            $right_arr[] = $array[$i];

    }

    $left_arr = quick_sort($left_arr);

    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

复制代码

3、请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。

    按引用传递则不需要复制值,对于性能提高很有好处。

4、MySQL数据库中的字段类型varchar和char的主要区别是什么?

   char和varchar最大的不同就是一个是固定长度,一个是可变长度.由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪.

   varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同.char最多可以存放255个字符,不同的编码最大可用字节数不同

5、对于大流量的网站,采用什么样的方法来解决访问量问题?

    1. 确认服务器硬件是否足够支持当前的流量
    2. 优化数据库访问。
    3. 禁止外部的盗链。
    4. 控制大文件的下载。
    5. 使用不同主机分流主要流量
    6. 使用流量分析统计软件
    7. 尽量使用静态页,缓存

6、什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

7、SESSION 与 COOKIE的区别是什么?

SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。禁用cookie后,session还可以使用,在存储session的文件中,生成sessionID,通过get传参的方式将sessionID传到要实现session共享的页面,读取sessionID,从而从session中获取数据。

8、对缓存技术的了解

    1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。 2、使用memcache可以做缓存。

  9、表单中get和post提交方式的区别?

    get是显式的,数据从url中可以看到,传输的数据量小,安全性低; post是隐式的,传送的数据量较大,安全性较高

  10、优化mysql数据库的方法

    1,数据表中的数据类型的优化  如选择合适的字段,选择效率快速的字段 

    2,索引优化

    3、SQL语句的优化

      (1)优化查询过程中的数据访问如使用limit、使用返回列不用*

      (2)优化长难句的查询语句 变复杂为简单、切分查询、分解关联查询

      (3)优化特定类型的查询语句如优化count()、优化关联查询、优化子查询、优化Group by、优化li'mit

    4、存储引擎的优化

      (1)尽量使用InnoDB存储引擎,因为它支持事务、外键、使用独立表空间、使用的是行级锁、

    5、数据表结构的设计优化

      (1)分区操作 如通过特定的策略对数据进行物理拆分、对用户透明的、partition by

      (2)分库分表  如水平拆分(以行级进行拆分)、垂直拆分(列及拆分)

    6、数据架构的优化

      (1)主从复制

      (2)读写分离

      (3)双主热备

      (4)负载均衡  通过LVS的三种模式实现的、Mycat数据库中间件实现的

  11、语句include和require的区别是什么?

    require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行

    include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去

  12、redis和memcacahe、mongoDB的区别?

    都是非关系型数据库,性能都非常高,但是mongoDB和memcache、redis是不同的两种类型。后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库。

    从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。

    从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。

  13、PHP的基本变量类型

    四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)

    两种复合类型:array (数组)、object (对象)

    最后是两种特殊类型:resource(资源)、NULL(NULL)

  14、静态化如何实现的?伪静态如何实现?

    1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。
      实现方式主要有两种:

        一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。

        一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

    2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智
  主要有两种方式:

      一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

      另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

  16、如何处理负载,高并发

1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

17、Mysql的读写分离?

读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。

18、说一下单引号双引号?

  单引号内部的变量不会执行, 双引号会执行

    单引号解析速度比双引号快。

    单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。

  19、PHP7的新特性?重点

标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

  返回值类型声明:增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

  NULL 合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

  use 加强:从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了

  匿名类:现在支持通过new class 来实例化一个匿名类

  20、PHP 数组排序

sort() - 以升序对数组排序

rsort() - 以降序对数组排序

asort() - 根据值,以升序对关联数组进行排序

ksort() - 根据键,以升序对关联数组进行排序

arsort() - 根据值,以降序对关联数组进行排序

krsort() - 根据键,以降序对关联数组进行排序

21、PHP支持多继承吗?

  不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。

22PHP如何实现多继承吗?

  可以使用 interface 或 trait 实现 。

    1.使用 interface 声明类不能被实例化,并且属性必须是常量,方法不能有方法体 

    2.trait 声明的类不能被实例化,由use引入,会覆盖父类的相同属性及方法,如果有多个use,那么按顺序下面的覆盖最上面的相同的属性及方法

  23、优化MYSQL数据库的方法

(1)选择最有效率的表名顺序

(2)WHERE子句中的连接顺序

(3)SELECT子句中避免使用‘*’

(4)用Where子句替换HAVING子句

(5)通过内部函数提高SQL效率

(6)避免在索引列上使用计算。

(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

(1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL

(2).使用连接(JOIN)来代替子查询(Sub-Queries)

(3).使用联合(UNION)来代替手动创建的临时表

(4).尽量少使用 LIKE 关键字和通配符

(5).使用事务和外键

  25、MySQL主从备份的原理?

  mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

26、error_reporting() 的作用?

  设置 PHP 的报错级别并返回当前级别。

  27、如何修改session的生存时间

在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间

代码实现 123

$lifeTime = 24 * 3600; // 保存一天

session_set_cookie_params($lifeTime);

session_start();

28、常见的 PHP 安全性攻击

SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止

使用mysql_real_escape_string()过滤数据

手动检查每一数据是否为正确的数据类型

使用预处理语句并绑定变量

参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。

XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。

CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的
防止:一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。有两点一定要记住:

对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。

生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。 如laravel中的 _token

代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。
防止代码注入

过滤用户输入

在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件

--------------------------------------------------------------------------------------------------------

1、__FILE__表示什么意思?

   文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

2、如何获取客户端的IP地址?

   1 $_SERVER[‘REMOTE_ADDR’]

3、写出使用header函数跳转页面的语句

   1 Header(‘location:index.php’);

4、$str是一段html文本,使用正则表达式去除其中的所有js脚本

    $pattern = ‘/<script.*>\.+<\/script>/’;

  Preg_replace($pattern,’’,$str);

5、mvc是什么?相互间有什么关系?

答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑

客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,再将获取到的数据通过视图显示出来

6、oop是什么?

答:oop是面向对象编程,面向对象编程是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。

1、封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。

2、继承性:就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类。

3、多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

1、易维护

采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。

2、质量高

在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。

3、效率高

在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。

4、易扩展

由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。

7、smarty是什么,有什么作用?

答:smarty是用php写出来的模板引擎,也是目前业界最著名的php模板引擎之一

它分离了逻辑代码和外在的显示,提供了一种易于管理和使用的方法,用来将混杂的php逻辑代码与html代码进行分离,我们公司使用的是TP框架,已经封装好了smarty模板,所以没有单独使用过。

8.TP的特性有哪些?

1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作

2.融合了smarty模板,使前后台分离

3.支持多种缓存技术,尤其对memcache技术支持非常好

4.命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应

5.支持多种url模式

6.内置ajax返回方法,包括xml,json,html等

7.支持应用扩展,类库扩展,驱动扩展等

9.请介绍一下laravel框架?

答: laravel框架的设计思想比较先进,非常适合应用各种开发模式,作为一个框架,它为你准备好了一切,composer是php的未来,没有composer,php肯定要走向没落

laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等

10.请简述一下数据库的优化?

答:数据库的优化可以从四个方面来优化:

1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离

2.从储存层: 采用合适的存储引擎,采用三范式

3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存

4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行

  

11.怎么保证促销商品不会超卖?

答:这个问题是我们当时开发时遇到的一个难点,超卖的原因主要是下的订单的数目和我们要促销的商品的数目不一致导致的,每次总是订单的数比我们的促销商品的数目要多,当时我们的小组讨论了好久,给出了好几个方案来实现:

第一种方案:在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单,更改库存量时加上一个条件,只更改商品库存大于0的商品的库存,当时我们使用ab进行压力测试,当并发超过500,访问量超过2000时,还是会出现超卖现象。所以被我们否定了。

第二种方案:使用mysql的事务加排他锁来解决,首先我们选择数据库的存储引擎为innoDB,使用的是排他锁实现的,刚开始的时候我们测试了下共享锁,发现还是会出现超卖的现象。有个问题是,当我们进行高并发测试时,对数据库的性能影响很大,导致数据库的压力很大,最终也被我们否定了。

第三种方案:使用文件锁实现。当用户抢到一件促销商品后先触发文件锁,防止其他用户进入,该用户抢到促销品后再解开文件锁,放其他用户进行操作。这样可以解决超卖的问题,但是会导致文件得I/O开销很大。

最后我们使用了redis的队列来实现。将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。这个操作起来很方便,而且效率极高,最终我们采取这种方式来实现

12.商城秒杀的实现?

答:抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:

1 高并发对数据库产生的压力

2 竞争状态下如何解决库存的正确减少("超卖"问题)

对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。第二个问题,我们可以使用redis队列来完成,把要秒杀的商品放入到队列中,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,文件锁和事务在高并发下性能下降很快,当然还要考虑其他方面的东西,比如抢购页面做成静态的,通过ajax调用接口,其中也可能会出现一个用户抢多次的情况,这时候需要再加上一个排队队列和抢购结果队列及库存队列。高并发情况下,将用户进入排队队列,用一个线程循环处理从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,库存减1,写数据库,将用户入结果队列。

22.购物车的原理?

答:购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的所有商品放在购物车中统一到付款台结账,这也是尽量让客户体验到现实生活中购物的感觉。服务器通过追踪每个用户的行动,以保证在结账时每件商品都物有其主。

主要涉及以下几点:

    1、把商品添加到购物车,即订购

    2、删除购物车中已定购的商品

    3、修改购物车中某一本图书的订购数量

    4、清空购物车

    5、显示购物车中商品清单及数量、价格

实现购物车的关键在于服务器识别每一个用户并维持与他们的联系。但是HTTP协议是一种“无状态(Stateless)”的协议,因而服务器不能记住是谁在购买商品,当把商品加入购物车时,服务器也不知道购物车里原先有些什么,使得用户在不同页面间跳转时购物车无法“随身携带”,这都给购物车的实现造成了一定的困难。

目前购物车的实现主要是通过cookie、session或结合数据库的方式。下面分析一下它们的机制及作用

$data = ['a','b','c'];foreach($data as $k=>$v){    $v = &$data[$k];}print_r($data);



GC

  • PHP 7 的内存回收原理?

    请详细描述ZendMM的工作原理

  • PHP 7 的垃圾回收和 PHP 5 有什么区别?

结构

  • PHP 7 中对zVal做了哪些修改?
  • PHP 7 中哪些变量类型在栈,哪些变量类型在堆?

    变量在栈会有什么优势?PHP 7是如何让变量新建在栈的?

  • 详细描述PHP中HashMap的结构是如何实现的?
  • 下面代码中,在PHP 7下, $a 和 $b、$c、$d 分别指向什么zVal结构?

    $d 被修改的时候,PHP 7 / PHP 5 的内部分别会有哪些操作?

    $a = 'string';
    $b = &$a;
    $c = &$b;
    $d = $b;
    $d = 'to';
  • JIT 是做了哪些优化,从而对PHP的速度有不少提升?

字符串操作

  • strtr 和 str_replace 有什么区别,两者分别用在什么场景下?

    strtr的程序是如何实现的?

  • 字符串在手册中介绍,「PHP可安全用于二进制对象」,比如:str_replace strpos str等函数下都有这句话,这句话怎么理解,为什么是操作二进制是安全的?
  • 字符串连接符.,在PHP内核中有哪些操作?

    多次.连接,是否会造成内存碎片过多?

多线程

  • PHP中创建多进程有哪些方式?

    互斥信号该如何实现?

  • Swoole服务端启动后有哪些进程,这些进程分别是完成什么工作?
  • 线上环境中,PHP进程偶尔会卡死(或者运行卡顿),请问如何检测本质问题?

管道

  • Laravel的中间件的顺序执行,是如何实现的?
  • 实现管道的makeFn函数

    function pipe($input, $list) {
        $fn = makeFn($list); 
        return $fn($input);
    }
    $r = pipe(0, [$a, $b, $c]);
    echo $r;
    
    //$a, $b, $c 类似于
    $a = function($input, $next) {
        $input++;
        $output = $next($input);
        return $output;
    };
    
    function makeFn($list){
        //请实现
    
    }
    

内存优化

Cli

  • 用PHP实现一个定时任务器,类似crontab,需要做到前一个任务不论运行时长、运行失败,都不能影响下一个任务的准点执行?

安全

  • PHP中密码加密,使用什么方式加密?

    这种加密的优点是什么?

  • RSA AES 加密的区别,分别用于什么场景下?

反射

  • 实现如下函数(PHP 7)

    echo a(1, 3); //4
    echo a(3)(5); //8
    echo a(1, 2)(3, 4, 5)(6); //21
  • 如何读取某函数的参数列表,以及参数的默认值。
  • 如何模拟Java的注解方法,比如识别如下代码中的路由
class Controller {
     /**
      * @Route("/", name="index")
      * @CheckRequest
      */
     public function index(Request $request){
         return 'result';
     }
}
  • 描述下IoC (DI)的实现原理?

算法

  • 目前有{} () [] <>四种配对符号,要求写一个算法检查类似{([()()]<()>)}是否配对(此字符串是正确的配对),

    比如{ ( [ () ( ] ) < ( ) > ) }即是不合规,因为其中(])的() 跨越了]

    这种符号配对算法常用于语法判断,比如IDE。(你需要回答的是上面的题目,下面只作为题目的解释),比如以下PHP代码中的括号不论如何嵌套,都必须保持配对的原则才能通过编译:
    if ($a) { 
        $user['posts'][  $user['id_list'][ User::get($request['token'])['id'] ]  ] = null;
    }
  • 生成2亿个优惠券码,长度在14位,有效字符是3456789ABCDEFGHJKMNPQRSTUVWXY,其中不含有印刷歧义的0 O 1 I L 2 Z。需要快速生成并设计一个结构能快速验证是否已经被使用
  • 写一个最长匹配的替换算法,比如字符串aabcabcabaa应该得到的结果是1345,最长匹配会这样分割:aabc abc ab aa

    替换对应关系如下

    ab => 4
    aa => 5
    aabc => 1
    abc => 3
  • 有一个文件,保存了20亿行的数字,每个数字长度在5-10之间,这些数字中有很多重复,设计一个算法在只有2核1G内存的电脑上对这些数字快速去重并保存?

数据库篇

  • 搭建MySQL分布式,有哪些方式?
  • MySQL主从同步,和主主同步有哪些区别,以及优劣势?
  • Laravel中,多态一对多,多态多对多,数据库要怎么设计?

    比如一个关键词表tags,需要关联用户、帖子、评论、视频等表。

  • 描述MySQL的注入原理,以及防止注入有哪些方式?
  • 怎么解决数据库中常见的 N+1 效率问题

    比如:

    $users = SELECT * FROM `users` WHERE `gender` = 'male';
    foreach ($users as &$user)
        $user['posts'] = SELECT * FROM `posts` WHERE `user_id` = $user['id'];
  • MySQL中脏读应该怎么处理?

    引申:比如京东的库存,0点多人抢购的时候库存问题?

  • 如下数据库中会有哪些值

    //请注意是多重嵌套事务
    START TRANSACTION;
      INSERT INTO `users` (`name`) VALUES('a');
      START TRANSACTION;
        INSERT INTO `users` (`name`) VALUES('b');
        START TRANSACTION;
          INSERT INTO `users` (`name`) VALUES('c');
        ROLLBACK;
      COMMIT;
    ROLLBACK;
  • MySQL行锁在什么情况下会退化为表锁?
  • 数据库不使用B+树,还可以使用什么数据结构?
  • 为什么MySQL使用B+树,而不是其它树,比如红黑树?
  • MySQL在什么时候会不使用索引?
  • Elasticsearch 如何实现类似SQL的 WHERE id = 12 AND gender IN ('male', 'unknow');
  • Elasticsearch 如何实现类似SQL的 GROUP BY nickname, gender
  • Redis 是如何保证执行的原子性的?
  • Redis有哪些数据结构,其中的bitmap, bloom filter用于什么场景?
  • Redis 在事务中如何做到:发现事务执行过程中数据被污染就回滚执行?




A:二分查找:O(log2(max(m,n)))

Q:有序数组,有2N+1个数,其中N个数成对出现,仅1个数单独出现,找出那个单独出现的数.,时间复杂度

1,1,2,2,3,4,4,5,5,6,6,7,7

答案为3

A: O(log2(2N))二分查找,查找中间位置的数相等值是在左边还是右边?左边则再左子数组继续查找,右边则在右子数组继续查找。

Q:100亿个数求top100,时间复杂度

A:分组查找或bitmap

Q:100亿个数和100亿个数求交集,时间复杂度

A: 全排列问题,自己找去

2、linux,操作系统

Q:Select/epoll,IO多路复用,底层数据结构,epoll的几个函数,两种模式

A: Select/epoll 问题,网上很多

Q:抢占式调度是什么回事

A: 进程优先级和时间分片等方面理解

Q:用户态和内核态

A: 系统态(内核态),操作系统在系统态运行——运行操作系统程序

用户态(也称为目态),应用程序只能在用户态运行——运行用户程序

3、mysql相关

Q:innodb和myisam区别(事务,索引,锁。。。)

A: 网上找

Q:B+树和B树区别,优缺点

A:B树每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针,顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针。

Q:B树和二叉查找树或者红黑色区别

A:基础数据结构问题

Q:聚簇索引什么特点,为什么这样,顺序查询的实现,回表查询,联合索引特性

A:

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因

Q:大表分页查询,10亿行数据,查找第N页数据,怎么优化

A: 根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询。

Q:悲观锁和乐观锁,mysql相关锁说一下

A:说下概念,其他网上找:

乐观锁( Optimistic Locking):对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候再进行加锁。

  悲观锁(Pessimistic Lock):悲观锁对数据加锁持有一种悲观的态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

Q:如何分库分表

A:

1)垂直分表

也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。一般是针对那种几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。

2)垂直分库

垂直分库针对的是一个系统中的不同业务进行拆分,比如用户User一个库,商品Producet一个库,订单Order一个库。切分后,要放在多个服务器上,提高性能。

3)水平分库分表

将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。

4、redis

Q:几种数据结构(list,set,zset,geohash,bitmap)实现原理

A:网上找

Q:pipline用来干嘛

A:pipeline的作用是将一批命令进行打包,然后发送给服务器,服务器执行完按顺序打包返回。

Q:事务

A: redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。 

Q:备份(aof/rdb)原理,哪些参数可调

A:RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命令后命令本身记录下来,所以RDB的备份文件是一个二进制文件,而AOF的备份文件是一个文本文件。至于调参,网上可找。

Q:网络模型

A:redis网络模型,网上找,需要理解。

Q:为什么单线程就能hold住几万qps

A:I/O复用,Reactor 设计模式

Q:热点key怎么处理

A:1、热key加载到系统内存中,直接从系统内存中取,而不走到redis层。

2、redis集群,热点备份分布到集群中,避免单台redis集中访问。

Q:一致性hash解决什么问题

A:redis集群和负载均衡

Q:redis集群(主从,高可用,扩展节点)

A:网上找

5、kafka相关

Q:消息是否按照时间有序,kafka分区的数据是否有序,如何保证有序

A:不保证按时间有序,主题在单个分区是有序的。

如何保证有序?kafka topic 只设置一个分区,或者producer将消息发送到指定分区

Q:Kafka为什么吞吐量高

A:

1)顺序读写

kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能,顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写。

2)零拷贝

利用Linux kernel"零拷贝(zero-copy)"系统调用机制,就是跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”。

3)分区

kafka中的topic中的内容可以被分为多分区存在,每个分区又分为多个段,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力。

4)批量发送

kafka允许进行批量发送消息,producter发送消息的时候,可以将消息缓存在本地,等到了固定条件发送到kafka

等消息条数到固定条数,一段时间发送一次。

5)数据压缩

Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩

压缩的好处就是减少传输的数据量,减轻对网络传输的压力

Q:kafka的存储模型

A:网上找。

Q:Kafka消费者多个group消费同一个topic,会重复消费吗?

A:不会。

6、算法和数据结构问题:

Q:hash算法实现(类似crc32或者murmur),保证随机性和均匀性,减少哈希冲突

A:考的是hash算法的了解,需要知道一些经典哈希算法实现。

7、动态规划相关

Q:100个球,一次只能拿2-5个,你先拿,我后拿,怎么保证你能拿到最后一个球

A:一次2-5,去掉先手,最后回合剩余7个即可保证拿到最后一个球。因此,先手拿2个,每一回合保证拿掉球的总数为7,即可。(100-2)/7=14回合。

Q:正整数数组,求和为sum的组合 换零钱,1,5,10元都很充足,给你N元去换零钱,多少种换法

A:算法题给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数,动态规划法。

Q:图的最短路径

A:网上找

8、项目问题

Q:遇到过内存溢出吗?怎么解决

A:主要了解有没有处理过内存泄漏导致的问题,C/C++定位内存泄漏问题;Golang和JAVA主要与GC的工作机制有关,堆内存一直增长,导致应用内存溢出等。

Q:布隆过滤器怎么设置m,n,k的值,怎么合理安排key(用户和item越来越多,怎么保证内存不会爆)

A:m,n,k 网上有实践经验,可参考。item越来越多的话,进行item的拆分,拆分本质是不要将 Hash(Key) 之后的请求分散在多个节点的多个小 bitmap 上,而是应该拆分成多个小 bitmap 之后,对一个 Key 的所有哈希函数都落在这一个小 bitmap 上。

Q:服务雪崩怎么处理,怎么解决保证不影响线上

A:限流,降级,熔断方面措施,结合后端系统架构阐述,如网关的限流和快速失败。

Q:redis和mysql数据一致性怎么保证

A:重点考虑业务逻辑上写和数据的流程(异常和错误处理等),结合MQ做异步重试处理。

Q:分布式锁应用场景,哪些坑

A:锁过期了,业务还没执行完;分布式锁,redis主从同步的坑;获取到锁后,线程异常。

使用chatGPT寻求答案
标签: 暂无标签

免责声明:

本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:master@freevpsweb.com

同类推荐
评论列表