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