PHP笔试面试

1、笔试:
1 )用三种方法获取数组的最后的一个元素。
     a)$value = array_pop($arr);
     b)$len = count($arr); $value = $arr[$len-1];
     c)$arr = array_reverse($arr); $value = array_shift($arr);
2)get和post的区别
  1. get传递的参数是直接附加在url上面的,很容易被他人获取并修改;而post传递的参数是放在报文中的,相对不易被获取并修改。
  2. 由于get的参数传递是依赖于url的,且url的长度是有限制,因此get参数不建议传输文本字段。而post的参数传递则不受此限制
  3. 用户名密码等保密信息通过get方法传递是非常危险的,它会直接展示在url上被他人获取,而post则更加安全
 
3)redis和memcached的区别?为什么单线程的redis比多线程的memcached效率高?
(1)区别:
  • redis 支持复杂的数据结构
  • redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。
  • redis 原生支持集群模式
  • 在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
  • 性能对比
  • 由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis,虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
(2)原因:
  • 纯内存操作
  • 核心是基于非阻塞的IO多路复用机制
  • 单线程反而避免了多线程的频繁上下文切换问题
 
 
4)session的工作原理?如何解决集群服务器的session问题?
  1. session是保存在服务端的,由于http是无状态协议,数据传输时服务端无法直接识别用户身份,而session就是解决这个问题的,他能帮助服务端保存记录特定用户信息。
  2. 将session保存在mysql或redis等存储数据库中。
 
5)用Linux的shell命令显示出正在监听80端口的进程
netstat -nat |grep “:80”
 
6)大数据量下如何优化MySQL?
 
第一优化你的sql和索引;
第二加缓存,memcached,redis;
第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;
第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;
第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;
第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;
 
 
7)mysql的脏读、幻读和不可重复读的解释和解决方法
脏读:一个事务会读进还没有被另一个事务提交的数据,所以你会看到一些最后被另一个事务回滚掉的数据。 RC隔离级别
不可重复读:一个事务读进一条记录,另一个事务更改了这条记录并提交完毕,这时候第一个事务再次读这条记录时,它已经改变了。RR隔离级别。
幻读:一个事务用Where子句来检索一个表的数据,另一个事务插入一条新的记录,并且符合Where条件,这样,第一个事务用同一个where条件来update数据或insert到符合where条件的数据,就会报错数据不一致的情况。select加锁。
7)微服务分布式事务的解决方案有哪些
8)服务器异常时,定位问题的步骤
 
2、面试:
1)MySQL分表后,如何连表查询,然后按时间排序?
1、union、union all,
2、定期汇总表
3、用elasticsearch
 
2)MySQL死锁问题具体处理步骤
(1)通过应用业务日志定位到问题代码,找到相应的事务对应的sql;
(2)确定数据库隔离级别。
  执行select @@global.tx_isolation,可以确定数据库的隔离级别,我们数据库的隔离级别是RC,这样可以很大概率排除gap锁造成死锁的嫌疑。
 
(3)找DBA执行下show InnoDB STATUS看看最近死锁的日志。

 这个步骤非常关键。通过DBA的帮忙,我们可以有更为详细的死锁信息。通过此详细日志一看就能发现,与之前事务相冲突的事务结构如下:

 
 
3)服务器某个php-fpm进程占CPU100%了,如何定位问题
posted @ 2019-07-19 14:08  cfYu  阅读(179)  评论(0编辑  收藏  举报