php程式設計師的學習路線,以及進階篇
阿新 • • 發佈:2018-11-09
# 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 ## 宣告 該資料不針對任何一家公司,對因該資料對您產生的影響概不負責,望知曉。 祝順利