那些常问到的问题啰

1.apache或nginx,和php-fpm 再到php解析的过程,请描述一下。
答:我把web的响应流程说一下吧

    1.用户在浏览器上面输入一个网址:https://application.duoduofenqi.com/demo/login/
    首先浏览器会在本地浏览器找这个域名有没有缓存在浏览器本地的dns 
    2. 如果没有,就到本地的Host文件查找有没有一个ip和application.duoduofenqi.comd对应
    3. 如果没有,去这台机的网络运营商的dns服务器找有没有,如果还没有,继续向它的上级运营商
    dns服务器找,如果找到就返回找到成功的信息,没有找到就结束了,浏览器提示'无法访问此网站'
    4. 成功,则尝试与该ip的服务器进行通讯(tcp/ip协议中的三次握手,这里发生一大堆的事情)
    最后有握手成功,继续,不成功则结束请求
    5. 用户向该ip发起数据请求,服务器(apache/nginx/tomcat等,这里用nginx为例子)接收到请求
    ,nginx的fastcgi进程管理器根据文件后缀发给不同的模块去解析
    例如访问:https://application.duoduofenqi.com/info.php  
    nginx接收到info.php通过fastcgi进程管理器,通过它的子进程传递给php-fpm
    (通讯协议是cgi协议),php-fpm解析好数据返回给nginx,然后nginx返回html/js/css
    图片等资源给浏览器,然后浏览器经过渲染,把页面呈现给用户

2.nginx -> php-fpm的交互你认为有那几种交互模式

答:数据通讯方式通过tcp socket 或者 unix  socket 给fastcgi 的work进程把数据传给php-fpm 

3.fpm和cgi是怎么配合的

答:cgi是一种协议,fpm是解析器,就好比张三和李四打电话,cgi就是电话线,fpm是电话,两者缺一不可。
nginx和php-fmp之间的通讯需要有协议约定而这份协议就是cgi,php-fpm接收到fastcgi work进程
传过来的数据,经过zend引擎解析编译成机器可以识别的二进制数据,经过解析传回给php-fpm,再传给
nginx再传给浏览器,再渲染呈现给用户。(php-fpm可以粗暴地理解为解析cgi协议里面的内容)

4.array( 1 , 2 , 3 , 34 , 123 , 1, 2 , 3 , 4 )这样的数组,拿最小值,你认为最高效率的写法是?

答:用php提供的内部函数效率是最快的,
正序:sort($array)拿第一个下表的就是最小的,echo $array[0]
反序:rsort($array)拿第一个下表的就是最小大的,echo $array[0]
(ps:系统函数是直接c语言完成的,其他php代码实现的方法都是比不上系统函数的效率的)

5.数据库单列索引和组合索引的区别有哪些?加索引你会怎么选择。

答:mysql的索引主要是以二叉树的方式存储,单列索引有主键索引,唯一索引,普通索引。
    1.主键索引建立一般建立在自增长的id字段,保证数据在这张表的唯一性
    2.唯一索引一般用于确保表里面的字段的唯一性和查询速度添加的,例如:用户身份证,肯定是唯一的
    3.普通索引用于加速查询速度,数据可以是重复的
    4.组合索引(多列索引)主要用于多条件的查询,如:index(a,b,c)这样的组合索引,当where
    条件a,ab,ac,abc的时候都可以用到,缺点是where非a开头的无法走索引查询
    索引可以加速查询.但是会降低插入和修改的速度,所以:
    1.经常根据该字段查询的列建立相应的索引
    2.列里面的字段重复性比较低的,如果在性别列上加索引,并不会加速查询,反而会降低insert/edit的性能
    3.经常根据某种组合条件查询的建立联合索引

6.多列索引为什么需要遵从向左原则,从原理上。

答: 这个原理跟无限级分类有点相似,如果就如爷爷爸爸孙子三代人,没有了爷爷,就没有爸爸和孙子,
    建立了多列索引的字段,在数据插入的时候数据库就已经根据不同的索引规则生成了索引了
举个栗子:
    有一个index(uid,city,age) 这样的组合索引
    uid字段有1000W条,city有200条,age有120条记录
    能用到索引的是where条件排列是以下情况:
    index(uid,city,age),index(uid,city),index(uid,age),index(uid)
    其他情况不能用到,如:
    index(city),index(age),index(city,age)
    当查找uid是600W的city是珠海的,年龄是20岁的,数据库查找原理:
    第一次查找到uid600W的是放在500-1000W这边,然后再分(500-750W和751-1000W)_
    第二次查找到500-750W,然后再分(500-625W,625-750W)
    第三次查找到500-625W,然后再分(500-562W和563W-625W)
    第四次找到563W-625W,然后再分(563-594W和595-625W)
    第五次找到595W-625W,然后再分(595-610W和611-625W)
    第六次找到595W-610W,然后再分(595-602W和603-625W)
    第七次找到595W-602W,然后再分(595-598W和599-602W)
    第八次找到599W-602W,然后再分(599-600.5W和600.6-602W)
    第九次找到599W-600.5W,然后再分(599-600.5W和600.6-602W)
然后.....
复杂度次数是2的n次方次
例如找一个uid=40亿的这列数据,在有索引的情况下 2^32 = 4 294 967 296
只需要32次就能把它找出来,如果没有索引的话,300W的数据全表扫描数据库就超级慢了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值