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