PHPer面試指南-PHP 篇

今朝發表於2019-02-16

本書的 GitHub 地址:https://github.com/todayqq/PH…

PHP 篇收集了一些常見的基礎、進階面試題,基礎的面試題不再作答。

基礎篇

  • Get 和 POST 的區別
  • Cookie 和 Session 的區別和關係
  • 單引號和雙引號的區別
  • isset 和 empty 的區別
  • echo、print_r、print、var_dump 之間的區別
  • 什麼是 MVC?
  • 傳值和傳引用的區別?

進階篇

  • 簡述 S.O.L.I.D 設計原則
SRP 單一職責原則 一個類有且只有一個更改的原因
OCP 開閉原則 能夠不更改類而擴充套件類的行為
LSP 里氏替換原則 派生類可以替換基類使用
ISP 介面隔離原則 使用客戶端特定的細粒度介面
DIP 依賴反轉原則 依賴抽象而不是具體實現
  • PHP7 和 PHP5 的區別,具體多了哪些新特性?
  1. 效能提升了兩倍
  2. 增加了結合比較運算子 (<=>)
  3. 增加了標量型別宣告、返回型別宣告
  4. try...catch 增加多條件判斷,更多 Error 錯誤可以進行異常處理
  5. 增加了匿名類,現在支援通過new class 來例項化一個匿名類,這可以用來替代一些“用後即焚”的完整類定義
  • 為什麼 PHP7 比 PHP5 效能提升了?
  1. 變數儲存位元組減小,減少記憶體佔用,提升變數操作速度
  2. 改善陣列結構,陣列元素和 hash 對映表被分配在同一塊記憶體裡,降低了記憶體佔用、提升了 cpu 快取命中率
  3. 改進了函式的呼叫機制,通過優化引數傳遞的環節,減少了一些指令,提高執行效率
  • 簡述一下 PHP 垃圾回收機制(GC)

PHP 5.3 版本之前都是採用引用計數的方式管理記憶體,PHP 所有的變數存在一個叫 zval 的變數容器中,當變數被引用的時候,引用計數會+1,變數引用計數變為0時,PHP 將在記憶體中銷燬這個變數。

但是引用計數中的迴圈引用,引用計數不會消減為 0,就會導致記憶體洩露。

在 5.3 版本之後,做了這些優化:

  1. 並不是每次引用計數減少時都進入回收週期,只有根緩衝區滿額後在開始垃圾回收;
  2. 可以解決迴圈引用問題;
  3. 可以總將記憶體洩露保持在一個閾值以下。

瞭解更多可以檢視 PHP 手冊,垃圾回收機制

  • 如何解決 PHP 記憶體溢位問題
  1. 增大 PHP 指令碼的記憶體分配
  2. 變數引用之後及時銷燬
  3. 將資料分批處理
  • Redis、Memecached 這兩者有什麼區別?
  1. Redis 支援更加豐富的資料儲存型別,String、Hash、List、Set 和 Sorted Set。Memcached 僅支援簡單的 key-value 結構。
  2. Memcached key-value儲存比 Redis 採用 hash 結構來做 key-value 儲存的記憶體利用率更高。
  3. Redis 提供了事務的功能,可以保證一系列命令的原子性
  4. Redis 支援資料的持久化,可以將記憶體中的資料保持在磁碟中
  5. Redis 只使用單核,而 Memcached 可以使用多核,所以平均每一個核上 Redis 在儲存小資料時比 Memcached 效能更高。
  • Redis 如何實現持久化?
  1. RDB 持久化,將 Redis 在記憶體中的的狀態儲存到硬碟中,相當於備份資料庫狀態。
  2. AOF 持久化(Append-Only-File),AOF 持久化是通過儲存 Redis 伺服器鎖執行的寫狀態來記錄資料庫的。相當於備份資料庫接收到的命令,所有被寫入 AOF 的命令都是以 Redis 的協議格式來儲存的。

擴充套件閱讀

相關文章