1. 程式人生 > >php面試可能會遇到的問題

php面試可能會遇到的問題

1.訊息佇列

答:訊息佇列:是在訊息的傳輸過程中儲存訊息的容器。訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。

應用場景:非同步處理,應用解耦,流量削鋒和訊息通訊四個場景;

具體詳情檢視

2.全文索引

全文檢索大體分兩個過程,索引建立 (Indexing) 和搜尋索引 (Search) 。

  • 索引建立:將現實世界中所有的結構化和非結構化資料提取資訊,建立索引的過程。
  • 搜尋索引:就是得到使用者的查詢請求,搜尋建立的索引,然後返回結果的過程。

coreseek:檢視詳情

MySQL5.6.24上InnoDB引擎也加入了全文索引

xunsearch:檢視詳情

3.redis和memcached的區別(總結)

1、Redis和Memcache都是將資料存放在記憶體中,都是記憶體資料庫。不過memcache還可用於快取其他東西,例如圖片、視訊等等;

2、Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,hash等資料結構的儲存;

3、虛擬記憶體--Redis當實體記憶體用完時,可以將一些很久沒用到的value 交換到磁碟;

4、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10;

5、分散式--設定memcache叢集,利用magent做一主多從;redis可以做一主多從。都可以一主一從;

6、儲存資料安全--memcache掛掉後,資料沒了;redis可以定期儲存到磁碟(持久化);

7、災難恢復--memcache掛掉後,資料不可恢復; redis資料丟失後可以通過aof恢復;

8、Redis支援資料的備份,即master-slave模式的資料備份;

檢視詳情

4.事務處理

MySQL 事務主要用於處理操作量大,複雜度高的資料。由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。事務用來管理 insert,update,delete 語句。

事務特性:Atomicity(原子性)、Consistency(穩定性,一致性)、隔離性(Isolation)和Durability(持續性,可靠性)。這四個特性也簡稱ACID性。

檢視詳情

5.php擴充套件安裝

 

檢視詳情

6.設計模式

策略模式:

策略模式是物件的行為模式,用意是對一組演算法的封裝。動態的選擇需要的演算法並使用。

策略模式指的是程式中涉及決策控制的一種模式。策略模式功能非常強大,因為這個設計模式本身的核心思想就是面向物件程式設計的多形性思想。

策略模式的三個角色:

1.抽象策略角色

2.具體策略角色

3.環境角色(對抽象策略角色的引用)

工廠模式:

工廠模式是我們最常用的例項化物件模式,是用工廠方法代替new操作的一種模式。

使用工廠模式的好處是,如果你想要更改所例項化的類名等,則只需更改該工廠方法內容即可,不需逐一尋找程式碼中具體例項化的地方(new處)修改了。為系統結構提供靈活的動態擴充套件機制,減少了耦合。

單例模式:

單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。

單例模式是一種常見的設計模式,在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、資料庫操作、顯示卡的驅動程式常被設計成單例。

單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。

單例模式有以下3個特點:

1.只能有一個例項。

2.必須自行建立這個例項。

3.必須給其他物件提供這一例項。

那麼為什麼要使用PHP單例模式?

PHP一個主要應用場合就是應用程式與資料庫打交道的場景,在一個應用中會存在大量的資料庫操作,針對資料庫控制代碼連線資料庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統和記憶體的資源。

註冊模式:

解決全域性共享和交換物件。已經建立好的物件,掛在到某個全域性可以使用的陣列上,在需要使用的時候,直接從該陣列上獲取即可。將物件註冊到全域性的樹上。任何地方直接去訪問

介面卡模式:

將各種截然不同的函式介面封裝成統一的API。 
PHP中的資料庫操作有MySQL,MySQLi,PDO三種,可以用介面卡模式統一成一致,使不同的資料庫操作,統一成一樣的API。類似的場景還有cache介面卡,可以將memcache,redis,file,apc等不同的快取函式,統一成一致。 
首先定義一個介面(有幾個方法,以及相應的引數)。然後,有幾種不同的情況,就寫幾個類實現該介面。將完成相似功能的函式,統一成一致的方法。

觀察者模式:

1:觀察者模式(Observer),當一個物件狀態發生變化時,依賴它的物件全部會收到通知,並自動更新。 
2:場景:一個事件發生後,要執行一連串更新操作。傳統的程式設計方式,就是在事件的程式碼之後直接加入處理的邏輯。當更新的邏輯增多之後,程式碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體程式碼。 
3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。 
定義一個事件觸發抽象類。

檢視詳情

7.php7.0特效

運算子(NULL 合併運算子)

$a = $_GET['a'] ?? 1;  

它相當於:

1

2

<?php

$a = isset($_GET['a']) ? $_GET['a'] : 1;

2. 函式返回值型別宣告

3. 標量型別宣告

4. use 批量宣告:PHP 7 中 use 可以在一句話中宣告多個類或函式或 const 了:

5.define支援定義陣列型別的值

6.匿名類

檢視詳情

8.composer

檢視詳情

9.502錯誤

nginx 出現 502 有很多原因,但大部分原因可以歸結為資源數量不夠用 , 也就是說後端 php-fpm 處理有問題, nginx 將正確的客戶端請求發給了後端的 php-fpm 程序,但是因為 php-fpm 程序的問題導致不能正確解析 php 程式碼,最終返回給了客戶端 502 錯誤。

伺服器出現 502 的原因是連線超時 我們向伺服器傳送請求 由於伺服器當前連結太多,導致伺服器方面無法給於正常的響應 , 產生此類報錯

因此如果你伺服器併發量非常大,那隻能先增加機器,然後按以下方式優化會取得更好效果 ; 但如果你併發不大卻出現 502 ,一般都可以歸結為配置問題,指令碼超時問題。