中級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;
    }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章