1. 程式人生 > >面試問題總結二(技術能力-PHP)----Ⅲ

面試問題總結二(技術能力-PHP)----Ⅲ

man var_dump 創建索引 獲得 target 簡單 也不能 兩個 錯誤

42、什麽是單點登錄?

答:單點登錄 SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄後,就不用在其他系統中登錄,也就是用戶的一次登錄能得到其他所有系統的信任。

43、什麽情況下使用單點登錄?

答:當用戶第一次訪問應用系統的時候,因為還沒有登錄,會被引導到認證系統中進行登錄;根據用戶提供的登錄信息,認證系統進行身份校驗,如果通過校驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候,就會將這個 ticket 帶上,作為自己認證的憑據,應用系統接受到請求之後會把 ticket 送到認證系統進行校驗,檢查 ticket 的合法性。如果通過校驗,用戶就可以在不用再次登錄的情況下訪問應用系統 2 和應用系統 3 了。

實現主要技術點:

1、兩個站點共用一個數據驗證系統

2、主要通過跨域請求的方式來實現驗證及 session 處理。

44、如何實現第3方登錄?

答:第三方登陸主要是基於 author 協議來實現,下面簡單說下實現流程:

1、首先我們需要以開發者的身份向第三方登陸平臺申請接入應用,申請成功後,我們會獲得一個 appID 和一個 secrectID。

2、當我們的網站需接入第三方登陸時,會引導用戶跳轉到第三方的登陸授權頁面,此時把之前申請的 appID 和 secrectID 帶給登陸授權頁面。

3、用戶登陸成功後即得到授權,第三方會返回一個臨時的 code 給我們的網站。

4、我們的網站接受到 code 後,再次向我們的第三方發起請求,並攜帶接收的 code,從第三方獲取 access_token。

5、第三方處理請求後,會返回一個 access_token 給我們的網站,我們的網站獲取到 access_token 後就可以調用第三方提供的接口了,比如獲取用戶信息等。

6、最後把該用戶信息存入到我們站點的數據庫,並把信息保存到 session 中,實現用戶的第三方登陸。

45、如何處理負載、高並發?(重點,經常提到,在實際開發過程中也經常遇到)

答:從低成本、高性能和高擴張性的角度來說有如下處理方案:

1、HTML 靜態化其實大家都知道,效率最高、消耗最小的就是純靜態化的 html 頁面,所以我們盡可能使我們的 網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。

2、圖片服務器分離把圖片單獨存儲,盡量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如七牛、阿裏雲、西部數據等

3、數據庫集群和庫表散列及緩存數據庫的並發連接為 100,一臺數據庫遠遠不夠,可以從讀寫分離、主從復制,數據庫集群方面來著手。另外盡量減少數據庫的訪問,可以使用緩存數據庫如 memcache、redis。

4、鏡像:盡量減少下載,可以把不同的請求分發到多個鏡像端。

5、數據庫優化

6、負載均衡:Apache 的最大並發連接為 1500,只能增加服務器,可以從硬件上著手,如 F5 服務器。當然硬件的成本比較高,我們往往從軟件方面著手。負載均衡 (Load Balancing) 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力,同時能夠提高網絡的靈活性和可用性。

目前使用最為廣泛的負載均衡軟件是 Nginx、LVS、HAProxy。我分別來說下三種的優缺點:

Nginx: 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。

Nginx 的優點:

  1. 工作在網絡的 7 層(應用層)之上,可以針對 http 應用做一些分流的策略,比如針對域名、目錄結構,它的正則規則比 HAProxy 更為強大和靈活,這也是它目前廣泛流行的主要原因之一,Nginx 單憑這點可利用的場合就遠多於 LVS 了。

  2. Nginx 對網絡穩定性的依賴非常小,理論上能 ping 通就就能進行負載功能,這個也是它的優勢之一;相反 LVS 對網絡穩定性依賴比較大;

  3. Nginx 安裝和配置比較簡單,測試起來比較方便,它基本能把錯誤用日誌打印出來。LVS 的配置、測試就要花比較長的時間了,LVS 對網絡依賴比較大。

  4. 可以承擔高負載壓力且穩定,在硬件不差的情況下一般能支撐幾萬次的並發量,負載度比 LVS 相對小些。

  5. Nginx 可以通過端口檢測到服務器內部的故障,比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點,不過其中缺點就是不支持 url 來檢測。比如用戶正在上傳一個文件,而處理該上傳的節點剛好在上傳過程中出現故障,Nginx 會把上傳切到另一臺服務器重新處理,而 LVS 就直接斷掉了,如果是上傳一個很大的文件或者很重要的文件的話,用戶可能會因此而不滿。

  6. Nginx 不僅僅是一款優秀的負載均衡器/反向代理軟件,它同時也是功能強大的 Web 應用服務器。LNMP 也是近幾年非常流行的 web 架構,在高流量的環境中穩定性也很好。

  7. Nginx 現在作為 Web 反向加速緩存越來越成熟了,速度比傳統的 Squid 服務器更快,可以考慮用其作為反向代理加速器。

  8. Nginx 可作為中層反向代理使用,這一層面 Nginx 基本上無對手,唯一可以對比 Nginx 的就只有 lighttpd 了,不過 lighttpd 目前還沒有做到 Nginx 完全的功能,配置也不那麽清晰易讀,社區資料也遠遠沒 Nginx 活躍。

  9. Nginx 也可作為靜態網頁和圖片服務器,這方面的性能也無對手。還有 Nginx 社區非常活躍,第三方模塊也很多。

Nginx的缺點:

  1. Nginx 僅能支持 http、https 和 Email 協議,這樣就在適用範圍上面小些,這個是它的缺點。

  2. 對後端服務器的健康檢查,只支持通過端口來檢測,不支持通過 url 來檢測。不支持 Session 的直接保持,但能通過 ip_hash 來解決。

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

LVS的優點:

  1. 抗負載能力強、是工作在網絡 4 層(傳輸層)之上僅作分發之用,沒有流量的產生,這個特點也決定了它在負載均衡軟件裏的性能最強的,對內存和 cpu 資源消耗比較低。

  2. 配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,所以並不需要太多接觸,大大減少了人為出錯的幾率。

  3. 工作穩定,因為其本身抗負載能力很強,自身有完整的雙機熱備方案,如 LVS+Keepalived,不過我們在項目實施中用得最多的還是 LVS/DR+Keepalived。

  4. 無流量,LVS 只分發請求,而流量並不從它本身出去,這點保證了均衡器 IO 的性能不會受到大流量的影響。

  5. 應用範圍比較廣,因為 LVS 工作在 4 層,所以它幾乎可以對所有應用做負載均衡,包括 http、數據庫、在線聊天室等等。

LVS的缺點:

  1. 軟件本身不支持正則表達式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是 Nginx/HAProxy+Keepalived 的優勢所在。

  2. 如果是網站應用比較龐大的話,LVS/DR+Keepalived 實施起來就比較復雜了,特別是 Windows Server 的機器的話,如果實施及配置還有維護過程就比較復雜了,相對而言,Nginx/HAProxy+Keepalived 就簡單多了。

HAProxy:使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。

HAProxy的特點:

  1. HAProxy 也是支持虛擬主機的。

  2. HAProxy 的優點能夠補充 Nginx 的一些缺點,比如支持 Session 的保持,Cookie 的引導;同時支持通過獲取指定的 url 來檢測後端服務器的狀態。

  3. HAProxy 跟 LVS 類似,本身就只是一款負載均衡軟件;單純從效率上來講 HAProxy 會比 Nginx 有更出色的負載均衡速度,在並發處理上也是優於 Nginx 的。

  4. HAProxy 支持 TCP 協議的負載均衡轉發,可以對 MySQL 讀進行負載均衡,對後端的 MySQL 節點進行檢測和負載均衡,大家可以用 LVS+Keepalived 對 MySQL 主從做負載均衡。

  5. HAProxy 負載均衡策略非常多,HAProxy 的負載均衡算法現在具體有如下 8 種:

  • ① roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
  • ② static-rr,表示根據權重,建議關註;
  • ③ leastconn,表示最少連接者先處理,建議關註;
  • ④ source,表示根據請求源 IP,這個跟 Nginx 的 IP_hash 機制類似,我們用其作為解決 session 問題的一種方法,建議關註;
  • ⑤ ri,表示根據請求的 URI;
  • ⑥ rl_param,表示根據請求的 URl 參數’balance url_param’ requires an URL parameter name;
  • ⑦ hdr(name),表示根據 HTTP 請求頭來鎖定每一次 HTTP 請求;
  • ⑧ rdp-cookie(name),表示根據據 cookie(name)來鎖定並哈希每一次 TCP 請求。

Nginx 和 LVS 對比的總結:

  1. Nginx 工作在網絡的 7 層,所以它可以針對 http 應用本身來做分流策略,比如針對域名、目錄結構等,相比之下 LVS 並不具備這樣的功能,所以 Nginx 單憑這點可利用的場合就遠多於 LVS 了;但 Nginx 有用的這些功能使其可調整度要高於 LVS,經常要去調整配置,人為出問題的幾率較大。

  2. Nginx 對網絡穩定性的依賴較小,理論上只要 ping 得通,網頁訪問正常,Nginx 就能連得通,這是 Nginx 的一大優勢!Nginx 同時還能區分內外網,如果是同時擁有內外網的節點,就相當於單機擁有了備份線路;LVS 就比較依賴於網絡環境,目前來看服務器在同一網段內並且 LVS 使用 direct 方式分流,效果較能得到保證。另外註意,LVS 需要向托管商至少申請多一個 ip 來做 Visual IP,貌似是不能用本身的 IP 來做 VIP 的。

  3. Nginx 安裝和配置比較簡單,測試起來也很方便,因為它基本能把錯誤用日誌打印出來。LVS 的安裝和配置、測試就要花比較長的時間了;LVS 對網絡依賴比較大,很多時候不能配置成功都是因為網絡問題而不是配置問題,出了問題要解決也相應的會麻煩得多。

  4. Nginx 也同樣能承受很高負載且穩定,但負載度和穩定度差 LVS 還有幾個等級:Nginx 處理所有流量所以受限於機器 IO 和配置;本身的 bug 也還是難以避免的。

  5. Nginx 可以檢測到服務器內部的故障,比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點。目前 LVS 中 ldirectd 也能支持針對服務器內部的情況來監控,但 LVS 的原理使其不能重發請求。比如用戶正在上傳一個文件,而處理該上傳的節點剛好在上傳過程中出現故障,Nginx 會把上傳切到另一臺服務器重新處理,而 LVS 就直接斷掉了,如果是上傳一個很大的文件或者很重要的文件的話,用戶可能會因此而惱火。

  6. Nginx 對請求的異步處理可以幫助節點服務器減輕負載,假如使用 apache 直接對外服務,那麽出現很多的窄帶鏈接時 apache 服務器將會占用大 量內存而不能釋放,使用多一個 Nginx 做 apache 代理的話,這些窄帶鏈接會被 Nginx 擋住,apache 上就不會堆積過多的請求,這樣就減少了相當多的資源占用。這點使用 squid 也有相同的作用,即使 squid 本身配置為不緩存,對 apache 還是有很大幫助的。

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

46、做秒殺時表鎖定的可行性?

答:使用事務加上排他鎖來實現秒殺,但高並時,對數據庫的性能影響很大,導致數據庫的壓力很大,一般不建議使用,而是采用Redis的隊列來實現。

47、大流量高並發架構方面的配置?

答:1、數據庫的讀寫分離、主從復制及集群。

2、Nginx 負載均衡

3、redis 集群及主從

48、談談對MVC 的認識?

答:核心思想是:視圖和用戶交互通過事件導致控制器改變 控制器改變導致模型改變 或者控制器同時改變兩者 模型改變 導致視圖改變 或者視圖改變 潛在的從模型裏面獲得參數 來改變自己。他的好處是可以將界面和業務邏輯分離。Model(模型),是程序的主體部分,主要包含業務數據和業務邏輯。View(視圖),是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在 View 視圖層輸入自己特定的業務數據,並通過界面的事件交互,將對應的輸入參數提交給後臺控制器進行處理。Contorller(控制器),Contorller 是用來處理用戶 輸入數據,已經更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,並根據數據業務邏輯來執行服務的調用和更新業務模型的數據和狀態。

49、session 和 cookie 的區別?

答:1、cookie 數據存放在第三方應用的瀏覽器上,session 數據放在服務器上。

2、cookie 不是很安全,別人可以分析存放在本地的 COOKIE,進行 COOKIE 欺騙考慮到安全應當使用 session。

3、session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用 COOKIE。

4、單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存 20 個 cookie。

5、個人建議: 將登陸信息等重要信息存放為 SESSION 其他信息如果需要保留,可以放在 COOKIE

50、echo 、print、print_r、var_dump()之間的區別?

答:echo 可以一次輸出多個值,多個值之間用逗號分隔。echo 是語言結構(language construct),而並不是真正的函數,因此不能作為表達式的一部分使用。echo 是 php 的內部指令,不是函數,無返回值。

print():函數 print()打印一個值(它的參數),如果字符串成功顯示則返回 true,否則返回 false。只能打印出簡單類型變量的值(如 int,string),有返回值printf():源於 C 語言中的 printf()。該函數輸出格式化的字符串。

print_r()和 var_dump()print_r()可以把字符串和數字簡單地打印出來,而數組則以括起來的鍵和值得列表形式顯示,並以 Array 開頭。但 print_r()輸出布爾值和 NULL 的結果沒有意義,因為都是打印" "。因此用 var_dump()函數更適合調試。

print_r 是函數,可以打印出比較復雜的變量(如數組,對象),有返回值。

var_dump()判斷一個變量的類型與長度,並輸出變量的數值,如果變量有值輸的是變量的值並回返數據類型。此函數顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。數組將遞歸展開值,通過縮進顯示其結構。

51、foo() 與 @foo 的區別?

答:1、@foo() 是錯誤控制輸出,foo()是正常調用輸出。

2、@符號在PHP 中可以忽略錯誤報告,對於表達式有提示錯誤的,但有不影響語句執行的,可以在表達式之前加@。

3、可以把@符號放在變量、函數和include() 調用、常量等之前,但不能把@放在函數、類的定義之前,也不能用於條件結構語句之前

如:if 、switch、while、for和foreach等

52、傳值和傳引用的區別?在什麽情況下使用傳引用?

答:PHP傳值:在函數範圍內,改變變量值的大小,不會影響到函數外面的變量值。傳值(彼此獨立不影響)

PHP傳引用(&):在函數範圍內,改變變量值的大小,會影響到函數外的變量值,在函數外部也會有所體現,因為傳引用傳的是變量的內存地址、指針。

以下情況適合傳引用:

傳值需要消耗的時間要大於傳引用,特別是傳大型的字符串或對象時;

傳送引用,函數內的任何操作等同於對傳送變量的操作,傳送大型變量時效率高。

53、單引號和雙引號的區別?

答:1、單引號內部的變量不會執行, 雙引號會執行。

2、單引號解析速度比雙引號快。

3、單引號只能解析部分特殊字符,雙引號可以解析所有特殊字符。

54、數據傳輸中 get 和 post 方式的區別?

答:1. 一般而言:get 是從服務器上獲取數據,post 是向服務器傳送數據。

2. get 是把參數數據隊列加到提交表單的 ACTION 屬性所指的 URL 中,值和表單內各個字段一一對應,在 URL 中可以看到。post 是通過 HTTP post 機制,將表單內各個字段與其內容放置在 HTML HEADER 內一起傳送到 ACTION 屬性所指的 URL 地址。用戶看不到這個過程。

3. get 傳送的數據量較小,不能大於 2KB。post 傳送的數據量較大,一般被默認為不受限制。

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

55、索引的優缺點?

答:優點:

1、可以保證數據庫表中每一行的數據的唯一性

2、可以大大加快數據的索引速度

3、加速表與表之間的連接,特別是在實現數據的參考完整性方面特別有意義

4、在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間

5、通過使用索引,可以在時間查詢的過程中,使用優化隱藏器,提高系統的性能

缺點:

1、 創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加

2、 索引需要占物理空間,除了數據表占用數據空間之外,每一個索引還要占用一定的物理空間,如果需要建立聚簇索引,那麽需要占用的空間會更大

3、 以表中的數據進行增、刪、改的時候,索引也要動態的維護,這就降低了整數的維護速度

建立索引的原則:

1、在經常需要搜索的列上,可以加快搜索的速度

2、在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構

3、 在經常用在連接的列上,這些列主要是一外鍵,可以加快連接的速度

4、 在經經常需要根據範圍進行搜索的列上創建索引,因為索引已經排序,其指定的範圍是連續的

5、 在經常需要排序的列上,因為索引已經排序,這樣可以利用索引的排序,加快排序時間

6、 在經常使用在 where 子句中的列上,加快條件的判斷速度

56、如何修改session 的生存周期?

答:1、在 php.ini 中設置 session.gc_maxlifetime = 1440 //默認時間

2、代碼實現 $lifeTime = 24 * 3600; // 保存一天

session_set_cookie_params($lifeTime);

session_start();

面試問題總結二(技術能力-PHP)----Ⅲ