中级进阶架构面试题

题目1:如何判断一个字符串是否是合法的日期模式:2022-05-10 13:08:11,要求代码不超过5行。(酷讯)

/*思路:先把字符串转化为时间戳,再把时间戳转化为对应的日期,然后判断是不是和原来的字符串相等*/function test($data){   return $data?date("Y-m-d H:i:s",strtotime($data))==$data:false;}var_dump(test("2022-02-30 13:08:11"));

题目2:将1234567890转换成1,234,567,890每3位用逗号隔开的形式(百度)。

/* 思路:翻转字符 3位分割 098,765,432,1,再翻转回去1,234,567,890 */$str = "1234567890";function str($str){    //翻转字符    $str = strrev($str);    //分割字符    $str = chunk_split($str,3,',');        //再翻转回来    $str = strrev($str);    //去掉左侧    $str = ltrim($str,',');    return $str;}echo str($str);echo "
";

题目3:如何实现字符串翻转?

/* 思路:使用正则和数组实现 */$str = "今天天气真好666";function str_utf8($str){    return join("",array_reverse(preg_split("//u",$str)));}echo str_utf8($str);

题目4:一群猴子排成圈,按1,2,...,n依次编号,然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去,如此不停地进行下去,直到最后一只猴子为止,那只猴子就叫做大王,要求模拟此过程,输入m,n输出最后那个大王的编号。

function hou_king($n,$m){    //构造数组    for($i=1;$i<=$n;$i++){        $arr[] = $i;    }    $i = 0;//设置数组指针    while(count($arr)>1){//猴子数量大于1进行循环        //判断猴子是否出局,如果出局删除掉,没出局放到数组最后继续循环        if(($i+1)%$m==0){            unset($arr[$i]);        }else{            array_push($arr,$arr[$i]);//把值加入到数组末尾            unset($arr[$i]);        }        $i++;    }    return $arr;}var_dump(hou_king(3,2));

题目5:给定一组无序整数数组,找出其中未出现的最小整数,例如[1,2,3,5]输出4

/* 思路:把原来的数组去掉负数、重复数字,然后排序然后把数组下标+1跟值比较,找出第一个不同的,输出小标+1,输出最大值; */function findMax($arr=[]){    $arr = array_unique($arr);    $arr = array_merge($arr);    $a=[];    for($i=0;$i0){            $a[] = $arr[$i];        }    }    for($i=0;$i$v){        if($k+1 !==$v){            return $k+1;        }           }    return $a[count($a)-1]+1;}$result = findMax([1,2,3,5]);echo $result;

题目6:请写一段代码,确保多个进程同时写入一个文件成功(腾讯)

/*思路:加锁*/$file = fopen("./test.txt","w+");if(flock($file,LOCK_EX)){    //获得写锁,开始写数据    fwrite($file,"今天6668");    //解除锁定    flock($file,LOCK_UN);}else{    echo "file is locking";}fclose($file);

题目7:写一个函数,算出两个文件的相对路径,如$a=’a/b/c/d/e.php’;$b=’a/b/12/34/c.php’;

计算出$b相对于$a的相对路径是../../c/d(新浪)

/*写一个函数,算出两个文件的相对路径,如$a=’a/b/c/d/e.php’;$b=’a/b/12/34/c.php’;计算出$b相对于$a的相对路径是../../c/d(新浪)思路:计算路径里面相同的部分,然后用..替换先拆分路径,再比较*/function test($path1,$path2){    //拆分    $arr1 = explode('/',dirname($path1));    $arr2 = explode('/',dirname($path2));    //比较    for($i=0,$len=count($arr2);$i<$len;$i++){        if($arr1[$i] != $arr2[$i]){            break;        }    }        if($i<$len){            $path = array_fill(0,$len-$i,"..");        }        $path = array_merge($path,array_slice($arr1,$i));        return implode('/',$path);  }$a = 'a/b/c/d/e.php';$b = 'a/b/12/34/c.php';echo test($a,$b);

题目8:mysql中myisam与innodb的区别

myisam:不支持事物,支持表级锁,不支持mvcc,不支持外键,支持全文索引Innodb:支持事务,支持行级锁,支持MVCC,支持外键,不支持全文索引

题目9:innodb引擎的四大特征:

1、插入缓存,2.二次写 3自适应哈希索引 4预读

面试题10:使用selectcount(*)查询哪个引擎更快?

myisam更快,因为myisam内部维护了计数器,可以直接调用

题目11:innodb的事务如何通过日志实现的

预写日志方式:事物日志是通过redo和innodb的存储引擎日志缓存来实现;当开始一个事物的时候,会记录事务的lsn号;当事物执行的时候,会往innodb存储引擎的日志的日志缓存里面插入事物日志;当事务提交时,必须将存储引擎的日志缓存写入磁盘(innodb_flush_log_at_trx_commit控制),也就是写数据之前需要先写日志;

题目12:事物的隔离级别有哪些?

4种隔离级别,读未提交(RU)读已提交(RC)可重复读(RR)串行

题目13:mysql有多少种日志?

错误日志查询日志慢查询日志二进制日志中继日志事物日志、重做日志redo回滚日志undo

题目14:解释 内连接,左连接,右连接,全连接?

内连接:仅选出二张表中互相匹配的字段记录左连接:只要左边表中有数据,数据就能检索出来,而右边的数据必须在左表中有记录才能检索出来;右连接:只要左边表中有记录,数据就能检索出来...全连接:返回二个表中所有的记录;

题目15:如何设计或者配置mysql,才能达到高效使用的目的

数据库设计方面:字段、类型等系统架构方面:表散列、集群、读写分离高效sql语句,查询内容,连接代替子查询引擎选择事务、外键、索引

题目16:数据库设计时,常遇到的性能瓶颈有哪些,常用的解决方案?

瓶颈主要有:磁盘搜索优化 将数据分布在多个磁盘磁盘读写:优化从多个磁盘并行读写CPU周期优化扩冲内存内存宽带

题目17:描述一下,大流量高并发量网站的解决方案?

硬件方面使用缓存技术禁止外部盗链控制大文件下载集群统计每个页面流量消耗,针对优化分库分表,读写分离sphinx索引引擎

题目18:网站主要攻击方式有哪些?

命令注入eval注入客户端脚本攻击跨网站脚本攻击SQL注入跨网站请求伪造攻击session会话劫持session固定攻击http响应拆分攻击文件上传漏洞目录穿越漏洞远程文件包含攻击动态函数注入攻击URL攻击表单提交欺骗攻击HTTP请求欺骗攻击

题目19:什么是存储过程(mysql相关试题)?

存储过程是一些预编译的Sql语句;存储过程一个预编译的代码块,执行效率比较高,一个存储过程代替大量的T_SQL语句,可以降低网络通信量,提高通讯效率,在一定程度上确保数据安全;


题目20:索引是什么?有什么作用以及优缺点?

索引是对数据库表中一或多个列的值进行排序的结构,是帮助mysql高效获取数据的数据结构索引类型:普通索引,唯一索引,主键索引,全文索引


题目21:索引查询一定能提高查询性能吗?

索引的范围查询使用于二种情况基于一个范围索引,一般返回结果集小于表中记录30%,基于非唯一性的索引检索;


题目22:超键、候选键、主键、外键分别是什么?

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性集合在一起也可以作为超键。超键包含候选键和主键。候选键:是最小超键,即没有冗余元素的超键。主键:数据表数据列的唯一标识,不能缺失也不能为null外键:在一个表中存在另一个的主键称为外键。


题目23:什么是视图?以及视图的使用场景有哪些?

视频是一种虚拟的表,具有和物理表相同的功能;只暴露部分字段给访问者,所以就建立一个虚拟表 就是视图多个表结果放视图,不必考虑数据来源不同的表带来的差异


题目24:

说一说数据库三个范式第一范式:每一列都不可分割第二范式:要有主键,且实体属性完全依赖主键第三范式:消除依赖传递,第二范式的一个子集;一个关系表中,不能包含其他表中,包含的非主键信息,就是同一个信息只能在一个地方存储,不能出现在多个表中


题目25:设计模式六大原则

开放封闭原则里氏替换原则依赖倒置原则单一职责原则接口隔离原则迪米特法则

题目26:简述单例模式?


//单例模式//三私一公class Date{private static $date;private function __construct(){}private function __clone(){}public static function getInstance(){if(!(self::$date)){self::$date = new self();}return self::$date;}}$a = Date::getInstance();$b = Date::getInstance();$c = Date::getInstance();var_dump($a);var_dump($b);var_dump($c);



题目27:简述工厂设计模式?


//工厂设计模式interface people{public function say();}class man implements people{public function say(){echo "I am is a man
";}}class woman implements people{public function say(){echo "I am is woman";}}class factory{public static function createman(){return new man();}public static function createwomen(){return new woman();}}$man = factory::createman();$man->say();$women = factory::createwomen();$women->say();



题目28:观察者模式


/*观察者模式需求:有事情变化的时候通知观察者定义事件产生的接口*/abstract class getEvent{private $observer = [];//添加观察者public function addob($observer){$this->observer[] = $observer;}//通知观察者public function inform(){if(!empty($this->observer)){foreach($this->observer as $observer){$observer->update();}}}}//定义观察者接口interface obServer{public function update();}class obServer1 implements obServer{public function update(){echo "观察者1已经收到";}}class obServer2 implements obServer{public function update(){echo "观察者2已经收到";}}class event extends getEvent{//事件触发public function demo(){//通知观察者$this->inform();}}$a = new event();$a->addob(new obServer1());$a->addob(new obServer2());$a->demo();

题目29:简述适配器模式?


//db类的适配模式interface Db{//数据库连接public function connect($host,$user,$pass,$dbname);//查询public function query($sql);}class Mysql implements Db{protected $con;public function connect($host,$user,$pass,$dbname){$this->con = mysql_connect($host,$user,$pass,$dbname);mysql_select_db($dbname);return $this->con;}public function query($sql){$res = mysql_query($sql);return $res;}}class newPdo implements Db{protected $con;public function connect($host,$user,$pass,$dbname){$this->con = new Pdo("myql:host=$host;dbname = $dbname",$user,$pass);}public function query($sql){return $this->con->query($sql);}}


题目30:怎么在命令行中运行PHP程序?

注意1:cli 模式get post无法生效,不起作用(shell脚本)


题目31:什么是csrf攻击?如何防范?

csrf跨站请求伪造防范:对post请求增加token令牌

题目32:redis的应用场景有哪些?

会话缓存,全页缓存,队列,排行榜,计数器,发布,订阅,聊天系统


题目33:协程与线程的区别

进程有一个独立的地址空间有自己的堆操作系统以进程为单位,线程是进程实体,比进程更小,与同属一个进程的线程共享全部的资源,相对于进程不够稳定容易丢失数据,协程是一种用户态的轻量级线程,协成的调度是用户控制的,操作协程的时候是没有内核切换开销的进程包含线程,共享地址空间,进程有独立的地址空间:进程是资源分配和拥有的单位同一个进程的线程共享进程的资源,线程是处理器调度的基本单位但进程不是,二者都可以并发执行,协程和线程的比较,1、一个线程可以有多个协程,也可以单独拥有多个协程;2、线程和进程都是同步的,而协程可以异步的;3协程能保留上一个调用的状态


题目34:mysql里面有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

redis内存数据集大小上升到一定的时间,就会实行数据淘汰策略,volatile-lru设置过期时间的数据,挑选最近的最少的数据淘汰,volatile-ttl从设置的过期时间的数据,挑选将要过期的时间的数据淘汰Volatile-random设置过期时间的数据集中,任意选择数据淘汰,  allkeys-lru策略从数据集中最近最少的使用的数据淘汰allkeys-random从数据集中任意数据淘汰no-enviction禁止驱逐数据


题目35:假如redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将他们全部找出来?

使用key指令可以扫出指定模式的key列表,redis是单线程的,key指令会导致我们线程,使用scan指令


题目36:使用过redis做异步队列么?你是怎么用的?

一般是使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,适当使用sleep进行重置,可不可以不用sleep,blpop,  如果对方继续追问,使用的pub/sub订阅者模式1:n消息队列,可不可以生产一次消费多次?订阅者的缺点,消费者下线的情况下,生产的消息会丢失Redis 如何实现的我们的延迟队列,使用sortedset拿时间戳作为scorekey调用zadd来生产消息,消费者用zrangebyscore指令来获取n秒之前的,获取之前的数据进行轮处理


题目37:linux怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户id?查看指定帮助用什么命令?

清屏:clear退出当前命令:ctrl+c执行睡眠:ctrl+z查看用户id:查看指定帮助 adduser --helpman adduserInfo adduser


题目38:linux中进程有哪几种状态?在ps显示出来的信息中,分别用什么符号表示的?


不可中断状态 D暂停状态/跟踪状态就绪状态正在运行状态或者队列中的进程 R可中断睡眠状态僵尸状态 Z退出状态休眠状态:SW:进行内存交换X:死掉的进程T:停止或者被跟踪



题目39:什么是rabbitmq?

采用了amqp高级消息队列协议在分布式系统下具备异步削峰,负载均衡等一系列高级功能拥有持久化机制,进程消息,队列中的信息也可以保持下来,实现了消费者和生产者之间的解耦,对于高并发场景下,采用了消息队列可以使用使得同步访问变为串行访问,达到一定量的限流效果,利于数据库操作,可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单


题目40:elasticsearch的调优手段

设计阶段业务增量需求使用别名Fore_merge操作来释放空间,凌晨做的,因为它比较耗时采用冷热分离的机制,curator索引的生命周期设置分词器写入阶段副本数设置为0写入时候禁用我们的刷新机制使用bulk批量写入恢复副本数和刷新间隔使用自动生成的id查询阶段:禁用wildcard禁用terms利用倒排索引机制数据大时,先基于时间敲定索引再检索设置合理的路由机制
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章