1. 程式人生 > >php程式設計師的學習路線,以及進階篇

php程式設計師的學習路線,以及進階篇

# PHP interview best practices in China



如果你現在處於以下幾種狀態,本資料非常適合你:

* 準備換工作,不知道從哪開始準備
* 技術遇到瓶頸,不知道該學什麼
* 準備學 PHP,但不知道領域有多深

## 基礎篇
* 瞭解大部分陣列處理函式
* 字串處理函式(區別 mb_ 系列函式)
* & 引用,結合案例分析
* == 與 === 區別
* isset 與 empty 區別
* 全部魔術函式理解
* static、$this、self 區別
* private、protected、public、final 區別
* OOP 思想
* 抽象類、介面 分別使用場景
* Trait 是什麼東西
* echo、print、print_r 區別
* __construct 與 __destruct 區別
* static 作用(區分類與函式內)
* __toString() 作用
* 單引號’ 與雙引號 “ 區別
* 常見 HTTP 狀態碼,分別代表什麼含義
* 301 什麼意思 404 呢



## 進階篇
* Autoload、Composer 原理
* Session 共享、存活時間
* 異常處理
* 如何 foreach 迭代物件
* 如何陣列化操作物件 $obj[key]
* 如何函式化物件 $obj(123);
* yield 是什麼,說個使用場景
* PSR 是什麼,PSR-1, 2, 4, 7
* 如何獲取客戶端 IP 和 服務端 IP 地址
* 如何開啟 PHP 異常提示
* 如何返回一個301重定向
* 如何獲取擴充套件安裝路徑
* 字串、數字比較大小的原理,注意 0 開頭的8進位制、0x 開頭16進位制
* BOM 頭是什麼,怎麼除去
* 什麼是 MVC 
* 依賴注入實現原理
* 如何非同步執行命令
* 模板引擎是什麼,解決什麼問題、實現原理(Smarty、Twig、Blade)
* 如何實現鏈式操作 `$obj->w()->m()->d();`
* Xhprof 、Xdebug 效能除錯工具使用
* 索引陣列 `[1, 2]` 與關聯陣列 `['k1'=>1, 'k2'=>2]` 有什麼區別
* 依賴注入原理

## 實踐篇
* 給定二維陣列,根據某個欄位排序
* 如何判斷上傳檔案型別,如:僅允許 jpg 上傳
* 不使用臨時變數交換兩個變數的值 `$a=1; $b=2;`  =>  `$a=2; $b=1;`
* strtoupper 在轉換中文時存在亂碼,你如何解決?```php echo strtoupper('ab你好c'); ```
* Websocket、Long-Polling、Server-Sent Events(SSE) 區別
* "Headers already sent" 錯誤是什麼意思,如何避免

## 演算法篇
* 快速排序(手寫)
* 氣泡排序(手寫)
* 二分查詢(瞭解)
* 查詢演算法 KMP(瞭解)
* 深度、廣度優先搜尋(瞭解)

## 資料結構篇(瞭解)
* 堆、棧特性
* 佇列
* 雜湊表
* 連結串列

## 對比篇
* Cookie 與 Session 區別
* `GET` 與 `POST` 區別
* `include` 與 `require` 區別
* `include_once` 與 `require_once` 區別
* Memcached 與 Redis 區別
* MySQL 各個儲存引擎、及區別(一定會問 MyISAM 與 Innodb 區別)
* HTTP 與 HTTPS 區別
* Apache 與 Nginx 區別
* define() 與 const 區別
* traits 與 interfaces 區別 及 traits 解決了什麼痛點?
* Git 與 SVN 區別

## 資料庫篇
* MySQL
    * CRUD
    * JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN
    * UNION
    * GROUP BY + COUNT + WHERE 組合案例
    * 常用 MySQL 函式,如:now()、md5()、concat()、uuid()等
    * `1:1`、`1:n`、`n:n` 各自適用場景
    * 資料庫優化手段
        * 索引、聯合索引(命中條件)
        * 分庫分表(`水平分表`、`垂直分表`)
        * 分割槽
        * 會使用 `explain` 分析 SQL 效能問題,瞭解各引數含義
        * Slow Log(有什麼用,什麼時候需要)
* MSSQL(瞭解)
    * 查詢最新5條資料
* NOSQL
    * Redis、Memcached、MongoDB
    * 對比、適用場景
    * 你之前為了解決什麼問題使用的什麼,為什麼選它?

## 伺服器篇
* 檢視 CPU、記憶體、時間、系統版本等資訊
* find 、grep 查詢檔案
* awk 處理文字
* 檢視命令所在目錄
* 自己編譯過 PHP 嗎?如何開啟 readline 功能
* 如何檢視 PHP 程序的記憶體、CPU 佔用
* 如何給 PHP 增加一個擴充套件
* 修改 PHP Session 儲存位置、修改 INI 配置引數
* 負載均衡有哪幾種,挑一種你熟悉的說明其原理
* 資料庫主從複製 M-S 是怎麼同步的?是推還是拉?會不會不同步?怎麼辦
* 如何保障資料的可用性,即使被刪庫了也能恢復到分鐘級別。你會怎麼做。
* 資料庫連線過多,超過最大值,如何優化架構。從哪些方便處理?
* 502 大概什麼什麼原因? 如何排查  504呢?

## 架構篇
* 偏運維(瞭解):
    * 負載均衡(Nginx、HAProxy、DNS)
    * 主從複製(MySQL、Redis)
    * 資料冗餘、備份(MySQL增量、全量 原理)
    * 監控檢查(分存活、服務可用兩個維度)
    * MySQL、Redis、Memcached Proxy 、Cluster 目的、原理
    * 分片
    * 高可用叢集
    * RAID
    * 原始碼編譯、記憶體調優
* 快取
    * 工作中遇到哪裡需要快取,分別簡述為什麼
* 搜尋解決方案
* 效能調優
* 各維度監控方案
* 日誌收集集中處理方案
* 國際化
* 資料庫設計
* 靜態化方案

## 框架篇
* ThinkPHP(TP)、CodeIgniter(CI)、Zend(非 OOP 系列)
* Yaf、Phalcon(C 擴充套件系)
* Yii、Laravel、Symfony(純 OOP 系列)
* Swoole、Workerman (網路程式設計框架)
* 對比框架區別幾個方向點
    * 是否純 OOP
    * 類庫載入方式(自己寫 autoload 對比 composer 標準)
    * 易用性方向(CI 基礎框架,Laravel 這種就是高開發效率框架以及基礎元件多少) 
    * 黑盒(相比 C 擴充套件系)
    * 執行速度(如:Laravel 載入一大堆東西)
    * 記憶體佔用

## 設計模式
* 單例模式(重點)
* 工廠模式(重點)
* 觀察者模式(重點)
* 依賴注入(重點)
* 裝飾器模式
* 代理模式
* 組合模式

## 安全篇
* SQL 注入
* XSS 與 CSRF
* 輸入過濾
* Cookie 安全
* 禁用 `mysql_` 系函式
* 資料庫儲存使用者密碼時,應該是怎麼做才安全
* 驗證碼 Session 問題
* 安全的 Session ID (讓即使攔截後,也無法模擬使用)
* 目錄許可權安全
* 包含本地與遠端檔案
* 檔案上傳 PHP 指令碼
* `eval` 函式執行指令碼
* `disable_functions` 關閉高危函式
* FPM 獨立使用者與組,給每個目錄特定許可權
* 瞭解 Hash 與 Encrypt 區別

## 高階篇
* PHP 陣列底層實現 (HashTable + Linked list)
* Copy on write 原理,何時 GC
* PHP 程序模型,程序通訊方式,程序執行緒區別
* yield 核心原理是什麼
* PDO prepare 原理
* PHP 7 與 PHP 5 有什麼區別
* Swoole 適用場景,協程實現方式

## 前端篇
* 原生獲取 DOM 節點,屬性
* 盒子模型
* CSS 檔案、style 標籤、行內 style 屬性優先順序
* HTML 與 JS 執行順序(頁面 JS 從上到下)
* JS 陣列操作
* 型別判斷
* this 作用域
* .map() 與 this 具體使用場景分析
* Cookie 讀寫
* JQuery 操作
* Ajax 請求(同步、非同步區別)隨機數禁止快取
* Bootstrap 有什麼好處
* 跨域請求 N 種解決方案
* 新技術(瞭解)
    * ES6
    * 模組化
    * 打包
    * 構建工具
    * vue、react、webpack、
    * 前端 mvc 
* 優化
    * 瀏覽器單域名併發數限制
    * 靜態資源快取 304 (If-Modified-Since 以及 Etag 原理)
    * 多個小圖示合併使用 position 定位技術 減少請求
    * 靜態資源合為單次請求 並壓縮
    * CDN
    * 靜態資源延遲載入技術、預載入技術
    * keep-alive
    * CSS 在頭部,JS 在尾部的優化(原理)


## 網路篇

* IP 地址轉 INT
* 192.168.0.1/16 是什麼意思
* DNS 主要作用是什麼?
* IPv4 與 v6 區別

## 網路程式設計篇

* TCP 三次握手流程
* TCP、UDP 區別,分別適用場景
* 有什麼辦法能保證 UDP 高可用性(瞭解)
* TCP 粘包如何解決?
* 為什麼需要心跳?
* 什麼是長連線?
* HTTPS 是怎麼保證安全的?
* 流與資料報的區別
* 程序間通訊幾種方式,最快的是哪種?
* `fork()` 會發生什麼?

## API 篇

* RESTful 是什麼
* 如何在不支援 `DELETE` 請求的瀏覽器上相容 `DELETE` 請求
* 常見 API 的 `APP_ID` `APP_SECRET` 主要作用是什麼?闡述下流程 
* API 請求如何保證資料不被篡改?
* JSON 和 JSONP 的區別
* 資料加密和驗籤的區別
* RSA 是什麼
* API 版本相容怎麼處理
* 限流(木桶、令牌桶)
* OAuth 2 主要用在哪些場景下
* JWT
* PHP 中 `json_encode(['key'=>123]);` 與 `return json_encode([]);` 區別,會產生什麼問題?如何解決

## 加分項
* 瞭解常用語言特性,及不同場景適用性。
   * PHP VS Golang
   * PHP VS Python
   * PHP VS JAVA
* 瞭解 PHP 擴充套件開發
* 熟練掌握 C


## 宣告

該資料不針對任何一家公司,對因該資料對您產生的影響概不負責,望知曉。

祝順利