博主還將大量面試題整理成了一個PHP面試手冊,是PDF版的,文章底部有獲取方式。php
1.請自我介紹一下?html
答:我叫xxx,來自北京,20xx年畢業於xx大學計算機xx系,畢業後在**從事了x年的php開發工做,公司是一個外包公司,主要作微信開發,公衆號推廣,商城,論壇的開發mysql
2.你在公司負責那些項目?laravel
答:因爲咱們公司是一個外包公司,不可能只作一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都作過。web
3.你作過那些模塊?面試
答:登錄註冊,商品管理,購物車模塊,訂單管理ajax
4.大家公司是使用什麼框架?redis
答:咱們公司採用的是TP框架,運用的mysql+apache+php進行開發,由於TP框架是一個免費開源的,輕量級的php開發框架,並且是咱們中國人本身開發的,也是國內用的比較多的,各類資料也比較齊全sql
5.mvc是什麼?相互間有什麼關係?數據庫
答:mvc是一種開發模式,主要分爲三部分:m(model),也就是模型,負責數據的操做;v(view),也就是視圖,負責先後臺的顯示;c(controller),也就是控制器,負責業務邏輯客戶端請求項目的控制器,若是執行過程當中須要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據經過視圖顯示出來
6.oop是什麼?
答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個可以起到子程序做用的單元或對象組合而成。
OOP具備三大特色
一、封裝性:也稱爲信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯繫,或者說只公開了一些供開發人員使用的方法。因而開發人員只 須要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合做,也能有效避免程序間相互依賴,實現代碼模塊間鬆藕合。
二、繼承性:就是子類自動繼承其父級類中的屬性和方法,並能夠添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增長了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。
三、多態性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。因而多個子類中雖然都具備同一個方法,可是這些子類實例化的對象調用這些相同的方法後卻能夠得到徹底不一樣的結果,這種技術就是多態性。多態性加強了軟件的靈活性。
7.smarty是什麼,有什麼做用?
回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
它分離了邏輯代碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離
回答二:smarty是php中最著名的引擎框架之一,咱們公司使用的是TP框架,已經封裝好了smarty模板,因此沒有單獨使用過
回答三: smarty是個模板引擎,最顯著的地方就是有能夠把模板緩存起來。通常模板來講,都是作一個靜態頁面,而後在裏面把一些動態的部分用一切分隔符切開,而後在PHP裏打開這個模板文件,把分隔符裏面的值替換掉,而後輸出來,你能夠看下PHPLib裏面的template部分。
而smarty設定了緩存參數之後,第一次運行時候會把模板打開,在php替換裏面值的時候把讀取的html和php部分從新生成一個臨時的php文件,這樣就省去了每次打開都從新讀取html了。若是修改了模板,只要從新刷下就好了。
8.TP框架有哪些優勢?
答:TP框架是咱們中國人本身開發的框架,各類資料比較齊全,國內用的比較多,比較簡單和方便,並且是免費開源的
9.TP的特性有哪些?
1.多表查詢很是方便,在model中幾句代碼就能夠完成對多表的關聯操做
2.融合了smarty模板,使先後臺分離
3.支持多種緩存技術,尤爲對memcache技術支持很是好
4.命名規範,模型,視圖,控制器嚴格遵循命名規則,經過命名一一對應
5.支持多種url模式
6.內置ajax返回方法,包括xml,json,html等
7.支持應用擴展,類庫擴展,驅動擴展等
10.TP框架中的大字母函數?
U:對url的組裝
A:內部實例化控制器
S:緩存處理
R:調用某個控制器的操做方法
D:實例化自定義模型類
M:實例化基礎模型類
I:獲取參數
L:設置或者獲取當前語言
C:設置或獲取,保存配置
11.請介紹一下laravel框架?
答: laravel框架的設計思想比較先進,很是適合應用各類開發模式,做爲一個框架,它爲你準備好了一切,composer是php的將來,沒有composer,php確定要走向沒落
laravel框架最大的特色和優秀之處就是集合了php比較新的特色,以及各類各樣的設計模式,Ioc模式,依賴注入等
12.laravel有那些特色?
回答一:
1.強大的rest router:用簡單的回調函數就能夠調用,快速綁定controller和router
2.artisan:命令行工具,不少手動的工做都自動化
3.可繼承的模板,簡化view的開發和管理
4.blade模板:渲染速度更快
5.ORM操做數據庫
6.migration:管理數據庫和版本控制
7.測試功能也很強大
8.composer也是亮點
回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各類各樣的設計模式等
13.請簡述一下數據庫的優化?
1.從結構層: web服務器採用負載均衡服務器,mysql服務器採用主從複製,讀寫分離
2.從儲存層: 採用合適的存儲引擎,採用三範式
3.從設計層: 採用分區分表,索引,表的字段採用合適的字段屬性,適當的採用逆範式,開啓mysql緩存
4.sql語句層:結果同樣的狀況下,採用效率高,速度快節省資源的sql語句執行
14.如何解決異常處理?
答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內,若是沒有觸發異常,則代碼繼續執行,若是異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,並建立一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
解決異常:使用set_error_handler函數獲取異常(也可使用try()和catch()函數),而後使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面全部的php語句都執行完成時,再調用此函數
15.權限管理(RBAC)的實現?
1.首先建立一張用戶表:id name auto(保存格式爲:控制器-方法)
2.而後在後臺中建立一個基類控制器,控制器裏封裝一個構造方法,當用戶登錄成功後,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,而後實例化模型,經過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,並使用一個數組保存起來,而後使用TP框架中封裝好的常量獲取當前控制器和方法,而後把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,若是沒有,就提示該用戶沒有權限,若是有就進行下一步操做
16.怎麼保證促銷商品不會超賣?
答:這個問題是咱們當時開發時遇到的一個難點,超賣的緣由主要是下的訂單的數目和咱們要促銷的商品的數目不一致致使的,每次老是訂單的數比咱們的促銷商品的數目要多,當時咱們的小組討論了很久,給出了好幾個方案來實現:
第一種方案:在每次下訂單前咱們判斷促銷商品的數量夠不夠,不夠不容許下訂單,更改庫存量時加上一個條件,只更改商品庫存大於0的商品的庫存,當時咱們使用ab進行壓力測試,當併發超過500,訪問量超過2000時,仍是會出現超賣現象。因此被咱們否認了。
第二種方案:使用mysql的事務加排他鎖來解決,首先咱們選擇數據庫的存儲引擎爲innoDB,使用的是排他鎖實現的,剛開始的時候咱們測試了下共享鎖,發現仍是會出現超賣的現象。有個問題是,當咱們進行高併發測試時,對數據庫的性能影響很大,致使數據庫的壓力很大,最終也被咱們否認了。
第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品後先觸發文件鎖,防止其餘用戶進入,該用戶搶到促銷品後再解開文件鎖,放其餘用戶進行操做。這樣能夠解決超賣的問題,可是會致使文件得I/O開銷很大。
最後咱們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操做起來很方便,並且效率極高,最終咱們採起這種方式來實現
17.商城秒殺的實現?
答:搶購、秒殺是現在很常見的一個應用場景,主要須要解決的問題有兩個:
1 高併發對數據庫產生的壓力
2 競爭狀態下如何解決庫存的正確減小("超賣"問題)
對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操做數據庫,例如使用Redis。第二個問題,咱們可使用redis隊列來完成,把要秒殺的商品放入到隊列中,由於pop操做是原子的,即便有不少用戶同時到達,也是依次執行,文件鎖和事務在高併發下性能降低很快,固然還要考慮其餘方面的東西,好比搶購頁面作成靜態的,經過ajax調用接口,其中也可能會出現一個用戶搶屢次的狀況,這時候須要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高併發狀況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,若是在,則已搶購,不然未搶購,庫存減1,寫數據庫,將用戶入結果隊列。
未完待續~~~~~
更多相關面試題還能夠關注微信公衆號:「PHP大神「 回覆「面試手冊」直接下載。