百度PHP面试经验 2019

今天面试了百度,唉,业务写太久了,太多基础东西没有答上来。算是一次宝贵的面试体验吧,周末好好充下电,下周继续去面试。废话不说,直接来问题。


1.http与https有哪些不同?简述https的工作原理。
这个东西公众号里经常推送,但是很少有人认真的来看吧。
简单来说,HTTP协议传输的数据都是为加密的,也就是文明的,因此使用HTTP协议传输隐私信息非常不安全。而HTTPS是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,传输数据是加密的,所以安全性得到了保障。
关于这个问题,强烈推荐这篇文章https://mp.weixin.qq.com/s/StqqafHePlBkWAPQZg3NrA ,截图取自文章。
百度PHP面试经验 2019

2.http各个状态码的含义。
这个的问题,我只粗略的答出了一个大概。
1xx 信息提示。(这个东西其实很少用,说明服务器收到了请求的初始部分,并且请客户端继续发送。这个状态码实际上是对如下场景的一种优化:客户端有一个较大的文件需要上传并保存,但是客户端不知道服务器是否愿意接受这个文件,所以希望在消耗网络资源进行传输之前,先询问一下服务器的意愿。)
2xx 成功。
3xx 重定向。
4xx 客户端错误。
5xx 服务器错误。
但是面试官要求更详尽一点的话,就答不出来了。关于一些common sense有没有必要记下来,可能每个人有自己不同的观点,姑且记一下吧。
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 被请求的资源已永久移动到新位置。
302 请求的资源现在临时从不同的 URI 响应请求。
400 1、语义有误,当前请求无法被服务器理解。2、请求参数有误。
401 当前请求需要用户验证。
403 服务器已经理解请求,但是拒绝执行它。
404 请求失败,请求所希望得到的资源未被在服务器上发现。
500 服务器遇到了一个未曾预料的状况,无法完成对请求的处理,会在程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。
3.http中GET和POST的区别。
其实我个人理解的GET和POST请求最根本的区别是语意上的区别。GET用来查询,POST用来增加。与之对应的还有PUT(修改)和DELETE(删除)方法。其实写过restful风格的API的话,很容易理解这种区别。
4.nginx如何与php进行通讯。
通过fastcgi方式进行交互。一般的nginx配置文件中我们会写上某个端口号,或者某个sock文件来表明通讯方式如下图所属:
百度PHP面试经验 2019
这就是nginx与php的沟通方式。
5.nginx的路由重写规则。
这个东西是真的没有研究过,真的熟知理解可能需要长时间的编写锻炼吧。找了一篇博客看了一下:https://www.cnblogs.com/wxl-dede/p/5135449.html
6.nginx负载均衡。
也没有遇到过,回来查到如下的配置。
这里的域名要和下面proxy_pass的一样
upstream test.com {
server 192.168.59.100:10001 weight=1;
server 192.168.59.100:10002 weight=2;
}

server {
listen 80;
server_name 192.168.59.100;

location / {
proxy_pass http://test.com;
proxy_redirect default;
}

error_page   500 502 503 504  /50x.html;  
location = /50x.html {  
    root   html;  
}  

}

7.如何排查nginx的错误。
列举一些nginx的常见错误吧,个人对整个nginx的架构实现了解确实有待提高的。
http://blog.51cto.com/nanchunle/1657410

8.mysql中where和having的区别。
where和having都可以使用的场景:
select price,name from goods where price > 100;
select price,name from goods having price > 100;
说明:having可用的前提是已经筛选出了price字段,在这种情况下和where的效果是等效的。但是如果没有select price 就会报错!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

只可以用where,不可以用having的情况
select name from goods where price> 100
select name from goods having price> 100 //报错!!!因为select没有筛选出price 字段,having不能用,而where是对表进行检索price。100
只可以用having,不可以用where情况
查询每种id 商品价格的平均值,获取平均价格大于100元的商品信息

select id, avg(price) as agprice from goods group by id having agprice > 100
select id, avg(price) as agprice from goods where agprice>100 group by id //报错!!因为from goods这表里面没有agprice这个字段

9.Mysql的聚簇索引和非聚簇索引的区别。
简单来说聚集索引叶子节点既有数据又有键值,非聚集索引的叶子节点指向的是数据的地址,没有存储数据。聚集索引因为是连续读,所以速度要比非聚集索引要快。

10.INNODB什么时候是行锁,什么情况下是表锁
INNODB默认行级锁。行级锁都是基于索引的
行级锁变为表级锁情况如下:
1、如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住。
2、表字段进行变更。
3、进行整表查询。(没使用索引)
4、like语句查询的时候。(没使用索引)

11.PHP有哪几个错误级别(终于到php了)
Deprecated 最低级别错误,程序继续执行 很少遇到
Notice 通知级别的错误,程序继续执行 如直接使用未定义变量
 Warning 警告级别的错误,可能得不到想要的结果 比如函数执行中遇到问题
 Fatal error 致命级别错误致命级别错误,程序不往下执行 如使用未定义函数
 Parse error 语法解析错误,最高级别错误,连其他错误信息也不呈现出来 语法错误
12.php如何实现cookie和session是如何让建立联系的(接下来问了几个语言细节)
生成:浏览器访问服务器时,服务器会生成session保存,同时将标示session的session_id传递给客户端浏览器,浏览器保存下来,即生成cookie;
使用:浏览器将cookie传递给服务器,服务器知道在session的hash表中,根据session_id的key值寻找session。
13.数组操作中,+与array_merge的区别
当下标为数值时,array_merge()不会覆盖掉原来的值,但array+array合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉。
当下标为字符时,array_merge()此时会覆盖掉前面相同键名的值,array+array仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉。
14.include和require的区别
老生常谈了,include函数:会将指定的文件读入并且执行里面的程序;require函数:会将目标文件的内容读入,并且把自己本身代换成这些读入的内容。
区别的话呢,我认为这两个是比较重要的。
1.include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行;
2.include()是有条件包含函数,而 require()则是无条件包含函数。
例如在下面的一个例子中,如果变量$somgthing为真,则将包含文件somefile:
if ($something) include("somefile");
但不管$something取何值,下面的代码将把文件somefile包含进文件里:
if ($something) require("somefile");
也就是说,require的执行优先级非常高。
15.PHP垃圾回收机制
以前从来没有看过相关的内容,所以一脸懵逼。回来后仔细看了一下,5.2之前PHP采用引用计数的基本方式进行垃圾回收,5.3之后算是对之前的算法进行了优化吧。具体关于GC的内容见http://www.php.net/manual/zh/features.gc.php 。
16.yaf和Yii进行一个简单的对比
只是使用过,并没有太多的了解。所以只答出了一个yaf轻量速度快,yii重插件多。
17.补充一个,mysql主从复制原理及可能会出现的问题
参考https://blog.csdn.net/helloxiaozhe/article/details/79548186 。
18.关于日志分析查询的,给出一定格式的访问日志,然后统计出访问次数最多的前几个ip
参考https://blog.csdn.net/keketrtr/article/details/78606237 。

还有几个小题目想不起来了。
总之呢,客观来讲这次面试的题目不难,偏基础和运维方向吧。平时用点心吧。

猜你喜欢

转载自blog.51cto.com/9443450/2350961