整理高階 PHP 工程師面試常考題目,涵蓋 HTTP 協定、Web 架構、MySQL 優化、專案經驗、Linux 基礎、前端核心等六大維度,附參考答案與延伸思考方向。
| 碼 | 含義 | 典型場景 |
|---|---|---|
| 200 | OK | 請求成功 |
| 301 | Moved Permanently | 永久重導向,SEO 權重傳遞 |
| 302 | Found | 暫時重導向 |
| 401 | Unauthorized | 需登入/Token 失效 |
| 403 | Forbidden | 權限不足 |
| 404 | Not Found | 資源不存在 |
| 500 | Internal Server Error | 程式錯誤/異常未捕獲 |
| 503 | Service Unavailable | 維護中/過載/熔斷 |
require:失敗產生 E_COMPILE_ERROR,腳本終止。include:失敗產生 E_WARNING,腳本繼續。_once:同一請求僅載入一次,防止重複定義。__construct、__destruct、介面、抽象類、靜態成員、異常處理、PDO。goto、__invoke。[]、內建 Web Server、JsonSerializable。??、<=>、匿名類、效能提升 2x。<<<EOD
多行字串,支援變數解析
EOD;
<<<'EOD'
Nowdoc:不解析變數,類似單引號
EOD;
結束標識必須頂格、獨佔一行、無前後空白、可加分號。
__construct, __destruct, __call, __callStatic,
__get, __set, __isset, __unset,
__sleep, __wakeup, __toString, __invoke,
__set_state, __clone, __debugInfo
--prefix=/usr/local/php
--with-config-file-path=/usr/local/php/etc
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
--enable-fpm --with-fpm-user=www --with-fpm-group=www
--enable-mbstring --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem
--enable-inline-optimization --enable-opcache
--with-curl --with-zlib --with-openssl --with-gd --with-jpeg --with-png --with-freetype
--with-libxml --with-xmlrpc --with-zip --with-bz2
--disable-rpath --disable-debug
$argc/$argv:原始陣列,需自行解析。getopt('f:g:'):支援短選項,回傳關聯陣列。fwrite(STDOUT, ...) + fgets(STDIN):互動式提示輸入。| 型別 | 說明 |
|---|---|
| INT | 整數 |
| CHAR(n) | 固定長度,不足右補空格,存取快但浪費空間 |
| VARCHAR(n) | 可變長度,額外 1-2 字節記錄長度,節省空間 |
| DATETIME | 日期時間,8 字節,範圍 1000-9999 年 |
| TEXT | 長文本,64KB,存儲在溢出頁面 |
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT); // 生產建議
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');
Git (主流)、SVN (舊專案)、Mercurial。掌握 rebase、cherry-pick、bisect、hook 進階用法。
PHP 5.4 移除。歷史限制:UID 檢查、exec/system 禁用、fopen 限同擁有者檔案。
$fp = fopen('/tmp/lock.txt', 'w+');
if (flock($fp, LOCK_EX)) {
fwrite($fp, "data\n");
flock($fp, LOCK_UN);
} else {
echo "Lock failed";
}
fclose($fp);
// HTML: enctype="multipart/form-data" + input type="file"
// PHP:
$uploads = '/uploads';
foreach ($_FILES['file']['error'] as $key => $err) {
if ($err === UPLOAD_ERR_OK) {
move_uploaded_file($_FILES['file']['tmp_name'][$key], "$uploads/{$_FILES['file']['name'][$key]}");
}
}
| 特性 | MyISAM | InnoDB |
|---|---|---|
| Transaction | 不支援 | 支援 (ACID) |
| Lock Level | Table Lock | Row Lock |
| FK | 不支援 | 支援 |
| FULLTEXT | 支援 (5.6+ InnoDB 也支援) | 5.6+ 支援 |
| Count(*) | 極快 (儲存行數) | 需掃描/估算 |
| Crash Recovery | 無 | Redo/Undo Log |
# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^archives/(\d+)\.html$ index.php?id=$1 [L,QSA]
前提:AllowOverride All、載入 mod_rewrite 模組。
SELECT *、EXPLAIN 驗證。DELETE/UPDATE、延遲關聯優化分頁。快速排序 (Quick Sort):平均 O(n log n),原地分區、隨機選 pivot 避免最壞 O(n²)。優化:小陣列改插入排序、三向切分處理重複鍵、尾遞迴消除。
session_id 存 Cookie/URL → 檔案/Redis/Memcached 存資料 → GC 機率清理過期。session.save_handler = redis)、session.write_short_circuit、適當縮短 GC 機率。xhprof/xhgui、Blackfire、Tideways。sysbench、tpcc-mysql、EXPLAIN ANALYZE、Performance Schema。ab/wrk、JMeter、Locust、Prometheus+Grafana。preg_match_all('/<a\s[^>]*href\s*=\s*["\']([^"\']+)["\']/i', $html, $matches);
$links = $matches[1];
回答要點:解決什麼痛點 (路由、DI、ORM、中介層、模組化)、遵循 PSR、與 Laravel/Symfony/Yii 差異、生產驗證案例。
| 需求 | 技術方案 |
|---|---|
| 多檔並發上傳 | Plupload / WebUploader / Uppy (切片、斷點續傳) |
| 圖片裁剪/壓縮 | 前端 Canvas / 後端 ImageMagick / GD / libvips |
| 壓縮包解壓 | 後端 ZipArchive / exec('unzip') |
| 50M 大檔 | Nginx client_max_body_size、分片上傳、臨時目錄磁碟空間 |
| 進度條 | XHR upload.onprogress / WebSocket / SSE |
| 多規格縮略圖 | 上傳完成觸發 Queue Worker (Gearman/Redis Queue) 非同步生成 |
| 影片轉 FLV | FFmpeg 非同步轉碼、預設預覽圖 |
function josephus($n, $m) {
$arr = range(1, $n);
$idx = 0;
while (count($arr) > 1) {
$idx = ($idx + $m - 1) % count($arr);
array_splice($arr, $idx, 1);
}
return $arr[0];
}
// 或遞迴數學解:f(1)=0; f(i)=(f(i-1)+m)%i; 答案+1
top / htop # 即時進程
uptime / w # 1/5/15min load average
vmstat 1 5 # 虛擬記憶體/CPU/IO
iostat -x 1 5 # 磁碟 IO 細節
sar -u 1 5 # 歷史 CPU
dmesg | tail # 核心訊息
Normal/Insert/Visual/Command 模式切換、hjkl、gg/G、/pattern、yy/p/dd、u/Ctrl+r、:%s/old/new/g、:set nu/hls。
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
AllowUsers deploy@*
# 客戶端金鑰生成
ssh-keygen -t ed25519 -C "user@host"
ssh-copy-id -p 2222 user@server
| 系統 | 安裝 | 查詢 | 移除 |
|---|---|---|---|
| Debian/Ubuntu | apt install pkg | apt list --installed / dpkg -l | apt remove pkg |
| CentOS/RHEL 7 | yum install pkg | yum list installed / rpm -qa | yum remove pkg |
| CentOS/RHEL 8+ | dnf install pkg | dnf list installed | dnf remove pkg |
| FreeBSD | pkg install pkg | pkg info | pkg delete pkg |
# Makefile 範例
CC = gcc
CFLAGS = -Wall -O2
TARGET = app
OBJS = main.o utils.o
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f $(OBJS) $(TARGET)
-O0:無優化,除錯資訊完整,編譯快。-O3:激進優化 (內聯、向量化、循環展開),執行快但編譯久、二進制大、除錯難。gdb:斷點、堆疊、變數檢查、Core Dump 分析。strace -p PID:系統呼叫追蹤、卡住點定位。valgrind --tool=memcheck:記憶體洩漏、非法存取、未初始化讀取。| 主題 | 關鍵點 |
|---|---|
| CSS 盒模型 | content/padding/border/margin;box-sizing: border-box 含 padding/border 於 width |
| Prototype | 每個函數有 prototype 物件,實例 __proto__ 指向之,形成原型鏈繼承 |
| this 綁定 | 預設綁定、隱式綁定、顯式綁定 (call/apply/bind)、new 綁定、箭頭函數繼承外層 |
| 事件流 | 捕獲→目標→冒泡;IE 僅冒泡;stopPropagation()/stopImmediatePropagation() |
| 渲染模式 | Quirks (無 Doctype) / Standards (HTML5 <!DOCTYPE html>) / Almost Standards |
| DTD | 文件類型定義,告訴瀏覽器用哪套規則解析 |
| Hack | 條件註解 <!--[if IE]>、屬性 Hack *color/_color、@media、_::-ms-reveal |
| 除錯工具 | Chrome DevTools (Elements/Console/Network/Performance/Application)、React/Vue DevTools |
廣度決定下限,深度決定上限。
準備時:
1. 將每個知識點轉為「我如何在專案中解決具體問題」的故事。
2. 系統設計題:畫圖 → 估量 → 選型 → 權衡 → 演進。
3. 承認不會,但展示「如何快速學會並驗證」的過程。
4. 基礎不牢,地動山搖 —— 定期回顧 HTTP、TCP、OS、資料結構、演算法。