PHP 面試詳解之技術篇

A_aliane發表於2019-05-21

最近在面試,總結總結遇到的面試題.

tp框架

優點

TP框架是我們中國人自己開發的框架,各種資料比較齊全,國內用的比較多,比較簡單
和方便,而且是免費開源的

特性

  • 多表查詢非常方便,在 model 中幾句程式碼就可以完成對多表的關聯操作
  • 融合了 smarty 模板,使前後臺分離
  • 支援多種快取技術,尤其對 memcache 技術支援非常好
  • 命名規範,模型,檢視,控制器嚴格遵循命名規則,通過命名一一對應
  • 支援多種 url 模式
  • 內建 ajax 返回方法,包括 xml,json,html 等
  • 支援應用擴充套件,類庫擴充套件,驅動擴充套件

大寫字母

U:對 url 的組裝 A:內部例項化控制器 S:快取處理 R:呼叫某個控制器的操作方法 D:例項化
自定義模型類 M:例項化基礎模型類 I:獲取引數 L:設定或者獲取當前語言 C:設定或獲取,
儲存配置

laravel框架

簡介

laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你
準備好了一切,composer是php的未來,沒有 composer,php肯定要走向沒落
laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計
模式,Ioc模式,依賴注入等.

特點

1.強大的rest router:用簡單的回撥函式就可以呼叫,快速繫結controller和router
2.artisan:命令列工具,很多手動的工作都自動化
3.可繼承的模板,簡化 view的開發和管理
4.blade模板:渲染速度更快
5.ORM運算元據庫
6.migration:管理資料庫和版本控制
7.測試功能也很強大
8.composer也是亮點
laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等

是什麼

oop是物件導向程式設計,物件導向程式設計是一種計算機程式設計架構,OOP 的一條基本原則是
計算機程式是由單個能夠起到子程式作用的單元或物件組合而成。

三大特點

1、封裝性:也稱為資訊隱藏,就是將一個類的使用和實現分開,只保留部分介面和方
法與外部聯絡,或者說只公開了一些供開發人員使用的方法。於是開發人員只 需要關
注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,
也能有效避免程式間相互依賴,實現程式碼模組間鬆藕合。
2、繼承性:就是子類自動繼承其父級類中的屬性和方法,並可以新增新的屬性和方法
或者對部分屬性和方法進行重寫。繼承增加了程式碼的可重用性。PHP只支援單繼承,也
就是說一個子類只能有一個父類。
3、多型性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。於
是多個子類中雖然都具有同一個方法,但是這些子類例項化的物件呼叫這些相同的方法
後卻可以獲得完全不同的結果,這種技術就是多型性。多型性增強了軟體的靈活性。

設計模式的五大原則

  • 單一職責原則 單一職責原則可以看做是低耦合、高內聚在物件導向原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因
  • 開發封閉原則 開放-封閉原則是物件導向設計的核心所在。遵循這個原則可以帶來物件導向技術所聲稱的巨大好處,也就是可維護,可擴充套件,可複用,靈活性好。
  • 介面隔離原則 通俗點說,不要強迫客戶使用它們不用的方法,如果強迫使用者使用它們不使用的方法,那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。
  • 依賴倒置原則 依賴倒置原則其實可以說是物件導向設計的標誌,用哪種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是物件導向的設計,反之那就是過程化的設計了。
  • 里氏替換原則 任何基類可以出現的地方,子類一定可以出現。 LSP是繼承複用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。

好處

1、易維護 採用物件導向思想設計的結構,可讀性高,由於繼承的存在,即使改變需求,那麼維護
也只是在區域性模組,所以維護起來是非常方便和較低成本的。
2、質量高 在設計時,可重用現有的,在以前的專案的領域中已被測試過的類使系統滿足業務需求
並具有較高的質量。
3、效率高 在軟體開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法
解決問題,接近於日常生活和自然的思考方式,勢必提高軟體開發的效率和質量。
4、易擴充套件 由於繼承、封裝、多型的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈
活、更容易擴充套件,而且成本較低。

  • smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一 ,它分離了邏輯程式碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php
  • 邏輯程式碼與html程式碼進行分離,smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過
  • smarty是個模板引擎,最顯著的地方就是有可以把模板快取起來。一般模板來說,都是做一個靜態頁面,然後在裡面把一些動態的部分用一切分隔符切開,然後在PHP裡開啟這個模板檔案,把分隔符裡面的值替換掉,然後輸出來,你可以看下PHPLib裡面的template部分。

而smarty設定了快取引數以後,第一次執行時候會把模板開啟,在php替換裡面值的
時候把讀取的html和php部分重新生成一個臨時的php檔案,這樣就省去了每次打
開都重新讀取html了。如果修改了模板,只要重新刷下就行了。

結構層

從結構層: web 伺服器採用負載均衡伺服器,mysql 伺服器採用主從複製,讀寫分離

負載均衡

Nginx負載均衡伺服器 在nginx裡面配置一個upstream,然後把相關的伺服器ip都配置進去。然後採用輪詢的方案,然後在nginx裡面的配置項裡,proxy-pass指向這個upst;eam,這樣就能實現負載均衡。

nginx的負載均衡有4種模式:

  • 輪詢(預設)每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
  • Weight 指定輪詢機率,weight和訪問比率成正比, 用於後端伺服器效能不均的情況。
  • ip_hash 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
  • fair(第三方)按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
  • url_hash(第三方)

使用nginx與apache相比

最核心的區別在於apache是同步多程式模型,一個連線對應一個程式;nginx是非同步的,多個連線(萬級別)可以對應一個程式 (nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的)
在高併發下nginx 能保持低資源低消耗高效能。
apache 相對於nginx 的優點: rewrite ,比nginx 的rewrite 強大 模組超多,基本想到的都可以找到 少bug 。

主從複製

支援的複製型別 :

1) 基於語句的複製。在伺服器上執行sql語句,在從伺服器上執行同樣的語句,mysql預設採用基於語句的複製,執行效率高。
2) 基於行的複製。把改變的內容複製過去,而不是把命令在從伺服器上執行一遍。
3) 混合型別的複製。預設採用基於語句的複製,一旦發現基於語句無法精確複製時,就會採用基於行的複製。

主從形式:

1.一主一從
2.一主多從,提高系統的讀效能
注:一主一從和一主多從是最常見的主從架構,實施起來簡單並且有效,不僅可以實現HA,而且還能讀寫分離,進而提升叢集的併發能力。
3.多主一從(5.7以後支援) 多主一從可以將多個mysql資料庫備份到一臺儲存效能比較好的伺服器上。
4.雙主複製,也就是互做主從複製,每個master既是master,又是另外一臺伺服器的slave。這樣任何一方所做的變更,都會通過複製應用到另外一方的資料庫中。
5.級聯複製,級聯複製模式下,部分slave的資料同步不連線主節點,而是連線從節點。因為如果主節點有太多的從節點,就會損耗一部分效能用於replication,那麼我們可以讓3~5個從節點連線主節點,其它從節點作為二級或者三級與從節點連線,這樣不僅可以緩解主節點的壓力,並且對資料一致性沒有負面影響。

原理:

MySQL主從複製涉及到三個執行緒,一個執行在主節點(log dump thread),其餘兩個(I/O thread, SQL thread)執行在從節點

主節點binary log dump 執行緒

當從節點連線主節點時,主節點會建立一個log dump 執行緒,用於傳送bin-log的內容。在讀取bin-log中的操作時,此執行緒會對主節點上的bin-log加鎖,當讀取完成,甚至在發動給從節點之前,鎖會被釋放。

從節點I/O執行緒

當從節點上執行 start slave 命令之後,從節點會建立一個I/O執行緒用來連線主節點,請求主庫中更新的bin-log。I/O執行緒接收到主節點 binlog dump 程式發來的更新之後,儲存在本地relay-log中。

從節點SQL執行緒

SQL執行緒負責讀取relay log中的內容,解析成具體的操作並執行,最終保證主從資料的一致性。

主從複製模式

  • 主從複製預設是非同步模式
  • 非同步模式,主節點不會主動push bin log到從節點,這樣有可能導致failover的情況下,也許從節點沒有即時地將最新的bin log同步到本地。
  • 半同步模式主節點只需要接收到其中一臺從節點的返回資訊,就會commit;否則需要等待直到超時時間然後切換成非同步模式再提交;這樣做的目的可以使主從資料庫的資料延遲縮小,可以提高資料安全性,確保了事務提交後,binlog至少傳輸到了一個從節點上,不能保證從節點將此事務更新到db中。效能上會有一定的降低,響應時間會變長。
  • 全同步模式是指主節點和從節點全部執行了commit並確認才會向客戶端返回成功

解決的問題

  • 資料分佈:隨意停止或開始複製,並在不同地理位置分佈資料備份
  • 負載均衡:降低單個伺服器的壓力
  • 高可用和故障切換:幫助應用程式避免單點失敗
  • 升級測試:可以使用更高版本的 MYSQL作為從庫

讀寫分離

什麼是讀寫分離

讀寫分離就是在主伺服器上修改,資料會同步到從伺服器,從伺服器只能提供讀取資料,不能寫入,實現備份的同時也實現了資料庫效能的優化,以及提升了伺服器安全。

為什麼要讀寫分離

因為資料庫的“寫”(寫10000條資料到oracle可能要3分鐘)操作是比較耗時的。但是資料庫的“讀”(從oracle讀10000條資料可能只要5秒鐘)。所以讀寫分離,解決的是,資料庫的寫入,影響了查詢的效率。

常見的Mysql讀寫分離分為以下兩種:

基於程式程式碼內部實現

在程式碼中根據select 、insert進行路由分類,這類方法也是目前生產環境下應用最廣泛的。優點是效能較好,因為程式在程式碼中實現,不需要增加額外的硬體開支。

基於中間代理層實現

代理一般介於應用伺服器和資料庫伺服器之間,代理資料庫伺服器接收到應用伺服器的請求後根據判斷後轉發到,後端資料庫,有以下代表性的程式。

儲存層

從儲存層: 採用合適的儲存引擎,採用三正規化

儲存引擎

目前廣泛使用的是MyISAM和InnoDB兩種引擎

核心區別

  • MyISAM是非事務安全型的,而InnoDB是事務安全型的。
  • MyISAM鎖的粒度是表級,而InnoDB支援行級鎖定。
  • MyISAM支援全文型別索引,而InnoDB不支援全文索引。
  • MyISAM相對簡單,所以在效率上要優於InnoDB,小型應用可以考慮使用MyISAM。
  • MyISAM表是儲存成檔案的形式,在跨平臺的資料轉移中使用MyISAM儲存會省去不少的麻煩。
  • InnoDB表比MyISAM表更安全,可以在保證資料不會丟失的情況下,切換非事務表到事務表(alter table tablename type=innodb)。

應用場景

  • MyISAM管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。如果應用中需要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。
  • InnoDB用於事務處理應用程式,具有眾多特性,包括ACID事務支援。如果應用中需要執行大量的INSERT或UPDATE操作,則應該使用InnoDB,這樣可以提高多使用者併發操作的效能。

Mysql的儲存引擎和索引

  • InnoDB使用的是聚簇索引,將主鍵組織到一棵B+樹中,而行資料就儲存在葉子節點上,若使用"where id = 14"這樣的條件查詢主鍵,則按照B+樹的檢索演算法即可查詢到對應的葉節點,之後獲得行資料。若對Name列進行條件搜尋,則需要兩個步驟:第一步在輔助索引B+樹中檢索Name,到達其葉子節點獲取對應的主鍵。第二步使用主鍵在主索引B+樹種再執行一次B+樹檢索操作,最終到達葉子節點即可獲取整行資料。
  • MyISM使用的是非聚簇索引,非聚簇索引的兩棵B+樹看上去沒什麼不同,節點的結構完全一致只是儲存的內容不同而已,主鍵索引B+樹的節點儲存了主鍵,輔助鍵索引B+樹儲存了輔助鍵。表資料儲存在獨立的地方,這兩顆B+樹的葉子節點都使用一個地址指向真正的表資料,對於表資料來說,這兩個鍵沒有任何差別。由於索引樹是獨立的,通過輔助鍵檢i索無需訪問主鍵的索引樹。;

三正規化

  • 第一正規化:若關係模式 R 的每一個屬性是不可再分解的,且有主鍵,則屬於第一正規化。
  • 第二正規化:若 R 屬於第一正規化,且所有的非主鍵屬性都完全函式依賴於主鍵屬性,則滿足第二正規化。
  • 第三正規化:若 R 屬於第二正規化,且所有的非主鍵屬性沒有一個是傳遞函式依賴於候選主鍵屬性,則滿足第三正規化。
    在實際使用中,可以根據需求適當的逆正規化。

設計層

從設計層: 採用分割槽分表,索引,表欄位合適的欄位屬性,適當採用逆正規化,開啟 mysql 快取

相關文章