PHP面試題

PHP面試題

1.請自我介紹一下?

答:我叫xxx,來自山東xx,2017年報讀於石油大學計算機xx系,畢業後在xx從事了x年的php開發工做,公司是一個外包公司,主要作微信開發,公衆號推廣,商城,論壇的開發

2.你在公司負責那些項目?

答:因爲咱們公司是一個外包公司,不可能只作一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都作過?

3.你爲何來上海?

答:由於我哥在這邊,父母也但願兄弟間有個照應,並且深圳是一線城市,技術也比廣西前沿一些

4.以前過使用什麼前端框架和後端框架?

答:根據本身的區域回答

5.你作過那些模塊?

答:登錄註冊,商品管理,購物車模塊,訂單管理

6.大家公司是使用什麼框架?

答:咱們公司採用的是TP框架,運用的mysql+apache+php進行開發,由於TP框架是一個免費開源的,輕量級的php開發框架,並且是咱們中國人本身開發的,也是國內用的比較多的,各類資料也比較齊全

7.mvc是什麼?相互間有什麼關係?

答:mvc是一種開發模式,主要分爲三部分:m(model),也就是模型,負責數據的操做;v(view),也就是視圖,負責先後臺的顯示;c(controller),也就是控制器,負責業務邏輯

    客戶端請求項目的控制器,若是執行過程當中須要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據經過視圖顯示出來

8.oop是什麼?

答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個可以起到子程序做用的單元或對象組合而成。

OOP具備三大特色

一、封裝性:也稱爲信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯繫,或者說只公開了一些供開發人員使用的方法。因而開發人員只 須要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合做,也能有效避免程序間相互依賴,實現代碼模塊間鬆藕合。 
二、繼承性:就是子類自動繼承其父級類中的屬性和方法,並能夠添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增長了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。 
三、多態性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。因而多個子類中雖然都具備同一個方法,可是這些子類實例化的對象調用這些相同的方法後卻能夠得到徹底不一樣的結果,這種技術就是多態性。多態性加強了軟件的靈活性。 
一、易維護 
採用面向對象思想設計的結構,可讀性高,因爲繼承的存在,即便改變需求,那麼維護也只是在局部模塊,因此維護起來是很是方便和較低成本的。 
二、質量高 
在設計時,可重用現有的,在之前的項目的領域中已被測試過的類使系統知足業務需求並具備較高的質量。 
三、效率高 
在軟件開發時,根據設計的須要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近於平常生活和天然的思考方式,勢必提升軟件開發的效率和質量。 
四、易擴展 
因爲繼承、封裝、多態的特性,天然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,並且成本較低。

9.smarty是什麼,有什麼做用?

答:回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
    它分離了邏輯代碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離

   回答二:smarty是php中最著名的引擎框架之一,咱們公司使用的是TP框架,已經封裝好了smarty模板,因此沒有單獨使用過

   回答三: smarty是個模板引擎,最顯著的地方就是有能夠把模板緩存起來。通常模板來講,都是作一個靜態頁面,而後在裏面把一些動態的部分用一切分隔符切開,而後在PHP裏打開這個模板文件,把分隔符裏面的值替換掉,而後輸出來,你能夠看下PHPLib裏面的template部分。

    而smarty設定了緩存參數之後,第一次運行時候會把模板打開,在php替換裏面值的時候把讀取的html和php部分從新生成一個臨時的php文件,這樣就省去了每次打開都從新讀取html了。若是修改了模板,只要從新刷下就好了。

10.TP框架有哪些優勢?

答:TP框架是咱們中國人本身開發的框架,各類資料比較齊全,國內用的比較多,比較簡單和方便,並且是免費開源的

11.TP的特性有哪些?

答: 1.多表查詢很是方便,在model中幾句代碼就能夠完成對多表的關聯操做
    2.融合了smarty模板,使先後臺分離
    3.支持多種緩存技術,尤爲對memcache技術支持很是好
    4.命名規範,模型,視圖,控制器嚴格遵循命名規則,經過命名一一對應
    5.支持多種url模式
    6.內置ajax返回方法,包括xml,json,html等
    7.支持應用擴展,類庫擴展,驅動擴展等

12.TP框架中的大字母函數?

答: U:對url的組裝
    A:內部實例化控制器
    S:緩存處理
    R:調用某個控制器的操做方法
    D:實例化自定義模型類
    M:實例化基礎模型類
    I:獲取參數
    L:設置或者獲取當前語言
    C:設置或獲取,保存配置

13.請介紹一下laravel框架?

答: laravel框架的設計思想比較先進,很是適合應用各類開發模式,做爲一個框架,它爲你準備好了一切,composer是php的將來,沒有composer,php確定要走向沒落
    laravel框架最大的特色和優秀之處就是集合了php比較新的特色,以及各類各樣的設計模式,Ioc模式,依賴注入等

14.laravel有那些特色?

答:回答一: 1.強大的rest router:用簡單的回調函數就能夠調用,快速綁定controller和router
           2.artisan:命令行工具,不少手動的工做都自動化
           3.可繼承的模板,簡化view的開發和管理
           4.blade模板:渲染速度更快
           5.ORM操做數據庫
           6.migration:管理數據庫和版本控制
           7.測試功能也很強大
           8.composer也是亮點

   回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各類各樣的設計模式等

15.請簡述一下數據庫的優化?

答:數據庫的優化能夠從四個方面來優化:

1.從結構層: web服務器採用負載均衡服務器,mysql服務器採用主從複製,讀寫分離
2.從儲存層: 採用合適的存儲引擎,採用三範式
3.從設計層: 採用分區分表,索引,表的字段採用合適的字段屬性,適當的採用逆範式,開啓mysql緩存
4.sql語句層:結果同樣的狀況下,採用效率高,速度快節省資源的sql語句執行

16.如何解決異常處理?

答: 拋出異常:使用try...catch,異常的代碼放在try代碼塊內,若是沒有觸發異常,則代碼繼續執行,若是異常被觸發,就會        拋出一個異常。Catch代碼塊捕獲異常,並建立一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。

    解決異常:使用set_error_handler函數獲取異常(也能夠使用try()和catch()函數),而後使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面全部的php語句都執行完成時,再調用此函數

17.前端

答:我在工做中處理前端的功能,通常就是用ajax向後臺請求數據,而後返回數據在前臺頁面中顯示出來。我歷來沒有獨立的完整的將html和css樣式都一我的完成,若是公司實在有這樣的需求的話,我可能會找一些前臺的模板或者說是前端的框架,好比說h—ui等等

18.權限管理(RBAC)的實現?

答: 1.首先建立一張用戶表:id name auto(保存格式爲:控制器-方法)

    2.而後在後臺中建立一個基類控制器,控制器裏封裝一個構造方法,當用戶登錄成功後,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,而後實例化模型,經過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,並使用一個數組保存起來,而後使用TP框架中封裝好的常量獲取當前控制器和方法,而後把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,若是沒有,就提示該用戶沒有權限,若是有就進行下一步操做

19.支付功能的實現?

答:

20.怎麼保證促銷商品不會超賣

答:這個問題是咱們當時開發時遇到的一個難點,超賣的緣由主要是下的訂單的數目和咱們要促銷的商品的數目不一致致使的,每次老是訂單的數比咱們的促銷商品的數目要多,當時咱們的小組討論了很久,給出了好幾個方案來實現:

第一種方案是:①在每次下訂單前咱們判斷促銷商品的數量夠不夠,不夠不容許下訂單,更改庫存量時加上一個條件,只更改商品庫存大於0的商品的庫存,當時咱們使用ab進行壓力測試,當併發超過500,訪問量超過2000時,仍是會出現超賣現象。因此被咱們否認了。

第二種方案是:②使用mysql的事務加排他鎖來解決,首先咱們選擇數據庫的存儲引擎爲innoDB,使用的是排他鎖實現的,剛開始的時候咱們測試了下共享鎖,發現仍是會出現超賣的現象。有個問題是,當咱們進行高併發測試時,對數據庫的性能影響很大,致使數據庫的壓力很大,最終也被咱們否認了。

第三種方案是:③使用文件鎖實現。當用戶搶到一件促銷商品後先觸發文件鎖,防止其餘用戶進入,該用戶搶到促銷品後再解開文件鎖,放其餘用戶進行操做。這樣能夠解決超賣的問題,可是會致使文件得I/O開銷很大。

最後咱們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操做起來很方便,並且效率極高,最終咱們採起這種方式來實現

21.商城秒殺的實現

答:搶購、秒殺是現在很常見的一個應用場景,主要須要解決的問題有兩個:
    1 高併發對數據庫產生的壓力
    2 競爭狀態下如何解決庫存的正確減小(」超賣」問題)
   對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操做數據庫,例如使用Redis。第二個問題,咱們能夠使用redis隊列來完成,把要秒殺的商品放入到隊列中,由於pop操做是原子的,即便有不少用戶同時到達,也是依次執行,文件鎖和事務在高併發下性能降低很快,固然還要考慮其餘方面的東西,好比搶購頁面作成靜態的,經過ajax調用接口,其中也可能會出現一個用戶搶屢次的狀況,這時候須要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高併發狀況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,若是在,則已搶購,不然未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

22.購物車的原理

答:購物車至關於現實中超市的購物車,不一樣的是一個是實體車,一個是虛擬車而已。用戶能夠在購物網站的不一樣頁面之間跳轉,以選購本身喜好的商品,點擊購買時,該商品就自動保存到你的購物車中,重複選購後,最後將選中的全部商品放在購物車中統一到付款臺結帳,這也是儘可能讓客戶體驗到現實生活中購物的感受。服務器經過追蹤每一個用戶的行動,以保證在結帳時每件商品都物有其主。   

主要涉及如下幾點:

    一、把商品添加到購物車,即訂購
    二、刪除購物車中已定購的商品
    三、修改購物車中某一本圖書的訂購數量
    四、清空購物車
    五、顯示購物車中商品清單及數量、價格

實現購物車的關鍵在於服務器識別每個用戶並維持與他們的聯繫。可是HTTP協議是一種「無狀態(Stateless)」的協議,於是服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車裏原先有些什麼,使得用戶在不一樣頁面間跳轉時購物車沒法「隨身攜帶」,這都給購物車的實現形成了必定的困難。

23.目前購物車的實現主要是經過cookie、session或結合數據庫的方式。下面分析一下它們的機制及做用。

cookie

cookie是由服務器產生,存儲在客戶端的一段信息。它定義了一種Web服務器在客戶端存儲和返回信息的機制,cookie文件它包含域、路徑、生存期、和由服務器設置的變量值等內容。當用戶之後訪問同一個Web服務器時,瀏覽器會把cookie原樣發送給服務器。經過讓服務器讀取原先保存到客戶端的信息,網站可以爲瀏覽者提供一系列的方便,例如在線交易過程當中標識用戶身份、安全要求不高的場合避免用戶重複輸入名字和密碼、門戶網站的主頁定製、有針對性地投放廣告等等。利用cookie的特性,大大擴展了WEB應用程序的功能,不只能夠創建服務器與客戶機的聯繫,由於cookie能夠由服務器定製,所以還能夠將購物信息生成cookie值存放在客戶端,從而實現購物車的功能。用基於cookie的方式實現服務器與瀏覽器之間的會話或購物車,有如下特色:

一、cookie存儲在客戶端,且佔用不多的資源,瀏覽器容許存放300個cookie,每一個cookie的大小爲4KB,足以知足購物車的要求,同時也減輕了服務器的負荷;
二、cookie爲瀏覽器所內置,使用方便。即便用戶不當心關閉了瀏覽器窗口,只要在cookie定義的有效期內,購物車中的信息也不會丟失;
三、cookie不是可執行文件,因此不會以任何方式執行,所以也不會帶來病毒或攻擊用戶的系統;
四、基於cookie的購物車要求用戶瀏覽器必須支持並設置爲啓用cookie,不然購物車則失效;
五、存在着關於cookie侵犯訪問者隱私權的爭論,所以有些用戶會禁止本機的cookie功能。

session

session是實現購物車的另外一種方法。session提供了能夠保存和跟蹤用戶的狀態信息的功能,使當前用戶在session中定義的變量和對象能在頁面之間共享,可是不能爲應用中其餘用戶所訪問,它與cookie最重大的區別是,session將用戶在會話期間的私有信息存儲在服務器端,提升了安全性。在服務器生成session後,客戶端會生成一個sessionid識別號保存在客戶端,以保持和服務器的同步。這個sessionid是隻讀的,若是客戶端禁止cookie功能,session會經過在URL中附加參數,或隱含在表單中提交等其餘方式在頁面間傳送。所以利用session實施對用戶的管理則更爲安全、有效。

一樣,利用session也能實現購物車,這種方式的特色是:
一、session用新的機制保持與客戶端的同步,不依賴於客戶端設置;
二、與cookie相比,session是存儲在服務器端的信息,所以顯得更爲安全,所以可將身份標示,購物等信息存儲在session中;
三、session會佔用服務器資源,加大服務器端的負載,尤爲當併發用戶不少時,會生成大量的session,影響服務器的性能;
四、由於session存儲的信息更敏感,並且是以文件形式保存在服務器中,所以仍然存在着安全隱患。

結合數據庫的方式

這也是目前較廣泛的模式,在這種方式中,數據庫承擔着存儲購物信息的做用,session或cookie則用來跟蹤用戶。這種方式具備如下特色:
一、數據庫與cookie分別負責記錄數據和維持會話,能發揮各自的優點,使安全性和服務器性能都獲得了提升;
二、每個購物的行爲,都要直接創建與數據庫的鏈接,直至對錶的操做完成後,鏈接才釋放。當併發用戶不少時,會影響數據庫的性能,所以,這對數據庫的性能提出了更高的要求;
三、使cookie維持會話有賴客戶端的支持。

各類方式的選擇:
雖然cookie可用來實現購物車,但必須得到瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,因此這也限制了它存儲更多,更重要的信息。因此通常cookie只用來維持與服務器的會話,例如國內最大的當當網絡書店就是用cookie保持與客戶的聯繫,可是這種方式最大的缺點是若是客戶端不支持cookie就會使購物車失效。

Session 能很好地與交易雙方保持會話,能夠忽視客戶端的設置。在購物車技術中獲得了普遍的應用。但session的文件屬性使其仍然留有安全隱患。

結合數據庫的方式雖然在必定程度上解決了上述的問題,但從上面的例子能夠看出:在這種購物流程中涉及到對數據庫表的頻繁操做,尤爲是用戶每選購一次商品,都要與數據庫進行鏈接,當用戶不少的時候就加大了服務器與數據庫的負荷。 
23.redis消息隊列先進先出須要注意什麼 
答:一般使用一個list來實現隊列操做,這樣有一個小限制,因此的任務統一都是先進先出,若是想優先處理某個任務就不太好處理了,這就須要讓隊列有優先級的概念,咱們就能夠優先處理高級別的任務,實現方式有如下幾種方式:

1)單一列表實現:隊列正常的操做是 左進右出(lpush,rpop)爲了先處理高優先級任務,在遇到高級別任務時,能夠直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop)

2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不一樣的隊列,獲取任務時也很簡單,redis的BRPOP命令能夠按順序從多個隊列中取值,BRPOP會按照給出的 key 順序查看,並在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0

list1 作爲高優先級任務隊列
list2 作爲普通任務隊列

這樣就實現了先處理高優先級任務,當沒有高優先級任務時,就去獲取普通任務

方式1最簡單,但實際應用比較侷限,方式3能夠實現複雜優先級,但實現比較複雜,不利於維護

方式2是推薦用法,實際應用最爲合適

24.你負責的模塊有哪些難題

答:在我負責的B2B電商項目中,當時我負責的是訂單模塊,因爲客戶一次選擇了多家商戶的商品,最終生成了一個訂單,這樣咱們平臺在給商戶結算時出現了不知道這比費用應該給哪一個商戶,這時候咱們小組通過討論,須要涉及到訂單拆分,也就是說用戶點擊支付後,若是有多件商品,而且不是同一家店鋪那麼 就要用到訂單的拆分,好比若是有兩件商品,而且不是同一店鋪 就在原來的訂單號下 在生成兩個子訂單號 並修改訂單表中兩件商品的訂單號。最終實現了商品的分配管理,解決了咱們的難題。

我以爲在開發過程當中,遇到的難題無非是兩個,一個是技術層次的,我認爲,只要你有恆心,有熱心,沒有以爲不了的難題。另外一個就是溝通問題,在任何地方任什麼時候候溝通都是最重要的,尤爲是咱們作開發的,不溝通好,會影響整個項目的進度,我本人是個很是還溝通的人,因此這點上也沒多大問題。

25.用戶下單是怎麼處理的

答:判斷用戶有沒有登陸,在沒有登陸的狀況下,不容許下單。登錄後,可進行下單

並生成惟一的訂單號,此時訂單的狀態爲未支付。

26.電商的登陸是怎麼實現的

答:分爲普通登陸和第三方登陸 這邊主要說一下第三方登陸吧,第三方登錄主要使用的是author協議,我就以QQ的第三方登錄爲例來進行說明:當用戶在咱們的站點請求QQ的第三方登錄時,咱們站點會引導用戶跳轉到QQ的登錄受權界面, 當用戶輸入QQ和密碼成功登陸之後會自動跳回到咱們站點設置好的回調頁面,並附帶一個code參數,接着你使用code再次去請求QQ的受權頁面,就能夠從中獲取到一個access token(訪問令牌),經過這個access_token,咱們能夠調用QQ提供給咱們的接口,好比獲取open_id,能夠獲取用戶的基本信息。獲取到以後,咱們須要拿用戶的受權信息和open_id和咱們平臺的普通用戶進行綁定。這樣無論是普通用戶登錄仍是第三方登錄用戶,均可以實現登錄。

27.接口安全方面是怎麼處理的

答:咱們當時是這麼作的,使用HTTP的POST方式,對固定參數+附加參數進行數字簽名,使用的是md5加密,好比:我想經過標題獲取一個信息,在客戶端使用 信息標題+日期+雙方約定好的一個key經過md5加密生成一個簽名(sign),而後做爲參數傳遞到服務器端,服務器端使用一樣的方法進行校驗,如何接受過來的sign和咱們經過算法算的值相同,證實是一個正常的接口請求,咱們纔會返回相應的接口數據。

28.用的什麼技術實現短信發送,在哪調用

答:我主要用的第三方短信接口,在申請接口時進行相應信息的配置,而後在咱們站點須要用到短信驗證的地方進行調用,咱們一般在用戶註冊時使用到。

29.在工做中遇到什麼困難?

答:整體來講:在工做我主要遇到這幾個問題比較難處理:

    ①我以前工做的時候發現常常會出現一些臨時需求打亂了個人計劃,搞得有時候這個任務還沒完成,又得去作其餘的任務,最後一天下來,大大小小的東西是不少,可是沒有完成得很是好的,後面我總結了一下,我會把這些都添加優先級,遇到臨時需求,按照優先級從新將已有任務和臨時任務進行排版,保證在規定時間內有效率的完成優先級高的任務。

    ②在作項目需求時候,遇到理解能力欠佳的人,溝通時容易被氣到,影響本身的情緒,最後反倒還不能到達須要的效果。後面,每次到這種時候,我通常會藉助一些紙質的、更加形象的東西,讓雙方都認同的、都能明白的一種方式來進行溝通,後面減小了不少沒必要須的麻煩。你們都知道,對於程序員來講,改需求是一件很痛苦的事情,因此前期的溝通工做很重要。

    ③還有一件事時,我之前的領導不太懂技術,因此每次出一個新的需求出來,老是要求咱們在很短的時間內完成,完不成咱們就會被懷疑能力有問題。固然,每一個領導都但願本身的員工可以儘快的完成任務,下降成本,提升效率。這時候我會把咱們的需求細化,把其中的重點、難點都列出來,作好時間規劃,耐心的跟領導溝通,項目每一個點的重要性和時間的花費比例,確保在這個規劃的時間點內保質保量的完成任務。慢慢的也獲得了領導的承認,其實領導也不是一味的不通情理,只要把東西計劃好了,以最小的代價換取最高的價值,每一個人都是很容易理解得

30.用戶不登陸,怎麼直接加入購物車的

答:用戶在不登陸的狀況下,能夠把要購買商品的信息(如商品的ID,商品的價格、商品的sku_id,購買數量等關鍵數據)存到COOKIE裏面,當登錄的狀況下。把COOKIE裏面的內容存到數據庫,並清除cookie中的數據。

31.寫過接口嗎,怎麼定義接口的

答:寫過。接口分爲兩種:一種是數據型接口,一種是應用型接口。

數據型接口:是比抽象類更抽象的某種「結構」——它其實不是類,可是跟類同樣的某種語法結構,是一種結構規範,規範咱們類要以什麼格式進行定義,通常用於團隊比較大,分支比較多的狀況下使用。

應用型接口: API(application interface) 數據對外訪問的一個入口

我主要是參與的APP開發中接口的編寫,客戶端須要什麼樣的數據,咱們就給他們提供相應的數據,數據以json/xml的格式返回,而且配以相應的接口文檔。

32.sku減庫存

答:SKU = Stock Keeping Unit (庫存量單位)   
即庫存進出計量的單位,能夠是以件,盒,托盤等爲單位。SKU是庫存量單位,區分單品。   
在服裝、鞋類商品中使用最多最廣泛。 例如紡織品中一個SKU一般表示:規格、顏色、款式。

在設計表時,不只僅只有商品表,商品表中有個總庫存,咱們還須要涉及一張SKU表,裏面有SKU庫存和單價字段,用戶每購買一件商品,實際上購買的都是SKU商品,這樣在下訂單成功後,應該根據所購買的商品的惟一的SKU號來進行相應的SKU庫存的減小,固然商品的總庫存保存在商品主表中,也須要減小總庫存中的庫存量。

33.庫存設置?

答:庫存分爲商品總庫存和SKU庫存,每每商品總庫存的爲SKU庫存的總和。通常在商城的後臺對貨品設置最高庫存及最低庫存後,當前庫存數量與最高、最低二者比較,超出庫存或者低於庫存的,則被統計成報表形式反映,便於用戶掌握貨品庫存超、短缺狀態及數量。

34.訂單、庫存兩個表 如何保證數據的一致性?

答:在一個電子商務系統中,正常的應該是訂單生成成功後,相應的庫存進行減小。必需要保證二者的一致性,但有時候由於某些緣由,好比程序邏輯問題,併發等問題,致使下單成功而庫存沒有減小的狀況。這種狀況咱們是不容許發生的,MySQL中的事務恰好能夠解決這一問題,首先得選擇數據庫的存儲引擎爲innoDB,事務規定了只有下訂單完成了,而且相應的庫存減小了才容許提交事務,不然就事務回滾,確保數據一致性。

35.O2O用戶下單,c端下單,如何保證b a端數據一致?

答:O2O爲線上和線下模式,O2O模式奉行的是「線上支付+實體店消費」的消費模式,即消費者在網上下單完成支付後,憑消費憑證到實體店消費。O2O模式是把商家信息和支付程序放在線上進行,而把商品和服務兌現放在線下,也就是說O2O模式適用於快遞沒法送達的有形產品。數據一致性的問題是O2O行業中最多見的問題,咱們能夠相似於數據庫的主從複製的思路來解決這個問題。O2O有個供應商系統,相似於主服務器,在C端(從服務器)下單時,數據同步更新到供應商系統端,b、a實時從供應商系統中拉取數據進行同步,好比利用定時任務,定時拉取數據進行同步。

36.Redis 如何防止高併發

答:其實redis是不會存在併發問題的,由於他是單進程的,再多的command都是one by one執行的。咱們使用的時候,可能會出現併發問題,好比get和set這一對。
redis爲何會有高併發問題

redis的出身決定
Redis是一種單線程機制的nosql數據庫,基於key-value,數據可持久化落盤。因爲單線程因此redis自己並無鎖的概念,多個客戶端鏈接並不存在競爭關係,可是利用jedis等客戶端對redis進行併發訪問時會出現問題。發生鏈接超時、數據轉換錯誤、阻塞、客戶端關閉鏈接等問題,這些問題均是因爲客戶端鏈接混亂形成。

同時,單線程的天性決定,高併發對同一個鍵的操做會排隊處理,若是併發量很大,可能形成後來的請求超時。

在遠程訪問redis的時候,由於網絡等緣由形成高併發訪問延遲返回的問題。

解決辦法

在客戶端將鏈接進行池化,同時對客戶端讀寫Redis操做採用內部鎖synchronized。

服務器角度,利用setnx變向實現鎖機制。

37.秒殺當中的細節你是怎麼得出來的

答:經過性能測試及模擬秒殺場景。每一個問題都通過反覆測試,不斷的發現問題,不斷的解決。

38.作秒殺用什麼數據庫,怎麼實現的。

答:由於秒殺的一瞬間,併發很是大,若是同時請求數據庫,會致使數據庫的壓力很是大,致使數據庫的性能急劇降低,更嚴重的可能會致使數據庫服務器宕機。這時候通常採用內存高速緩存數據庫redis來實現的,redis是非關係型數據庫,redis是單線程的,經過redis的隊列能夠完成秒殺過程。

39.支付寶流程怎麼實現的

答:首先要有一個支付寶帳號,接下來向支付寶申請在線支付業務,簽署協議。協議生效後有支付寶一方會給網站方一個合做夥伴ID,和安全校驗碼,有了這兩樣東西就能夠按照支付寶接口文檔開發支付寶接口了,中間主要涉及到一個安全問題。整個流程是這樣的:咱們的網站經過post傳遞相應的參數(如訂單總金額,訂單號)到支付頁面,支付頁面把一系列的參數通過處理,以post的方式提交給支付寶服務器,支付寶服務器進行驗證,並對接收的數據進行處理,把處理後的結果返回給咱們網站設置的異步和同步回調地址,經過相應的返回參數,來處理相應的業務邏輯,好比返回的參數表明支付成功,更改訂單狀態。

40.什麼是單點登陸?

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

41.什麼狀況下使用緩存

答:當用戶第一次訪問應用系統的時候,由於尚未登陸,會被引導到認證系統中進行登陸;根據用戶提供的登陸信息,認證系統進行身份校驗,若是經過校驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候,就會將這個ticket帶上,做爲本身認證的憑據,應用系統接受到請求以後會把 ticket送到認證系統進行校驗,檢查ticket的合法性。若是經過校驗,用戶就能夠在不用再次登陸的狀況下訪問應用系統2和應用系統3了。

實現主要技術點:

    一、兩個站點共用一個數據驗證系統
    二、主要經過跨域請求的方式來實現驗證及session處理。

42.怎麼實現第三方登陸?

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

    一、首先咱們須要以開發者的身份向第三方登錄平臺申請接入應用,申請成功後,咱們會得到一個appID和一個secrectID.
    二、當咱們的網站需接入第三方登錄時,會引導用戶跳轉到第三方的登錄受權頁面,此時把以前申請的appID和secrectID帶給登錄受權頁面。
    三、用戶登錄成功後即獲得受權,第三方會返回一個臨時的code給咱們的網站。
    四、咱們的網站接受到code後,再次向咱們的第三方發起請求,並攜帶接收的code,從第三方獲取access_token.
    五、第三方處理請求後,會返回一個access_token給咱們的網站,咱們的網站獲取到access_token後就能夠調用第三方提供的接口了,好比獲取用戶信息等。最後把該用戶信息存入到咱們站點的數據庫,並把信息保存到session中,實現用戶的第三方登錄。

43.如何處理負載、高併發?(好好看看,常常問到)

答:從低成本、高性能和高擴張性的角度來講有以下處理方案:
一、HTML靜態化
其實你們都知道,效率最高、消耗最小的就是純靜態化的html頁面,因此咱們儘量使咱們的 網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。
二、圖片服務器分離
把圖片單獨存儲,儘可能減小圖片等大流量的開銷,能夠放在一些相關的平臺上,如騎牛等
三、數據庫集羣和庫表散列及緩存
數據庫的併發鏈接爲100,一臺數據庫遠遠不夠,能夠從讀寫分離、主從複製,數據庫集羣方面來着手。另外儘可能減小數據庫的訪問,能夠使用緩存數據庫如memcache、redis。
四、鏡像:
儘可能減小下載,能夠把不一樣的請求分發到多個鏡像端。
五、負載均衡:
Apache的最大併發鏈接爲1500,只能增長服務器,能夠從硬件上着手,如F5服務器。固然硬件的成本比較高,咱們每每從軟件方面着手。

負載均衡 (Load Balancing) 創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力,同時可以提升網絡的靈活性和可用性。目前使用最爲普遍的負載均衡軟件是Nginx、LVS、HAProxy。我分別來講下三種的優缺點:


Nginx的優勢是:

工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構,它的正則規則比HAProxy更爲強大和靈活,這也是它目前普遍流行的主要緣由之一,Nginx單憑這點可利用的場合就遠多於LVS了。

Nginx對網絡穩定性的依賴很是小,理論上能ping通就就能進行負載功能,這個也是它的優點之一;相反LVS對網絡穩定性依賴比較大,這點本人深有體會;

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

能夠承擔高負載壓力且穩定,在硬件不差的狀況下通常能支撐幾萬次的併發量,負載度比LVS相對小些。

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

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

Nginx如今做爲Web反向加速緩存愈來愈成熟了,速度比傳統的Squid服務器更快,能夠考慮用其做爲反向代理加速器。

Nginx可做爲中層反向代理使用,這一層面Nginx基本上無對手,惟一能夠對比Nginx的就只有 lighttpd了,不過 lighttpd目前尚未作到Nginx徹底的功能,配置也不那麼清晰易讀,社區資料也遠遠沒Nginx活躍。

Nginx也可做爲靜態網頁和圖片服務器,這方面的性能也無對手。還有Nginx社區很是活躍,第三方模塊也不少。

Nginx的缺點是:

Nginx僅能支持http、https和Email協議,這樣就在適用範圍上面小些,這個是它的缺點。
對後端服務器的健康檢查,只支持經過端口來檢測,不支持經過url來檢測。不支持Session的直接保持,但能經過ip_hash來解決。
LVS:使用Linux內核集羣實現一個高性能、高可用的負載均衡服務器,它具備很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS的優勢是:

抗負載能力強、是工做在網絡4層之上僅做分發之用,沒有流量的產生,這個特色也決定了它在負載均衡軟件裏的性能最強的,對內存和cpu資源消耗比較低。
配置性比較低,這是一個缺點也是一個優勢,由於沒有可太多配置的東西,因此並不須要太多接觸,大大減小了人爲出錯的概率。
工做穩定,由於其自己抗負載能力很強,自身有完整的雙機熱備方案,如LVS+Keepalived,不過咱們在項目實施中用得最多的仍是LVS/DR+Keepalived。
無流量,LVS只分發請求,而流量並不從它自己出去,這點保證了均衡器IO的性能不會受到大流量的影響。
應用範圍比較廣,由於LVS工做在4層,因此它幾乎能夠對全部應用作負載均衡,包括http、數據庫、在線聊天室等等。
LVS的缺點是:

軟件自己不支持正則表達式處理,不能作動靜分離;而如今許多網站在這方面都有較強的需求,這個是Nginx/HAProxy+Keepalived的優點所在。
若是是網站應用比較龐大的話,LVS/DR+Keepalived實施起來就比較複雜了,特別後面有 Windows Server的機器的話,若是實施及配置還有維護過程就比較複雜了,相對而言,Nginx/HAProxy+Keepalived就簡單多了。
HAProxy的特色是:

HAProxy也是支持虛擬主機的。
HAProxy的優勢可以補充Nginx的一些缺點,好比支持Session的保持,Cookie的引導;同時支持經過獲取指定的url來檢測後端服務器的狀態。
HAProxy跟LVS相似,自己就只是一款負載均衡軟件;單純從效率上來說HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。
HAProxy支持TCP協議的負載均衡轉發,能夠對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,你們能夠用LVS+Keepalived對MySQL主從作負載均衡。
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對比的總結:

Nginx工做在網絡的7層,因此它能夠針對http應用自己來作分流策略,好比針對域名、目錄結構等,相比之下LVS並不具有這樣的功能,因此Nginx單憑這點可利用的場合就遠多於LVS了;但Nginx有用的這些功能使其可調整度要高於LVS,因此常常要去觸碰觸碰,觸碰多了,人爲出問題的概率也就會大。

Nginx對網絡穩定性的依賴較小,理論上只要ping得通,網頁訪問正常,Nginx就能連得通,這是Nginx的一大優點!Nginx同時還能區份內外網,若是是同時擁有內外網的節點,就至關於單機擁有了備份線路;LVS就比較依賴於網絡環境,目前來看服務器在同一網段內而且LVS使用direct方式分流,效果較能獲得保證。另外注意,LVS須要向託管商至少申請多一個ip來作Visual IP,貌似是不能用自己的IP來作VIP的。要作好LVS管理員,確實得跟進學習不少有關網絡通訊方面的知識,就再也不是一個HTTP那麼簡單了。

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

Nginx也一樣能承受很高負載且穩定,但負載度和穩定度差LVS還有幾個等級:Nginx處理全部流量因此受限於機器IO和配置;自己的bug也仍是難以免的。

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

Nginx對請求的異步處理能夠幫助節點服務器減輕負載,假如使用 apache直接對外服務,那麼出現不少的窄帶連接時apache服務器將會佔用大 量內存而不能釋放,使用多一個Nginx作apache代理的話,這些窄帶連接會被Nginx擋住,apache上就不會堆積過多的請求,這樣就減小了至關多的資源佔用。這點使用squid也有相同的做用,即便squid自己配置爲不緩存,對apache仍是有很大幫助的。

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。

數據庫優化

44.作秒殺時鎖表考慮到沒有?

答:考慮到了,當時咱們作秒殺時考慮了好幾種方案,其中有一種就是使用事務加上排他鎖來實現。

架構類的東西接觸過嗎?
有接觸過,曾經本身在本身的服務器上配置過。我之前作過如下幾個架構方面的配置和測試;
一、數據庫的讀寫分離、主從複製及集羣。
二、Nginx負載均衡 
三、redis集羣及主從

45.封裝過一個簡單的框架

答;封裝過一個簡單的MVC框架,主要分爲3層,控制器層和模型層視圖層,以及路由的分配和入口文件,模板引擎,單例模式、工廠模式,第三方類庫的引入等。

46.談談對MVC的認識

答:核心思想是:視圖和用戶交互經過事件致使控制器改變 控制器改變致使模型改變 或者控制器同時改變二者 模型改變 致使視圖改變 或者視圖改變 潛在的從模型裏面得到參數 來改變本身。他的好處是能夠將界面和業務邏輯分離。

Model(模型),是程序的主體部分,主要包含業務數據和業務邏輯。在模型層,還會涉及到用戶發佈的服務,在服務中會根據不一樣的業務需求,更新業務模型中的數據。
View(視圖),是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在View視圖層輸入本身特定的業務數據,並經過界面的事件交互,將對應的輸入參數提交給後臺控制器進行處理。
Contorller(控制器),Contorller是用來處理用戶 輸入數據,已經更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,並根據數據業務邏輯來執行服務的調用和更新業務模型的數據和狀態。

47.session與cookie的區別

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

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE,進行COOKIE欺騙

考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能

考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
五、因此我的建議:
    將登錄信息等重要信息存放爲SESSION
    其餘信息若是須要保留,能夠放在COOKIE

48.echo(),print(),print_r()的區別

答: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的結果沒有意義,由於都是打印"\n"。所以用var_dump()函數更適合調試。print_r是函數,能夠打印出比較複雜的變量(如數組,對象),有返回值
var_dump()判斷一個變量的類型與長度,並輸出變量的數值,若是變量有值輸的是變量的值並回返數據類型。此函數顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。數組將遞歸展開值,經過縮進顯示其結構。

49.說一下單引號雙引號?

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

②單引號解析速度比雙引號快。

③單引號只能解析部分特殊字符,雙引號能夠解析全部特殊字符。

50.索引的優缺點

答:一、優勢:
a)能夠保證數據庫表中每一行的數據的惟一性 
b)能夠大大加快數據的索引速度 
c)加速表與表之間的鏈接,物別是在實現數據的參考完事性方面特別有意義 
d)在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間 
f)經過使用索引,能夠在時間查詢的過程當中,使用優化隱藏器,提升系統的性能

二、 缺點: 
a) 建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長 
b) 索引須要佔物理空間,除了數據表佔用數據空間以外,每個索引還要佔用必定的物理空間,若是須要創建聚簇索引,那麼須要佔用的空間會更大 
c) 以表中的數據進行增、刪、改的時候,索引也要動態的維護,這就下降了整數的維護速度 
d) 創建索引的原則 
e) 在常常須要搜索的列上,能夠加快搜索的速度 
f) 在做爲主鍵的列上,強制該列的惟一性和組織表中數據的排列結構 
g) 在常常用在鏈接的列上,這些列主要是一外鍵,能夠加快鏈接的速度 
h) 在經常常須要根據範圍進行搜索的列上建立索引,國爲索引已經排序,其指定的範圍是連續的 
i) 在常常須要排序的列上,國爲索引已經排序,這樣井底能夠利用索引的排序,加快排序井底時間 
j) 在常用在where子句中的列上,加快條件的判斷速度

51.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方法好。

52.如何修改session的生存時間

答:一:在php.ini 中設置 session.gc_maxlifetime = 1440 //默認時間
二:代碼實現
    $lifeTime = 24 * 3600;  // 保存一天 
    session_set_cookie_params($lifeTime); 
    session_start();

53.Linux基本命令,目錄結構

答:arch 顯示機器的處理器架構(1) 
uname -m 顯示機器的處理器架構(2) 
uname -r 顯示正在使用的內核版本 
dmidecode -q 顯示硬件系統部件 - (SMBIOS / DMI) 
hdparm -i /dev/hda 羅列一個磁盤的架構特性 
hdparm -tT /dev/sda 在磁盤上執行測試性讀取操做 
cat /porc/cpuinfo 顯示CPU info的信息 
cat /porc/interrupts 顯示中斷 
cat /porc/meminfo 校驗內存使用 
cat /porc/swaps 顯示哪些swap被使用 
cat /porc/verion 顯示內核的版本 
cat /porc/net/dev 顯示網絡適配器及統計 
cat /porc/mounts 顯示已加載的文件系統 

date 顯示系統日期 
cal 2007 顯示2007年的日曆表 
date 041217002007.00 設置日期和時間 -月日時分年.秒 
clock -w 將時間修改保存到 BIOS 

文件搜索 
find / -name file1 從 '/'開始進入根文件系統搜索文件和目錄 

locate \*.ps 尋找以 '.ps'結尾的文件 -先運行'updatedb'命令 
whereis halt 顯示一個二進制文件、源碼或man的位置 
which halt 顯示一個二進制文件或可執行文件的完整路徑 

掛載一個文件系統 
mount /dev/hda2 /mnt/hda2 掛載一個叫作hda2的盤- 肯定目錄'/ mnt/hda2' 已經存在 
umount /dev/hda2 卸載一個叫作hda2的盤- 先從掛載點'/ mnt/hda2' 退出 

追加命令

1,linux裏把文件/etc/aaa中的內容追加到/usr/bbb中的內容的後面
  sudo cat /etc/aaa >>/usr/bbb
2,更改/etc/index.html的文件全部者爲apache,文件羣組爲apache
  sudo chmod apache:apache  /etc/index.html
3,更改/etc/index.html的全部者權限爲讀取、寫入、執行。羣組權限爲讀取。其餘權限爲讀取
  sudo chmod 744 /etc/index.html
4,刪除/etc下名爲hello的文件
  sudo rm /etc/index.html

固然,若是你是以orot用戶執行以上操做,能夠去掉前邊的sudo!

df -hl 查看磁盤剩餘空間

df -h 查看每一個根路徑的分區大小

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

du -sm [文件夾] 返回該文件夾總M數

關機 (系統的關機、重啓以及登出) 
shutdown -h now 關閉系統(1) 
init 0 關閉系統(2) 
telinit 0 關閉系統(3) 
shutdown -h hour:minutes & 按預約時間關閉系統 
shutdown -c 取消按預約時間關閉系統 
shutdown -r now 重啓(1) 
reboot 重啓(2) 
logout 註銷

文件和目錄 
pwd 顯示工做路徑 
ls 查看目錄中的文件 
ls -F 查看目錄中的文件 
ls -l 顯示文件和目錄的詳細資料 
ls -a 顯示隱藏文件 
ls *[0-9]* 顯示包含數字的文件名和目錄名 
tree 顯示文件和目錄由根目錄開始的樹形結構(1) 
lstree 顯示文件和目錄由根目錄開始的樹形結構(2) 
mkdir dir1 建立一個叫作 'dir1'的目錄' 

磁盤空間 
df -h 顯示已經掛載的分區列表 
ls -lSr |more 以尺寸大小排列文件和目錄 
du -sh dir1 估算目錄 'dir1'已經使用的磁盤空間' 

下載、解壓

1)對於.tar結尾的文件 
  tar -xf all.tar 

2)對於.gz結尾的文件 
  gzip -d all.gz 
  gunzip all.gz 

# zip all.zip *.jpg 
  這條命令是將全部.jpg的文件壓縮成一個zip包 
# unzip all.zip 
  這條命令是將all.zip中的全部文件解壓出來

下載命令

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

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

Shell 腳本:

必須以  #!/bin/sh  開頭

簡單例子:判斷這個目錄下有沒有文件(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  這個命令可以統計文件個數 爲0就是沒有文件 非零就是有文件

54..memcache緩存什麼數據

答:1、常常被讀取而且實時性要求不強能夠等到自動過時的數據。例如網站首頁最新文章列表、某某排行等數據。

2、常常被讀取而且實時性要求強的數據。好比用戶的好友列表,用戶文章列表,用戶閱讀記錄等。

3、統計類緩存,好比文章瀏覽數、網站PV等。

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

5、session數據

55.魔術方法、魔術常量

答:1。__construct()
實例化對象時被調用,當__construct和以類名爲函數名的函數同時存在時,__construct將被調用,另外一個不被調用。

2。__destruct()
當刪除一個對象或對象操做終止時被調用。

3。__call()
對象調用某個方法,若方法存在,則直接調用;若不存在,則會去調用__call函數。

4。__get()
讀取一個對象的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會調用__get函數。

5。__set()
設置一個對象的屬性時,若屬性存在,則直接賦值;若不存在,則會調用__set函數。

6。__toString()
打印一個對象的時被調用。如echo obj;或printobj;

7。__clone()
克隆對象時被調用。如:t=newTest();t1=clone $t;

8。__sleep()
serialize以前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。

9。__wakeup()
unserialize時被調用,作些對象的初始化工做。

10。__isset()
檢測一個對象的屬性是否存在時被調用。如:isset($c->name)。

11。__unset()
unset一個對象的屬性時被調用。如:unset($c->name)。

12。__set_state()
調用var_export時,被調用。用__set_state的返回值作爲var_export的返回值。

13。__autoload()
實例化一個對象時,若是對應的類不存在,則該方法被調用。

魔術常量

1。__LINE__
返回文件中的當前行號。

2。__FILE__
返回文件的完整路徑和文件名。若是用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 老是包含一個絕對路徑,而在此以前的版本有時會包含一個相對路徑。

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

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

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

6.__set()當程序試圖寫入一個不存在或者不可見的成員變量時,__set()方法包含兩個參數,分別表示變量名稱和變量值,兩個參數都不可省略

7.__get()當程序試圖調用一個未定義或不可見的成員變量時,__get()方法有一個參數,表示要調用的變量名

__sleep() 經常使用於提交未提交的數據,或相似的清理操做若是有一些很大的對象,但不須要所有保存,這個功能就很好用。

__construct()  在類實例化對象的同時執行該函數

__distruct() 在類實例化的對象銷燬時執行

__call()對象調用某個方法,若方法存在,則直接調用;若不存在,則會去調用__call函數。

__clone()克隆對象時被調用。如:$t=new Test();$t1=clone $t;

__toString()打印一個對象的時被調用。如echo $obj;或print $obj;

__isset()檢測一個對象的屬性是否存在時被調用。如:isset($c->name)。

__unset()unset一個對象的屬性時被調用。如:unset($c->name)。

__autoload()實例化一個對象時,若是對應的類不存在,則該方法被調用。

56.接口和抽象類的區別是什麼?

答:抽象類是一種不能被實例化的類,只能做爲其餘類的父類來使用。抽象類是經過關鍵字abstract來聲明的。
抽象類與普通類類似,都包含成員變量和成員方法,二者的區別在於,抽象類中至少要包含一個抽象方法,抽象方法沒有方法體,該方法天生就是要被子類重寫的。
抽象方法的格式爲:abstract function abstractMethod();

接口是經過 interface 關鍵字來聲明的,接口中的成員常量和方法都是 public 的,方法能夠不寫關鍵字public,接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現的。
抽象類和接口實現的功能十分類似,最大的不一樣是接口能實現多繼承。在應用中選擇抽象類仍是接口要看具體實現。
子類繼承抽象類使用 extends,子類實現接口使用implements。

57.什麼是隊列?排它鎖,Myisam死鎖如何解決?

答:在默認狀況下MYisam是表級鎖,因此同時操做單張表的多個動做只能以隊列的方式進行;

排它鎖又名寫鎖,在SQL執行過程當中爲排除其它請求而寫鎖,在執行完畢後會自動釋放;

死鎖解決:先找到死鎖的線程號,而後殺掉線程ID

58.bootstrap框架有哪些優勢?

答:bootstrap是一款web開發框架,它由CSS,JavaScript,Html,三部分構成,它簡潔靈活,使得web開發更加的快捷
優勢:
    ①節省時間: 使用bootstrap框架,能夠大大的節省項目開發時間,它包含了不少現成的代碼,若是須要使用,只須要找到合適的代碼,插入合適的位置便可,此外,CSS是使用LESS編寫,不少樣式和設計都已經設計完成了
    ②定製化: bootstrap能夠根據本身的項目,留取框架中本身須要的部分
    ③設計合理: 
    
1. 柵格系統: bootstrap定義12格柵系統,在頁面已經完成時,你能夠根據合適的網格,以本身的需求改變行數和佈局大小,樣式已經開發完成了,只須要把代碼放入合適的HTML代碼位置便可 
2. LESS: LESS是基於CSS之上的高級語言,其目的是使得CSS開發更加靈活,更增強大 
3. JavaScript:bootstrap提供JavaScript庫,該庫超越了基本的架構和樣式,開發者能夠輕鬆的操做窗口警告框,工具提示框等,可避免了咱們費神費力的寫腳本 
④一致性: bootstrap能夠保證界面在不一樣平臺的統一性,不管實在IE,Chrome等 
⑤持續更新: bootstrap在不斷的改進,更具規律性和持續性 
⑥響應式: 不管是在PC端仍是移動端,均可以保持界面的一致性 
⑦文檔多: bootstrap的很是多
相關文章
相關標籤/搜索