中级PHP面试题汇总

一:Redis

1.五种数据类型:
            ①字符串 String(string 类型是二进制安全的,string 类型的值最大能存储 512MB。)
            ②散列   Hash(是一个键值(key => value)对集合,hash 特别适合用于存储对象。)
            ③列表   List(字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)|场景:1、最新消息排行功能(朋友圈时间线) 2、消息队列)
            ④无序集合 Set(为集合提供了求交集、并集、差集等操作。|场景:1、共同好友 2、利用唯一性,统计访问网站的所有独立ip)
            ⑤有序集合 Zset(数据插入集合时,已经进行天然排序。|场景:1、排行榜 2、带权重的消息队列)  

2.Redis常用操作:
        ①Connection客户端
          $redis = new Redis();
          $redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1秒放弃链接
          $redis->auth('password');//登录验证密码,返回【true | false】
          $redis->select(0);//选择redis库,0~15 共16个库
          $redis->close();//释放资源
              
        ②string 字符串
          $redis->strlen('key');//获取当前key的长度
          $redis->incr('key');//自增1
          $redis->incrby('key',$num);//自增$num,不存在为赋值,值需为整数[new_num | false]
          $redis->decr('key');//自减1,[new_num | false]
          $redis->decrby('key',$num);//自减$num,[ new_num | false]    
          $redis->set('key',1);//设置key=aa value=1 [true]
          $redis->mset($arr);//设置一个或多个键值[true]
          $redis->get('key');//获取key [value]
          $redis->mget($arr);//(string|arr),返回所查询键的值

        ③List 列表
          $redis->lpush('key','value');//增,只能将一个值value插入到列表key的表头,不存在就创建 
          $redis->rpush('key','value');//增,只能将一个值value插入到列表key的表尾 ,不存在就创建 
          $redis->lpushx('key','value');//增,只能将一个值value插入到列表key的表头,不存在不创建 
          $redis->rpushx('key','value');//增,只能将一个值value插入到列表key的表尾,不存在不创建 
          $redis->lpop('key');//删,移除并返回列表key的头元素
          $redis->rpop('key');//删,移除并返回列表key的尾元素

        ④Hash 哈希
          $redis->hset('key','field','value');//增,改,将哈希表key中的域field的值设为value,不存在创建,存在就覆盖【1 | 0】
          $redis->hget('key','field');//查,取值【value|false】
          $arr = array('one'=>1,2,3);$arr2 = array('one',0,1);
          $redis->hmset('key',$arr);//增,改,设置多值$arr为(索引|关联)数组,$arr[key]=field, [ true ]
          $redis->hmget('key',$arr2);//查,获取指定下标的field,[$arr | false]
          $redis->hgetall('key');//查,返回哈希表key中的所有域和值。[当key不存在时,返回一个空表]
          $redis->hkeys('key');//查,返回哈希表key中的所有域。[当key不存在时,返回一个空表]
          $redis->hvals('key');//查,返回哈希表key中的所有值。[当key不存在时,返回一个空表]
          $redis->hdel('key',$arr2);//删,删除指定下标的field,不存在的域将被忽略,[num | false]

        ⑤Set 有序集合
          $redis->sadd('key','value1','value2','valuen');//增,改,将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。
          $redis->srem('key','value1','value2','valuen');//删,移除集合key中的一个或多个member元素
          $redis->smembers('key');//查,返回集合key中的所有成员
          $redis->sinter('key1','key2','keyn');//查,返回所有给定集合的交集
          $redis->sunion('key1','key2','keyn');//查,返回所有给定集合的并集

         ⑥Zset 无序集合
                $redis->zAdd('key',$score1,$member1,$scoreN,$memberN);//增,改,将一个或多个member元素及其score值加入到有序集key当中
          $redis->zrem('key','member1','membern');//删,移除有序集key中的一个或多个成员,不存在的成员将被忽略。
          $redis->zscore('key','member');//查,通过值反拿权 
          $redis->zrange('key',$start,$stop);//查,通过(score从小到大)【排序名次范围】拿member值,返回有序集key中【指定区间内】的成员 
          $redis->zrank('key','member');//查,通过member值查(score从小到大)排名结果中的【member排序名次】
          $redis->zrevrank('key','member');//查,通过member值查(score从大到小)排名结果中的【member排序名次】
          $redis->ZINTERSTORE();//交集
          $redis->ZUNIONSTORE();//差集


二:MySQL索引及优化

1.索引类型:
        普通索引
        唯一索引(索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一)
        主键索引(一个表只能有一个主键,不允许有空值)
        组合索引(指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合)

2.索引优势/劣势:
        优势:①提高数据的检索速度
                   ②降低数据排序的成本,降低CPU消耗(因为先将数据排好序,若该字段正好需要排序,则真好降低了排序的成本)
        劣势:①占用存储空间:索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。 
                  ②降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而减低的更新速度。
                    
3.哪些情况需要建索引:
        ①主键,唯一索引        
        ②经常用作查询条件的字段需要创建索引
        ③经常需要排序、分组和统计的字段需要建立索引        
        ④查询中与其他表关联的字段,外键关系建立索引

4.哪些情况不要建索引:
        ①表的记录太少,百万级以下的数据不需要创建索引
        ②经常增删改的表不需要创建索引
        ③数据重复且分布平均的字段不需要创建索引,如 true,false 之类。
        ④频发更新的字段不适合创建索引
        ⑤where条件里用不到的字段不需要创建索引

5.MySql四种存储引擎:
        ①MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快
        ②InnoDB存储引擎:提供了具有提交、回滚和崩溃恢复能力的事务安全。特点支持自动增长列,支持外键约束
        ③MEMORY存储引擎:Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。 
        ④MERGE存储引擎:Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同

三:thinkphp queue消息队列

1.优势/劣势:   
        优势:①Queue内置了 Redis,Database,Topthink ,Sync四种驱动
                   ②Queue消息队列适用于大并发或者返回结果 时间有点长并需要批量操作的第三方接口,可用于短信发送、邮件发送、APP推送
                   ③Queue消息消息可进行发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等操作
        劣势:① 一旦需处理数据加入到任务内就不能删除


2.操作方法:
                   //$job->delete();   删除任务
                   //$job->attempts();  查看任务执行次数
                   // 注意:执行完任务后必须删除任务

四:跨域

1.什么是跨域:
       指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

2.如何解决跨域:
       ①JSONP:JSONP只支持GET请求,不支持POST请求。
       ②PHP端修改header(XHR2方式)
           header('Access-Control-Allow-Origin:*');  //允许所有来源访问
      header('Access-Control-Allow-Method:POST,GET');  //允许访问的方式
        ③代理


五:HTTP协议钟状态码含义
 201 已创建            301 永久移动           400  错误请求     500 服务器内部错误
 202 已接受            302 临时移动           401 未授权          501 不支持的请求
 203  非授权信息    303 查看其它地址    403 禁止             502 错误网关
 204 无内容            304未修改                404未找到          503服务器不可用
 205 重置类容        305 使用代理            405 方法禁用     504 网关超时
 206 部分处理        306临时重定向         406  不接受        505 HTTP不支持

六:php排序算法

参考:https://www.cnblogs.com/aiweixiao/p/8202360.html

七:二分法查询

方法一:

// 递归调用实现二分法查找
//$search 函数 $array为数组,$K为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值
//intval返回整数值*/
 
function search($array,$k,$low=0,$high=0){
    //判断数组元素的数量
    if(count($array)!=0 and $high==0){      //判断是否为第一次调用
        //数组的元素个数
        $high = count($array);
    }
    if($low <= $high){      //如果还存在剩余的数组元素
        $mid = intval(($low+$high)/2);      //取$low 与$high的中间值
        if($array[$mid] == $k){
            return $mid;    //如果找到则返回
        }elseif($k < $array[$mid]){
            //如果上面没有找到,则继续查找
            return search($array,$k,$low,$mid-1);
        }else{
            return search($array,$k,$mid+1,$high);
        }
    }
    return "没有要查找的值";
}
$array = array(3,4,5,7,8,9,10);
echo search($array,4);


方法二:

/*
    //while循环实现二分法查找
*/
$arr = array(2,4,5,6,7,8,9,10);
$low = 0;   //要查找范围的最小键值
$search = 6;
//计算出数组的长度
$high = count($arr)-1;
while($low <= $high){
    //取得数组的中间键值
    $mid = intval(($low+$high)/2);
    if($arr[$mid]==$search){
        //如果取出中间的下标值跟你要搜索的值相等的话,直接去除值得下标就行
        echo "你要查找的值在数组内的下标为".$mid; break;
    }elseif($arr[$mid] > $search){
        $high = $mid -1;
    }else{
        $high = $mid+1;
    }
}
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值