您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關PHP高級面試題,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
其實最近還在職,不過處于辭職交接狀態,就掛了簡歷,但是沒投。看到有邀約的,就和自己高度匹配的幾家面試了,陸續拿到了幾個offer。回憶一波面試題。按照類別來分了,因為有些也忘了是那次面試的,列的都是印象比較深刻的題目,有些忘了。如果回答錯了,歡迎糾正補充。
1.談談你在寫sql語句需要注意有哪些點?
答:
1、select * 問題,客戶端需要什么,就給什么,不要給多余的字段,這種情況可能還會導致本來可以走覆蓋索引的語句不能走覆蓋索引。
2、不要在查詢語句字段上做函數運算,這樣會讓索引失效。
3、一定要避免mysql自動類型轉換,比如 where ‘9’ =9。
4、能不設置允許 null 的字段盡量不要設置,因為 null 會導致 mysql 多一層判斷。
5、使用 like 的時候如果是通配符%
在最前面的話也會走的全表掃描。
歡迎補充。
2.你剛才一直在提索引,把你知道的關于索引的一些技巧說下
答:
1、要在區分度高的字段上建立索引,否則索引意義不大。
2、字符串建立索引要注意大小,索引長度過長,占用的空間也就越大,適當的可以截取進行索引,缺點是不能使用到覆蓋索引,具體根據業務合理安排。
3、建立聯合索引要知道最左前綴原則,舉個例子( name, email, phone ),最終能走這個聯合索引的一定只會是 ( name ),( name, email ),( name, email, phone ),其他只能走全表,需要根據業務合理設置聯合索引的順序。
3.索引底層是什么數據結構?
答:B+樹。
4.為什么用的是B+樹,不能使用紅黑樹或者其他的?
答:可以使用紅黑樹。但是這樣的話可能會造成樹的高度過高,意味著相同查詢下,會進行更多的磁盤I/O,影響性能,而 B+ 樹可以保持樹的高度不至于過高。這道題答得不是很好,不僅僅是這樣,歡迎補充。
5.你知道索引下推嗎?
本質上是對普通索引需要回表的一種優化,也就是引擎層在對索引指針遍歷的過程中,先做一些優先的判斷,過濾掉不符合條件的,可以減少磁盤IO。
6.假設現在有人操作數據庫,不小心執行錯了語句,誤刪除了很多數據,這時候能恢復嗎?咋么恢復。
答:首先,一定要開啟 bin-log ,如果沒有開啟的話,可能就恢復不了。要看具體的文件系統是否能恢復。開啟了 bin-log ,類型設置要設置成 row 或者 mixed ,不能設置 statement 。然后,如果是誤刪行的話,就可以把里面對應的刪除事件換成插入事件,在備用庫上執行。如果是誤刪表的話,可以先獲取最近的一次全量備份,放到備庫,然后拿出 bin-log , 除了不執行刪除的事件,其他事件依次重放。
7.為什么不能設置成 statement ?
答:設置成 statement ,實際 bin-log 存儲的是 sql 語句( 非具體刪除的主鍵id ),這樣如果是主從架構的話,主和從可能因為選擇的索引不一樣而導致主從不一致。
8.你剛才說到主從,那你說說主從運行的機制吧
答:首先主庫還是要開啟 bin-log , 從庫先設置要連接的主庫 change master…… 然后執行 start slave,這時候從庫會創建兩個線程,一個 io_thread ,主要負責連接主數據庫。一個sql_thread 主要是負責執行中轉日志語句。首先,主庫接收到從庫的同步請求,根據傳遞的 bin-log 文件名和開始同步的位置,發送二進制文件給從庫,從庫 io_thread 負責把接收到的數據放入到中轉日志,然后 sql_thread 負責從中轉日志讀取解析執行,執行完成,更新同步的位置標志。
9.你知道主從延遲嗎?有些時候延遲的時間還會很長。遇到這種情況咋么辦?
答:這種問題,注意了。劃重點。問你出現問題,尋找解決方案的時候,一定要對癥下藥,也就是說這個問題你可以這樣考慮,什么情況下導致的主從延遲。
1、如果主庫和從庫服務器配置不一樣,從庫的差點,那么就可能導致延遲時間加長。這時候,換成相同的服務器配置服務器即可。
2、從庫壓力太大了。一般主從了,從庫基本用來查詢,比如可能運營或者開發者自己都在從庫上進行一系列的 sql 操作。那簡單唄。多配幾個從庫,分攤壓力,一主多從。
3、大事務。比如 delete 這種語句 不 limit 限制一下,如果數據量過大,導致主庫運行時都花費了長時間,再同步到從庫,這個時間間隔過長。
設計模式
你知道哪些設計模式,你平常有使用到嗎?可以結合你的業務場景說下嗎?
答 這里我先舉例平常使用 Laravel,里面就用到大量設計模式,比如門面,組合,裝飾,觀察者…… 具體場景帶入,然后根據之前業務上的場景說了下……., 最后也說了設計模式不是銀彈,只有在合適的場景使用合適的模式才能體現它的價值。
手寫算法
給定一個已排序的數組和一個指定值,返回指定值在數組中的下標位置,如果不存在,返回把給定值插入到數組之后的下標位置。注意時間復雜度。
比如給定有序數組 [1,3,5,6] 給定值5.那么返回下標2.
給定有序數組[1,3,5,6] 給定值 7,返回下標4.
答:
function searchInsert($nums, $target) { if (!count($nums)) return 0; $l=0; $r = count($nums)-1; while ($l <= $r){ $middle = $l + (($r - $l) >> 1); if ($nums[$middle] == $target) return $middle; if ($nums[$middle] < $target){ $l = $middle+1; }else{ $r = $middle-1; } } return $l; }
典型的可以使用二分,時間復雜度 O(log2n)。空間復雜度O(1)。
網絡
1.傳輸層主要有哪些協議?
答:主要有 TCP 和 UDP 協議。他們的區別是 TCP 是需要連接的 會經過三次握手,而且可以保證消息的可靠性。UDP 是不需要連接的,不保證消息的可靠性。
2.你能大體說說 TCP 的三次握手嗎?
答:首先服務器監聽某個端口,客戶端發起請求 攜帶syn數據包(第一次),服務端接收到這個數據包,返回 syn/ack 的數據包給客戶端(第二次),最后客戶端再次發送一個 ack 的數據包(第三次)。
4.為什么需要三次握手?
答:主要是為了確認雙方接收是否正常。
第一次:客戶端什么都不能確認。服務端能確認客戶端的發送正常,自己的接收正常
第二次:客戶端能確認自己的發送和接收正常,服務端的發送和接收正常。服務端能確認自己接收正常,客戶端的發送正常。
第三次:全部都能確認了。
并發
假設現在有多個入口可以同時使用一個賬戶操作,這個賬戶只有十塊錢,有哪些方法可以使得不超扣消費?開放性題目,只要能解決問題的就是好方案,沒有唯一答案。
答:mysql:可以直接 where amount>=current_amount and amount>0 …… , 或者悲觀鎖 for update。redis:lua 腳本。php 層面可以利用文件鎖,還可以使用隊列的特性,只有一個消費的出口。
設計
如果我們公司有很多項目都有登錄的功能,咋么設計?
答:需要把這個登錄單獨抽出來作為一個模塊開發,類似于登錄中心,所有的其他子系統登錄都需要從這個系統中認證。
其他
1.看你項目里說到使用過swoole,也寫點go,你可以說說他們協程上的區別嗎?
答:設計上他們是一樣的,主要區別在于,協程調度器模式。swoole 的協程調度器是單線程,go 的協程調度器是多線程。這就意味著,同一時刻 swoole 只有一個協程在運行,而 go 同一時刻可以多個協程在運行。所以在 swoole 協程中不需要對全局變量進行加鎖。而且 swoole 本質是單線程多進程的,意味著它沒有超全局的變量,僅僅是進程級別變量。而 go 多線程,多線程必然會存在臨界變量鎖的問題。當然,go 也提供了開箱即用的 sync 讀寫鎖,或者你也可以直接使用通道來代替。
2.你可以說說 go 的 gmp 調度模型嗎?
答:巴拉巴拉半天,自己都覺得沒說清楚,好吧,我不是很了解。此時猜測面試官心里,早說不知道不就完事了嗎
3.說說你們這個項目最難的點是哪個地方,你是咋么解決的?
那就要看你自己對項目的掌握程度以及這個項目的含金量了。
以上就是PHP高級面試題,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。