2018年最新PHP面試題(二)

面試之前多看看公司的資料,可以看出面試的公司主要做什么,電商,數(shù)據(jù)庫(kù),php函數(shù),sql的優(yōu)化,接口,session和cookie等經(jīng)常會(huì)問(wèn)到,都是必問(wèn)之題,這其中有一部分題目摘抄自網(wǎng)絡(luò),個(gè)人感覺(jué)回答的也不錯(cuò)

36.redis如何防止高并發(fā)?

????????答:其實(shí)redis是不會(huì)存在并發(fā)問(wèn)題的,因?yàn)樗菃芜M(jìn)程的,再多的命令都是一個(gè)接一個(gè)地執(zhí)行的。我們使用的時(shí)候,可能會(huì)出現(xiàn)并發(fā)問(wèn)題,比如獲得和設(shè)定這一對(duì)。Redis的為什么 有高并發(fā)問(wèn)題?Redis的的出身決定?

Redis是一種單線程機(jī)制的nosql數(shù)據(jù)庫(kù),基于key-value,數(shù)據(jù)可持久化落盤。由于單線程所以redis本身并沒(méi)有鎖的概念,多個(gè)客戶端連接并不存在競(jìng)爭(zhēng)關(guān)系,但是利用jedis等客戶端對(duì)redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)出現(xiàn)問(wèn)題。發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問(wèn)題,這些問(wèn)題均是由于客戶端連接混亂造成。

同時(shí),單線程的天性決定,高并發(fā)對(duì)同一個(gè)鍵的操作會(huì)排隊(duì)處理,如果并發(fā)量很大,可能造成后來(lái)的請(qǐng)求超時(shí)。

在遠(yuǎn)程訪問(wèn)redis的時(shí)候,因?yàn)榫W(wǎng)絡(luò)等原因造成高并發(fā)訪問(wèn)延遲返回的問(wèn)題。

解決辦法

在客戶端將連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫Redis操作采用內(nèi)部鎖synchronized。

服務(wù)器角度,利用setnx變向?qū)崿F(xiàn)鎖機(jī)制。

37.秒殺當(dāng)中的細(xì)節(jié)你是怎么得出來(lái)的?

???????答:通過(guò)性能測(cè)試及模擬秒殺場(chǎng)景。每個(gè)問(wèn)題都經(jīng)過(guò)反復(fù)測(cè)試,不斷的發(fā)現(xiàn)問(wèn)題,不斷的解決。

38.做秒殺用什么數(shù)據(jù)庫(kù),怎么實(shí)現(xiàn)的?

????????答:因?yàn)槊霘⒌囊凰查g,并發(fā)非常大,如果同時(shí)請(qǐng)求數(shù)據(jù)庫(kù),會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的壓力非常大,導(dǎo)致數(shù)據(jù)庫(kù)的性能急劇下降,更嚴(yán)重的可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器宕機(jī)。這時(shí)候一般采用內(nèi)存高速緩存數(shù)據(jù)庫(kù)redis來(lái)實(shí)現(xiàn)的,redis是非關(guān)系型數(shù)據(jù)庫(kù),redis是單線程的,通過(guò)redis的隊(duì)列可以完成秒殺過(guò)程。

39.支付寶流程怎么實(shí)現(xiàn)的?

????????答:首先要有一個(gè)支付寶賬號(hào),接下來(lái)向支付寶申請(qǐng)?jiān)诰€支付業(yè)務(wù),簽署協(xié)議。協(xié)議生效后有支付寶一方會(huì)給網(wǎng)站方一個(gè)合作伙伴ID,和安全校驗(yàn)碼,有了這兩樣?xùn)|西就可以按照支付寶接口文檔開發(fā)支付寶接口了,中間主要涉及到一個(gè)安全問(wèn)題。整個(gè)流程是這樣的:我們的網(wǎng)站通過(guò)post傳遞相應(yīng)的參數(shù)(如訂單總金額,訂單號(hào))到支付頁(yè)面,支付頁(yè)面把一系列的參數(shù)經(jīng)過(guò)處理,以post的方式提交給支付寶服務(wù)器,支付寶服務(wù)器進(jìn)行驗(yàn)證,并對(duì)接收的數(shù)據(jù)進(jìn)行處理,把處理后的結(jié)果返回給我們網(wǎng)站設(shè)置的異步和同步回調(diào)地址,通過(guò)相應(yīng)的返回參數(shù),來(lái)處理相應(yīng)的業(yè)務(wù)邏輯,比如返回的參數(shù)代表支付成功,更改訂單狀態(tài)。

40.什么是單點(diǎn)登錄?

???????答:單點(diǎn)登錄SSO(Single Sign On)說(shuō)得簡(jiǎn)單點(diǎn)就是在一個(gè)多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。

41.什么情況下使用緩存?

????????答:當(dāng)用戶第一次訪問(wèn)應(yīng)用系統(tǒng)的時(shí)候,因?yàn)檫€沒(méi)有登錄,會(huì)被引導(dǎo)到認(rèn)證系統(tǒng)中進(jìn)行登錄;根據(jù)用戶提供的登錄信息,認(rèn)證系統(tǒng)進(jìn)行身份校驗(yàn),如果通過(guò)校驗(yàn),應(yīng)該返回給用戶一個(gè)認(rèn)證的憑據(jù)--ticket;用戶再訪問(wèn)別的應(yīng)用的時(shí)候,就會(huì)將這個(gè)ticket帶上,作為自己認(rèn)證的憑據(jù),應(yīng)用系統(tǒng)接受到請(qǐng)求之后會(huì)把 ticket送到認(rèn)證系統(tǒng)進(jìn)行校驗(yàn),檢查ticket的合法性。如果通過(guò)校驗(yàn),用戶就可以在不用再次登錄的情況下訪問(wèn)應(yīng)用系統(tǒng)2和應(yīng)用系統(tǒng)3了。

實(shí)現(xiàn)主要技術(shù)點(diǎn):

? ? 1、兩個(gè)站點(diǎn)共用一個(gè)數(shù)據(jù)驗(yàn)證系統(tǒng)

? ? 2、主要通過(guò)跨域請(qǐng)求的方式來(lái)實(shí)現(xiàn)驗(yàn)證及session處理。

42.怎么實(shí)現(xiàn)第三方登陸?

????????答:第三方登陸主要是基于author協(xié)議來(lái)實(shí)現(xiàn),下面簡(jiǎn)單說(shuō)下實(shí)現(xiàn)流程:

1、首先我們需要以開發(fā)者的身份向第三方登陸平臺(tái)申請(qǐng)接入應(yīng)用,申請(qǐng)成功后,我們會(huì)獲得一個(gè)appID和一個(gè)secrectID.

2、當(dāng)我們的網(wǎng)站需接入第三方登陸時(shí),會(huì)引導(dǎo)用戶跳轉(zhuǎn)到第三方的登陸授權(quán)頁(yè)面,此時(shí)把之前申請(qǐng)的appID和secrectID帶給登陸授權(quán)頁(yè)面。

3、用戶登陸成功后即得到授權(quán),第三方會(huì)返回一個(gè)臨時(shí)的code給我們的網(wǎng)站。

4、我們的網(wǎng)站接受到code后,再次向我們的第三方發(fā)起請(qǐng)求,并攜帶接收的code,從第三方獲取access_token.

5、第三方處理請(qǐng)求后,會(huì)返回一個(gè)access_token給我們的網(wǎng)站,我們的網(wǎng)站獲取到access_token后就可以調(diào)用第三方提供的接口了,比如獲取用戶信息等。最后把該用戶信息存入到我們站點(diǎn)的數(shù)據(jù)庫(kù),并把信息保存到session中,實(shí)現(xiàn)用戶的第三方登陸。

43.如何處理負(fù)載,高并發(fā)(好好看看,經(jīng)常問(wèn)到,能回答到主要的東西即可)?

????????答:從低成本、高性能和高擴(kuò)張性的角度來(lái)說(shuō)有如下處理方案:

1、HTML靜態(tài)化

其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁(yè)面,所以我們盡可能使我們的 網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。

2、圖片服務(wù)器分離

把圖片單獨(dú)存儲(chǔ),盡量減少圖片等大流量的開銷,可以放在一些相關(guān)的平臺(tái)上,如騎牛等

3、數(shù)據(jù)庫(kù)集群和庫(kù)表散列及緩存

數(shù)據(jù)庫(kù)的并發(fā)連接為100,一臺(tái)數(shù)據(jù)庫(kù)遠(yuǎn)遠(yuǎn)不夠,可以從讀寫分離、主從復(fù)制,數(shù)據(jù)庫(kù)集群方面來(lái)著手。另外盡量減少數(shù)據(jù)庫(kù)的訪問(wèn),可以使用緩存數(shù)據(jù)庫(kù)如memcache、redis。

4、鏡像:

盡量減少下載,可以把不同的請(qǐng)求分發(fā)到多個(gè)鏡像端。

5、負(fù)載均衡:

Apache的最大并發(fā)連接為1500,只能增加服務(wù)器,可以從硬件上著手,如F5服務(wù)器。當(dāng)然硬件的成本比較高,我們往往從軟件方面著手。

負(fù)載均衡 (Load Balancing) 建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力,同時(shí)能夠提高網(wǎng)絡(luò)的靈活性和可用性。目前使用最為廣泛的負(fù)載均衡軟件是Nginx、LVS、HAProxy。我分別來(lái)說(shuō)下三種的優(yōu)缺點(diǎn):

Nginx的優(yōu)點(diǎn)是:

????1.工作在網(wǎng)絡(luò)的7層之上,可以針對(duì)http應(yīng)用做一些分流的策略,比如針對(duì)域名、目錄結(jié)構(gòu),它的正則規(guī)則比HAProxy更為強(qiáng)大和靈活,這也是它目前廣泛流行的主要原因之一,Nginx單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于LVS了。

????2.Nginx對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴非常小,理論上能ping通就就能進(jìn)行負(fù)載功能,這個(gè)也是它的優(yōu)勢(shì)之一;相反LVS對(duì)網(wǎng)絡(luò)穩(wěn)定性依賴比較大,這點(diǎn)本人深有體會(huì);

????3.Nginx安裝和配置比較簡(jiǎn)單,測(cè)試起來(lái)比較方便,它基本能把錯(cuò)誤用日志打印出來(lái)。LVS的配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了,LVS對(duì)網(wǎng)絡(luò)依賴比較大。

????4.可以承擔(dān)高負(fù)載壓力且穩(wěn)定,在硬件不差的情況下一般能支撐幾萬(wàn)次的并發(fā)量,負(fù)載度比LVS相對(duì)小些。

????5.Nginx可以通過(guò)端口檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁(yè)返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn),不過(guò)其中缺點(diǎn)就是不支持url來(lái)檢測(cè)。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過(guò)程中出現(xiàn)故障,Nginx會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而LVS就直接斷掉了,如果是上傳一個(gè)很大的文件或者很重要的文件的話,用戶可能會(huì)因此而不滿。

????6.Nginx不僅僅是一款優(yōu)秀的負(fù)載均衡器/反向代理軟件,它同時(shí)也是功能強(qiáng)大的Web應(yīng)用服務(wù)器。LNMP也是近幾年非常流行的web架構(gòu),在高流量的環(huán)境中穩(wěn)定性也很好。

????7.Nginx現(xiàn)在作為Web反向加速緩存越來(lái)越成熟了,速度比傳統(tǒng)的Squid服務(wù)器更快,可以考慮用其作為反向代理加速器。

????8.Nginx可作為中層反向代理使用,這一層面Nginx基本上無(wú)對(duì)手,唯一可以對(duì)比Nginx的就只有 lighttpd了,不過(guò) lighttpd目前還沒(méi)有做到Nginx完全的功能,配置也不那么清晰易讀,社區(qū)資料也遠(yuǎn)遠(yuǎn)沒(méi)Nginx活躍。

????9.Nginx也可作為靜態(tài)網(wǎng)頁(yè)和圖片服務(wù)器,這方面的性能也無(wú)對(duì)手。還有Nginx社區(qū)非?;钴S,第三方模塊也很多。

Nginx的缺點(diǎn)是:

????1.Nginx僅能支持http、https和Email協(xié)議,這樣就在適用范圍上面小些,這個(gè)是它的缺點(diǎn)。

????2.對(duì)后端服務(wù)器的健康檢查,只支持通過(guò)端口來(lái)檢測(cè),不支持通過(guò)url來(lái)檢測(cè)。不支持Session的直接保持,但能通過(guò)ip_hash來(lái)解決。

LVS:使用Linux內(nèi)核集群實(shí)現(xiàn)一個(gè)高性能、高可用的負(fù)載均衡服務(wù)器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS的優(yōu)點(diǎn)是:

????1.抗負(fù)載能力強(qiáng)、是工作在網(wǎng)絡(luò)4層之上僅作分發(fā)之用,沒(méi)有流量的產(chǎn)生,這個(gè)特點(diǎn)也決定了它在負(fù)載均衡軟件里的性能最強(qiáng)的,對(duì)內(nèi)存和cpu資源消耗比較低。

????2.配置性比較低,這是一個(gè)缺點(diǎn)也是一個(gè)優(yōu)點(diǎn),因?yàn)闆](méi)有可太多配置的東西,所以并不需要太多接觸,大大減少了人為出錯(cuò)的幾率。

????3.工作穩(wěn)定,因?yàn)槠浔旧砜关?fù)載能力很強(qiáng),自身有完整的雙機(jī)熱備方案,如LVS+Keepalived,不過(guò)我們?cè)陧?xiàng)目實(shí)施中用得最多的還是LVS/DR+Keepalived。

????4.無(wú)流量,LVS只分發(fā)請(qǐng)求,而流量并不從它本身出去,這點(diǎn)保證了均衡器IO的性能不會(huì)受到大流量的影響。

????5.應(yīng)用范圍比較廣,因?yàn)長(zhǎng)VS工作在4層,所以它幾乎可以對(duì)所有應(yīng)用做負(fù)載均衡,包括http、數(shù)據(jù)庫(kù)、在線聊天室等等。

LVS的缺點(diǎn)是:

????1.軟件本身不支持正則表達(dá)式處理,不能做動(dòng)靜分離;而現(xiàn)在許多網(wǎng)站在這方面都有較強(qiáng)的需求,這個(gè)是Nginx/HAProxy+Keepalived的優(yōu)勢(shì)所在。

????2.如果是網(wǎng)站應(yīng)用比較龐大的話,LVS/DR+Keepalived實(shí)施起來(lái)就比較復(fù)雜了,特別后面有 Windows Server的機(jī)器的話,如果實(shí)施及配置還有維護(hù)過(guò)程就比較復(fù)雜了,相對(duì)而言,Nginx/HAProxy+Keepalived就簡(jiǎn)單多了。

HAProxy的特點(diǎn)是:

????1.HAProxy也是支持虛擬主機(jī)的。

????2.HAProxy的優(yōu)點(diǎn)能夠補(bǔ)充Nginx的一些缺點(diǎn),比如支持Session的保持,Cookie的引導(dǎo);同時(shí)支持通過(guò)獲取指定的url來(lái)檢測(cè)后端服務(wù)器的狀態(tài)。

????3.HAProxy跟LVS類似,本身就只是一款負(fù)載均衡軟件;單純從效率上來(lái)講HAProxy會(huì)比Nginx有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的。

????4.HAProxy支持TCP協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā),可以對(duì)MySQL讀進(jìn)行負(fù)載均衡,對(duì)后端的MySQL節(jié)點(diǎn)進(jìn)行檢測(cè)和負(fù)載均衡,大家可以用LVS+Keepalived對(duì)MySQL主從做負(fù)載均衡。

????5.HAProxy負(fù)載均衡策略非常多,HAProxy的負(fù)載均衡算法現(xiàn)在具體有如下8種:

????????① roundrobin,表示簡(jiǎn)單的輪詢,這個(gè)不多說(shuō),這個(gè)是負(fù)載均衡基本都具備的;?

????????② static-rr,表示根據(jù)權(quán)重,建議關(guān)注;?

????????③ leastconn,表示最少連接者先處理,建議關(guān)注;?

????????④ source,表示根據(jù)請(qǐng)求源IP,這個(gè)跟Nginx的IP_hash機(jī)制類似,我們用其作為解決session問(wèn)題的一種方法,建議關(guān)注;?

????????⑤ ri,表示根據(jù)請(qǐng)求的URI;?

????????⑥ rl_param,表示根據(jù)請(qǐng)求的URl參數(shù)’balance url_param’ requires an URL parameter name;?

????????⑦ hdr(name),表示根據(jù)HTTP請(qǐng)求頭來(lái)鎖定每一次HTTP請(qǐng)求;?

????????⑧ rdp-cookie(name),表示根據(jù)據(jù)cookie(name)來(lái)鎖定并哈希每一次TCP請(qǐng)求。

Nginx和LVS對(duì)比的總結(jié):

????1.Nginx工作在網(wǎng)絡(luò)的7層,所以它可以針對(duì)http應(yīng)用本身來(lái)做分流策略,比如針對(duì)域名、目錄結(jié)構(gòu)等,相比之下LVS并不具備這樣的功能,所以Nginx單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于LVS了;但Nginx有用的這些功能使其可調(diào)整度要高于LVS,所以經(jīng)常要去觸碰觸碰,觸碰多了,人為出問(wèn)題的幾率也就會(huì)大。

????2.Nginx對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴較小,理論上只要ping得通,網(wǎng)頁(yè)訪問(wèn)正常,Nginx就能連得通,這是Nginx的一大優(yōu)勢(shì)!Nginx同時(shí)還能區(qū)分內(nèi)外網(wǎng),如果是同時(shí)擁有內(nèi)外網(wǎng)的節(jié)點(diǎn),就相當(dāng)于單機(jī)擁有了備份線路;LVS就比較依賴于網(wǎng)絡(luò)環(huán)境,目前來(lái)看服務(wù)器在同一網(wǎng)段內(nèi)并且LVS使用direct方式分流,效果較能得到保證。另外注意,LVS需要向托管商至少申請(qǐng)多一個(gè)ip來(lái)做Visual IP,貌似是不能用本身的IP來(lái)做VIP的。要做好LVS管理員,確實(shí)得跟進(jìn)學(xué)習(xí)很多有關(guān)網(wǎng)絡(luò)通信方面的知識(shí),就不再是一個(gè)HTTP那么簡(jiǎn)單了。

????3.Nginx安裝和配置比較簡(jiǎn)單,測(cè)試起來(lái)也很方便,因?yàn)樗灸馨彦e(cuò)誤用日志打印出來(lái)。LVS的安裝和配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了;LVS對(duì)網(wǎng)絡(luò)依賴比較大,很多時(shí)候不能配置成功都是因?yàn)榫W(wǎng)絡(luò)問(wèn)題而不是配置問(wèn)題,出了問(wèn)題要解決也相應(yīng)的會(huì)麻煩得多。

????4.Nginx也同樣能承受很高負(fù)載且穩(wěn)定,但負(fù)載度和穩(wěn)定度差LVS還有幾個(gè)等級(jí):Nginx處理所有流量所以受限于機(jī)器IO和配置;本身的bug也還是難以避免的。

????5.Nginx可以檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁(yè)返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn)。目前LVS中 ldirectd也能支持針對(duì)服務(wù)器內(nèi)部的情況來(lái)監(jiān)控,但LVS的原理使其不能重發(fā)請(qǐng)求。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過(guò)程中出現(xiàn)故障,Nginx會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而LVS就直接斷掉了,如果是上傳一個(gè)很大的文件或者很重要的文件的話,用戶可能會(huì)因此而惱火。

????6.Nginx對(duì)請(qǐng)求的異步處理可以幫助節(jié)點(diǎn)服務(wù)器減輕負(fù)載,假如使用 apache直接對(duì)外服務(wù),那么出現(xiàn)很多的窄帶鏈接時(shí)apache服務(wù)器將會(huì)占用大 量?jī)?nèi)存而不能釋放,使用多一個(gè)Nginx做apache代理的話,這些窄帶鏈接會(huì)被Nginx擋住,apache上就不會(huì)堆積過(guò)多的請(qǐng)求,這樣就減少了相當(dāng)多的資源占用。這點(diǎn)使用squid也有相同的作用,即使squid本身配置為不緩存,對(duì)apache還是有很大幫助的。

????7.Nginx能支持http、https和email(email的功能比較少用),LVS所支持的應(yīng)用在這點(diǎn)上會(huì)比Nginx更多。在使用上,一般最前端所采取的策略應(yīng)是LVS,也就是DNS的指向應(yīng)為L(zhǎng)VS均衡器,LVS的優(yōu)點(diǎn)令它非常適合做這個(gè)任務(wù)。重要的ip地址,最好交由LVS托管,比如數(shù)據(jù)庫(kù)的 ip、webservice服務(wù)器的ip等等,這些ip地址隨著時(shí)間推移,使用面會(huì)越來(lái)越大,如果更換ip則故障會(huì)接踵而至。所以將這些重要ip交給 LVS托管是最為穩(wěn)妥的,這樣做的唯一缺點(diǎn)是需要的VIP數(shù)量會(huì)比較多。Nginx可作為L(zhǎng)VS節(jié)點(diǎn)機(jī)器使用,一是可以利用Nginx的功能,二是可以利用Nginx的性能。當(dāng)然這一層面也可以直接使用squid,squid的功能方面就比Nginx弱不少了,性能上也有所遜色于Nginx。Nginx也可作為中層代理使用,這一層面Nginx基本上無(wú)對(duì)手,唯一可以撼動(dòng)Nginx的就只有l(wèi)ighttpd了,不過(guò)lighttpd目前還沒(méi)有能做到 Nginx完全的功能,配置也不那么清晰易讀。另外,中層代理的IP也是重要的,所以中層代理也擁有一個(gè)VIP和LVS是最完美的方案了。具體的應(yīng)用還得具體分析,如果是比較小的網(wǎng)站(日PV小于1000萬(wàn)),用Nginx就完全可以了,如果機(jī)器也不少,可以用DNS輪詢,LVS所耗費(fèi)的機(jī)器還是比較多的;大型網(wǎng)站或者重要的服務(wù),機(jī)器不發(fā)愁的時(shí)候,要多多考慮利用LVS。

數(shù)據(jù)庫(kù)優(yōu)化

44.做秒殺時(shí)鎖表考慮到?jīng)]有?

????????答:考慮到了,當(dāng)時(shí)我們做秒殺時(shí)考慮了好幾種方案,其中有一種就是使用事務(wù)加上排他鎖來(lái)實(shí)現(xiàn)。

45.架構(gòu)類的東西接觸過(guò)嗎?

????????有接觸過(guò),曾經(jīng)自己在自己的服務(wù)器上配置過(guò)。我以前做過(guò)以下幾個(gè)架構(gòu)方面的配置和測(cè)試;

????????1、數(shù)據(jù)庫(kù)的讀寫分離、主從復(fù)制及集群。

????????2、Nginx負(fù)載均衡

????????3、redis集群及主從

46.有沒(méi)有封裝過(guò)一個(gè)簡(jiǎn)單的框架?

????????答;封裝過(guò)一個(gè)簡(jiǎn)單的MVC框架,主要分為3層,控制器層和模型層視圖層,以及路由的分配和入口文件,模板引擎,單例模式、工廠模式,第三方類庫(kù)的引入等。

47.談?wù)剬?duì)MVC的認(rèn)識(shí)?

????????答:核心思想是:視圖和用戶交互通過(guò)事件導(dǎo)致控制器改變 控制器改變導(dǎo)致模型改變 或者控制器同時(shí)改變兩者 模型改變 導(dǎo)致視圖改變 或者視圖改變 潛在的從模型里面獲得參數(shù) 來(lái)改變自己。他的好處是可以將界面和業(yè)務(wù)邏輯分離。

Model(模型),是程序的主體部分,主要包含業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯。在模型層,還會(huì)涉及到用戶發(fā)布的服務(wù),在服務(wù)中會(huì)根據(jù)不同的業(yè)務(wù)需求,更新業(yè)務(wù)模型中的數(shù)據(jù)。

View(視圖),是程序呈現(xiàn)給用戶的部分,是用戶和程序交互的接口,用戶會(huì)根據(jù)具體的業(yè)務(wù)需求,在View視圖層輸入自己特定的業(yè)務(wù)數(shù)據(jù),并通過(guò)界面的事件交互,將對(duì)應(yīng)的輸入?yún)?shù)提交給后臺(tái)控制器進(jìn)行處理。

Contorller(控制器),Contorller是用來(lái)處理用戶 輸入數(shù)據(jù),已經(jīng)更新業(yè)務(wù)模型的部分。控制器中接收了用戶與界面交互時(shí)傳遞過(guò)來(lái)的數(shù)據(jù),并根據(jù)數(shù)據(jù)業(yè)務(wù)邏輯來(lái)執(zhí)行服務(wù)的調(diào)用和更新業(yè)務(wù)模型的數(shù)據(jù)和狀態(tài)。

48.session與cookie的區(qū)別?

????????1、cookie數(shù)據(jù)存放在第三方應(yīng)用的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。

????????2、cookie不是很安全,別人可以分析存放在本地的COOKIE,進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session。

????????3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。

????????4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

????????5、所以個(gè)人建議:

? ? ????????將登陸信息等重要信息存放為SESSION

? ? ? ? ? ? 其他信息如果需要保留,可以放在COOKIE

49.echo(),print(),print_r()的區(qū)別?

????????echo可以一次輸出多個(gè)值,多個(gè)值之間用逗號(hào)分隔。echo是語(yǔ)言結(jié)構(gòu)(language construct),而并不是真正的函數(shù),因此不能作為表達(dá)式的一部分使用。echo是php的內(nèi)部指令,不是函數(shù),無(wú)返回值。

????????print():函數(shù)print()打印一個(gè)值(它的參數(shù)),如果字符串成功顯示則返回true,否則返回false。只能打印出簡(jiǎn)單類型變量的值(如int,string),有返回值

????????printf():源于C語(yǔ)言中的printf()。該函數(shù)輸出格式化的字符串。

????????print_r()和var_dump()

????????print_r()可以把字符串和數(shù)字簡(jiǎn)單地打印出來(lái),而數(shù)組則以括起來(lái)的鍵和值得列表形式顯示,并以Array開頭。但print_r()輸出布爾值和NULL的結(jié)果沒(méi)有意義,因?yàn)槎际谴蛴?\n"。因此用var_dump()函數(shù)更適合調(diào)試。print_r是函數(shù),可以打印出比較復(fù)雜的變量(如數(shù)組,對(duì)象),有返回值

????????var_dump()判斷一個(gè)變量的類型與長(zhǎng)度,并輸出變量的數(shù)值,如果變量有值輸?shù)氖亲兞康闹挡⒒胤禂?shù)據(jù)類型。此函數(shù)顯示關(guān)于一個(gè)或多個(gè)表達(dá)式的結(jié)構(gòu)信息,包括表達(dá)式的類型與值。數(shù)組將遞歸展開值,通過(guò)縮進(jìn)顯示其結(jié)構(gòu)。

50.說(shuō)一下單引號(hào)雙引號(hào)?

????????①單引號(hào)內(nèi)部的變量不會(huì)執(zhí)行, 雙引號(hào)會(huì)執(zhí)行

????????②單引號(hào)解析速度比雙引號(hào)快。

????????③單引號(hào)只能解析部分特殊字符,雙引號(hào)可以解析所有特殊字符。

51.索引的優(yōu)缺點(diǎn)?

????????1、優(yōu)點(diǎn):

a)可以保證數(shù)據(jù)庫(kù)表中每一行的數(shù)據(jù)的唯一性

b)可以大大加快數(shù)據(jù)的索引速度

c)加速表與表之間的連接,物別是在實(shí)現(xiàn)數(shù)據(jù)的參考完事性方面特別有意義

d)在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間

f)通過(guò)使用索引,可以在時(shí)間查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能

2、 缺點(diǎn):

a)? 創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加

b)? 索引需要占物理空間,除了數(shù)據(jù)表占用數(shù)據(jù)空間之外,每一個(gè)索引還要占用一定的物理空間,如果需要建立聚簇索引,那么需要占用的空間會(huì)更大

c)? 以表中的數(shù)據(jù)進(jìn)行增、刪、改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這就降低了整數(shù)的維護(hù)速度

d)? 建立索引的原則

e)? 在經(jīng)常需要搜索的列上,可以加快搜索的速度

f)? 在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu)

g)? 在經(jīng)常用在連接的列上,這些列主要是一外鍵,可以加快連接的速度

h)? 在經(jīng)經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,國(guó)為索引已經(jīng)排序,其指定的范圍是連續(xù)的

i)? 在經(jīng)常需要排序的列上,國(guó)為索引已經(jīng)排序,這樣井底可以利用索引的排序,加快排序井底時(shí)間

j)? 在經(jīng)常使用在where子句中的列上,加快條件的判斷速度

52.get和post的區(qū)別?

????????1. get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。

????????2. get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到。post是通過(guò)HTTP post機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個(gè)過(guò)程。

????????3. get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。

????????4. get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。

53.如何修改會(huì)話的生存時(shí)間?

????????一:在php.ini中設(shè)置session.gc_maxlifetime = 1440 //默認(rèn)時(shí)間

????????二:代碼實(shí)現(xiàn)? ? ? $ lifeTime = 24 * 3600; //保存一天

? ? ????session_set_cookie_params($ lifeTime);

? ????? 在session_start();

54.Linux基本命令,目錄結(jié)構(gòu)?

????????arch顯示機(jī)器的處理器架構(gòu)

(1) uname -m顯示機(jī)器的處理器架構(gòu)

(2) uname -r顯示正在使用的內(nèi)核版本

dmidecode -q顯示硬件系統(tǒng)部件 - (SMBIOS / DMI)?

hdparm -i / dev / hda羅列一個(gè)磁盤的架構(gòu)特性? ?

hdparm -tT / dev / sda在磁盤上執(zhí)行測(cè)試性讀取操作

cat / porc / cpuinfo顯示CPU信息

cat / porc / interrupts顯示中斷

cat / porc / meminfo校驗(yàn)內(nèi)存使用?

cat / porc / swaps顯示哪些交換被使用

cat / porc / verion顯示內(nèi)核的版本

cat /porc/net/dev 顯示網(wǎng)絡(luò)適配器及統(tǒng)計(jì)

cat /porc/mounts 顯示已加載的文件系統(tǒng)

date 顯示系統(tǒng)日期

cal 2007 顯示2007年的日歷表

date 041217002007.00 設(shè)置日期和時(shí)間 -月日時(shí)分年.秒

clock -w 將時(shí)間修改保存到 BIOS

文件搜索

find / -name file1 從 '/'開始進(jìn)入根文件系統(tǒng)搜索文件和目錄

locate \*.ps 尋找以 '.ps'結(jié)尾的文件 -先運(yùn)行'updatedb'命令

whereis halt 顯示一個(gè)二進(jìn)制文件、源碼或man的位置

which halt 顯示一個(gè)二進(jìn)制文件或可執(zhí)行文件的完整路徑

掛載一個(gè)文件系統(tǒng)

mount /dev/hda2 /mnt/hda2 掛載一個(gè)叫做hda2的盤- 確定目錄'/ mnt/hda2' 已經(jīng)存在

umount /dev/hda2 卸載一個(gè)叫做hda2的盤- 先從掛載點(diǎn)'/ mnt/hda2' 退出

追加命令

1,linux里把文件/etc/aaa中的內(nèi)容追加到/usr/bbb中的內(nèi)容的后面

? sudo cat /etc/aaa >>/usr/bbb

2,更改/etc/index.html的文件所有者為apache,文件群組為apache

? sudo chmod apache:apache? /etc/index.html

3,更改/etc/index.html的所有者權(quán)限為讀取、寫入、執(zhí)行。群組權(quán)限為讀取。其他權(quán)限為讀取

? sudo chmod 744 /etc/index.html

4,刪除/etc下名為hello的文件

? sudo rm /etc/index.html

當(dāng)然,如果你是以orot用戶執(zhí)行以上操作,可以去掉前邊的sudo!

df -hl 查看磁盤剩余空間

df -h 查看每個(gè)根路徑的分區(qū)大小

du -sh [目錄名] 返回該目錄的大小

du -sm [文件夾] 返回該文件夾總M數(shù)

關(guān)機(jī) (系統(tǒng)的關(guān)機(jī)、重啟以及登出)

shutdown -h now 關(guān)閉系統(tǒng)(1)

init 0 關(guān)閉系統(tǒng)(2)

telinit 0 關(guān)閉系統(tǒng)(3)

shutdown -h hour:minutes & 按預(yù)定時(shí)間關(guān)閉系統(tǒng)

shutdown -c 取消按預(yù)定時(shí)間關(guān)閉系統(tǒng)

shutdown -r now 重啟(1)

reboot 重啟(2)

logout 注銷

文件和目錄

pwd 顯示工作路徑

ls 查看目錄中的文件

ls -F 查看目錄中的文件

ls -l 顯示文件和目錄的詳細(xì)資料

ls -a 顯示隱藏文件

ls *[0-9]* 顯示包含數(shù)字的文件名和目錄名

tree 顯示文件和目錄由根目錄開始的樹形結(jié)構(gòu)(1)

lstree 顯示文件和目錄由根目錄開始的樹形結(jié)構(gòu)(2)

mkdir dir1 創(chuàng)建一個(gè)叫做 'dir1'的目錄'

磁盤空間

df -h 顯示已經(jīng)掛載的分區(qū)列表

ls -lSr |more 以尺寸大小排列文件和目錄

du -sh dir1 估算目錄 'dir1'已經(jīng)使用的磁盤空間'

下載、解壓

1)對(duì)于.tar結(jié)尾的文件

  tar -xf all.tar

2)對(duì)于.gz結(jié)尾的文件

  gzip -d all.gz

  gunzip all.gz

# zip all.zip *.jpg

  這條命令是將所有.jpg的文件壓縮成一個(gè)zip包

# unzip all.zip

  這條命令是將all.zip中的所有文件解壓出來(lái)

下載命令

wget + 空格 +要下載文件的url路徑

=====================================

Shell 腳本:

必須以? #!/bin/sh? 開頭

簡(jiǎn)單例子:判斷這個(gè)目錄下有沒(méi)有文件(File)

#!/bin/bash

Num=`ls -al /opt |grep "^-"|wc -l `

if [ $Num != 0 ]

then echo "/opt has $Num files"

else

echo "/opt has none file"

fi

ls -al /opt |grep "^-"|wc -l? 這個(gè)命令能夠統(tǒng)計(jì)文件個(gè)數(shù) 為0就是沒(méi)有文件 非零就是有文件

55..memcache緩存什么數(shù)據(jù)?

? ? ? ?一、經(jīng)常被讀取并且實(shí)時(shí)性要求不強(qiáng)可以等到自動(dòng)過(guò)期的數(shù)據(jù)。例如網(wǎng)站首頁(yè)最新文章列表、某某排行等數(shù)據(jù)。

? ? ????二、經(jīng)常被讀取并且實(shí)時(shí)性要求強(qiáng)的數(shù)據(jù)。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。

????????三、統(tǒng)計(jì)類緩存,比如文章瀏覽數(shù)、網(wǎng)站PV等。

????????四、活躍用戶的基本信息或者某篇熱門文章。

????????五、session數(shù)據(jù)

56.魔術(shù)方法、魔術(shù)常量?

1。__construct()

實(shí)例化對(duì)象時(shí)被調(diào)用,當(dāng)__construct和以類名為函數(shù)名的函數(shù)同時(shí)存在時(shí),__construct將被調(diào)用,另一個(gè)不被調(diào)用。

2。__destruct()

當(dāng)刪除一個(gè)對(duì)象或?qū)ο蟛僮鹘K止時(shí)被調(diào)用。

3。__call()

對(duì)象調(diào)用某個(gè)方法,若方法存在,則直接調(diào)用;若不存在,則會(huì)去調(diào)用__call函數(shù)。

4。__get()

讀取一個(gè)對(duì)象的屬性時(shí),若屬性存在,則直接返回屬性值;若不存在,則會(huì)調(diào)用__get函數(shù)。

5。__set()

設(shè)置一個(gè)對(duì)象的屬性時(shí),若屬性存在,則直接賦值;若不存在,則會(huì)調(diào)用__set函數(shù)。

6。__toString()

打印一個(gè)對(duì)象的時(shí)被調(diào)用。如echo $obj;或print $obj;

7。__clone()

克隆對(duì)象時(shí)被調(diào)用。如:$t=new Test();$t1=clone $t;

8。__sleep()

serialize之前被調(diào)用。若對(duì)象比較大,想刪減一點(diǎn)東東再序列化,可考慮一下此函數(shù)。

9。__wakeup()

unserialize時(shí)被調(diào)用,做些對(duì)象的初始化工作。

10。__isset()

檢測(cè)一個(gè)對(duì)象的屬性是否存在時(shí)被調(diào)用。如:isset($c->name)。

11。__unset()

unset一個(gè)對(duì)象的屬性時(shí)被調(diào)用。如:unset($c->name)。

12。__set_state()

調(diào)用var_export時(shí),被調(diào)用。用__set_state的返回值做為var_export的返回值。

13。__autoload()

實(shí)例化一個(gè)對(duì)象時(shí),如果對(duì)應(yīng)的類不存在,則該方法被調(diào)用。

魔術(shù)常量:

__LINE__

返回文件中的當(dāng)前行號(hào)。

__FILE__

返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑。

__FUNCTION__

返回函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)被定義時(shí)的名字(區(qū)分大小寫)。在PHP 4 中該值總是小寫字母的。

__CLasS__

返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時(shí)的名字(區(qū)分大小寫)。在PHP 4 中該值總是小寫字母的。

__METHOD__

返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時(shí)的名字(區(qū)分大小寫)。

__set()當(dāng)程序試圖寫入一個(gè)不存在或者不可見(jiàn)的成員變量時(shí),__set()方法包含兩個(gè)參數(shù),分別表示變量名稱和變量值,兩個(gè)參數(shù)都不可省略

__get()當(dāng)程序試圖調(diào)用一個(gè)未定義或不可見(jiàn)的成員變量時(shí),__get()方法有一個(gè)參數(shù),表示要調(diào)用的變量名

__sleep() 常用于提交未提交的數(shù)據(jù),或類似的清理操作如果有一些很大的對(duì)象,但不需要全部保存,這個(gè)功能就很好用。

__construct()? 在類實(shí)例化對(duì)象的同時(shí)執(zhí)行該函數(shù)

__distruct() 在類實(shí)例化的對(duì)象銷毀時(shí)執(zhí)行

__call()對(duì)象調(diào)用某個(gè)方法,若方法存在,則直接調(diào)用;若不存在,則會(huì)去調(diào)用__call函數(shù)。

__clone()克隆對(duì)象時(shí)被調(diào)用。如:$t=new Test();$t1=clone $t;

__toString()打印一個(gè)對(duì)象的時(shí)被調(diào)用。如echo $obj;或print $obj;

__isset()檢測(cè)一個(gè)對(duì)象的屬性是否存在時(shí)被調(diào)用。如:isset($c->name)。

__unset()unset一個(gè)對(duì)象的屬性時(shí)被調(diào)用。如:unset($c->name)。

__autoload()實(shí)例化一個(gè)對(duì)象時(shí),如果對(duì)應(yīng)的類不存在,則該方法被調(diào)用。

57.接口和抽象類的區(qū)別是什么?

????????答:抽象類是一種不能被實(shí)例化的類,只能作為其他類的父類來(lái)使用。抽象類是通過(guò)關(guān)鍵字abstract來(lái)聲明的。?

抽象類與普通類相似,都包含成員變量和成員方法,兩者的區(qū)別在于,抽象類中至少要包含一個(gè)抽象方法,抽象方法沒(méi)有方法體,該方法天生就是要被子類重寫的。?

抽象方法的格式為:abstract function abstractMethod();

接口是通過(guò) interface 關(guān)鍵字來(lái)聲明的,接口中的成員常量和方法都是 public 的,方法可以不寫關(guān)鍵字public,接口中的方法也是沒(méi)有方法體。接口中的方法也天生就是要被子類實(shí)現(xiàn)的。?

抽象類和接口實(shí)現(xiàn)的功能十分相似,最大的不同是接口能實(shí)現(xiàn)多繼承。在應(yīng)用中選擇抽象類還是接口要看具體實(shí)現(xiàn)。?

子類繼承抽象類使用 extends,子類實(shí)現(xiàn)接口使用implements。

58.什么是隊(duì)列?排它鎖,Myisam死鎖如何解決

????????答:在默認(rèn)情況下MYisam是表級(jí)鎖,所以同時(shí)操作單張表的多個(gè)動(dòng)作只能以隊(duì)列的方式進(jìn)行;

排它鎖又名寫鎖,在SQL執(zhí)行過(guò)程中為排除其它請(qǐng)求而寫鎖,在執(zhí)行完畢后會(huì)自動(dòng)釋放;

死鎖解決:先找到死鎖的線程號(hào),然后殺掉線程ID

59.bootstrap框架有哪些優(yōu)點(diǎn)?

????????答:bootstrap是一款web開發(fā)框架,它由CSS,JavaScript,Html,三部分構(gòu)成,它簡(jiǎn)潔靈活,使得web開發(fā)更加的快捷

優(yōu)點(diǎn):?

①節(jié)省時(shí)間: 使用bootstrap框架,可以大大的節(jié)省項(xiàng)目開發(fā)時(shí)間,它包含了很多現(xiàn)成的代碼,如果需要使用,只需要找到合適的代碼,插入合適的位置即可,此外,CSS是使用LESS編寫,很多樣式和設(shè)計(jì)都已經(jīng)設(shè)計(jì)完成了?

②定制化: bootstrap可以根據(jù)自己的項(xiàng)目,留取框架中自己需要的部分?

③設(shè)計(jì)合理:

柵格系統(tǒng): bootstrap定義12格柵系統(tǒng),在頁(yè)面已經(jīng)完成時(shí),你可以根據(jù)合適的網(wǎng)格,以自己的需求改變行數(shù)和布局大小,樣式已經(jīng)開發(fā)完成了,只需要把代碼放入合適的HTML代碼位置即可

LESS: LESS是基于CSS之上的高級(jí)語(yǔ)言,其目的是使得CSS開發(fā)更加靈活,更加強(qiáng)大

JavaScript:bootstrap提供JavaScript庫(kù),該庫(kù)超越了基本的架構(gòu)和樣式,開發(fā)者可以輕松的操作窗口警告框,工具提示框等,可避免了我們費(fèi)神費(fèi)力的寫腳本?

4.一致性: bootstrap可以保證界面在不同平臺(tái)的統(tǒng)一性,無(wú)論實(shí)在IE,Chrome等?

5.持續(xù)更新: bootstrap在不斷的改進(jìn),更具規(guī)律性和持續(xù)性?

6.響應(yīng)式: 無(wú)論是在PC端還是移動(dòng)端,都可以保持界面的一致性?

7.文檔多: bootstrap的非常多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容