玖叶教程网

前端编程开发入门

中级进阶架构面试题(中级程序员面试题)

题目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 "\n";

题目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;$i<count($arr);$i++){
        if($arr[$i]>0){
            $a[] = $arr[$i];
        }
    }
    for($i=0;$i<count($a);$i++){
        for($j=$i+1;$j<count($a);$j++){
            if($a[$j]<$a[$i]){
                $c = $a[$j];
                $a[$j]=$a[$i];
                $a[$i]=$c;
            }
        }
    }

    foreach($a as  $k=>$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\n";
}
}
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 如何实现的我们的延迟队列,使用sortedse
t拿时间戳作为scorekey调用zadd来生产消息,消费
者用zrangebyscore指令来获取n秒之前的,获取之
前的数据进行轮处理


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

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


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


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



题目39:什么是rabbitmq?

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


题目40:elasticsearch的调优手段

设计阶段
业务增量需求
使用别名
Fore_merge操作来释放空间,凌晨做的,因为它比较耗时
采用冷热分离的机制,
curator索引的生命周期
设置分词器
写入阶段
副本数设置为0
写入时候禁用我们的刷新机制
使用bulk批量写入
恢复副本数和刷新间隔
使用自动生成的id

查询阶段:
禁用wildcard
禁用terms
利用倒排索引机制
数据大时,先基于时间敲定索引再检索
设置合理的路由机制

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言