雖然現代開發推薦使用 Docker、XAMPP、Laravel Valet 等一鍵方案,但理解手動配置 Apache + PHP + MySQL 的每一步,有助於排查環境問題、理解生產部署原理。本文記錄 Windows 下手動搭建經典 LAMP(WAMP) 環境的完整步驟。
| 組件 | 建議版本 | 下載來源 |
|---|---|---|
| Apache | 2.4.x (VC15/VC16) | https://www.apachelounge.com/download/ |
| PHP | 8.2.x (Non Thread Safe for Apache FCGI / Thread Safe for mod_php) | https://windows.php.net/download/ |
| MySQL | 8.0.x Community | https://dev.mysql.com/downloads/mysql/ |
| Visual C++ Redistributable | VC15/VC16 (x64) | Microsoft 官網 |
關鍵選擇: Apache 2.4 + PHP 8 建議用 PHP-FPM (FastCGI) 模式(Non Thread Safe),而非傳統 mod_php (Thread Safe),效能更好、穩定性更高。
D:/dev/
├── Apache24/ # Apache 安裝目錄
├── php/ # PHP 解壓目錄
├── mysql/ # MySQL 安裝目錄 (或預設 Program Files)
├── www/ # Web 根目錄 (DocumentRoot)
│ ├── project1/
│ └── project2/
└── logs/ # 統一日誌目錄
├── apache/
└── php/
D:/dev/Apache24D:/dev/Apache24/conf/httpd.conf 關鍵修改:
# 監聽端口 (避開 80 若被佔用)
Listen 8080
# 服務器名稱
ServerName localhost:8080
# 文檔根目錄
DocumentRoot "D:/dev/www"
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
# 預設首頁文件 (加入 index.php)
DirectoryIndex index.php index.html index.htm
# 載入模組 (確保啟用)
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so # PHP-FPM 必需
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
D:/dev/Apache24/bin/httpd.exe -t 應顯示 Syntax OKD:/dev/Apache24/bin/httpd.exe -k install -n "Apache24"net start Apache24 或服務管理器https://localhost:8080 顯示 "It works!"D:/dev/php (選 Non Thread Safe 版)php.ini-development 為 php.iniphp.ini 關鍵設定:
; 擴展目錄
extension_dir = "ext"
; 啟用常用擴展 (去掉分號)
extension=curl
extension=fileinfo
extension=gd
extension=gettext
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql
extension=redis ; 需額外下載 php_redis.dll
; 時區
date.timezone = Asia/Taipei
; 錯誤報告 (開發環境)
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = "D:/dev/logs/php/php_error.log"
; 會話
session.save_path = "D:/dev/php/session"
; 建立此目錄
; 上傳
file_uploads = On
upload_max_filesize = 50M
post_max_size = 50M
; Opcache (開發可關閉,生產必開)
opcache.enable = 0
; opcache.enable_cli = 1
D:/dev/php/php-fpm.conf:
; 全域設定
[global]
pid = run/php-fpm.pid
error_log = D:/dev/logs/php/php-fpm.log
log_level = notice
; 池設定
[www]
listen = 127.0.0.1:9000 ; 或 Unix socket (Windows 不支援)
listen.owner = nobody
listen.group = nobody
listen.mode = 0660
user = nobody
group = nobody
pm = dynamic
pm.max_children = 20
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
; 環境變數
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
D:/dev/php/php-fpm.exe (或建立服務 php-fpm.exe --fpm-config php-fpm.conf --install)telnet 127.0.0.1 9000 或建立 D:/dev/www/phpinfo.php 內容 <?php phpinfo(); ?>編輯 httpd.conf 或建立 conf/extra/php-fpm.conf 並 Include:
# 代理 PHP 請求到 PHP-FPM
SetHandler "proxy:fcgi://127.0.0.1:9000"
# 目錄索引已在 DirectoryIndex 設定
# 確保安全:禁止訪問隱藏文件、備份文件
Require all denied
Require all denied
重啟 Apache:httpd.exe -k restart -n Apache24
mysql -u root -pCREATE DATABASE dev_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON dev_db.* TO 'dev_user'@'localhost';
FLUSH PRIVILEGES;
建立 D:/dev/www/test_db.php:
<?php
$pdo = new PDO('mysql:host=127.0.0.1;dbname=dev_db;charset=utf8mb4', 'dev_user', 'strong_password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $pdo->query('SELECT VERSION() as version, NOW() as now');
$row = $stmt->fetch();
echo "MySQL 版本: {$row['version']}
";
echo "伺服器時間: {$row['now']}
";
echo "PHP 版本: " . PHP_VERSION . "
";
echo "Apache: " . $_SERVER['SERVER_SOFTWARE'] . "
";
?>
瀏覽器訪問 https://localhost:8080/test_db.php 應顯示連線成功資訊。
| 現象 | 可能原因 | 解決 |
|---|---|---|
| Apache 啟動失敗 | 端口被佔用 / 配置語法錯誤 | httpd.exe -t 檢查 / 更改 Listen 端口 |
| PHP 檔案顯示原始碼/下載 | Handler 未正確配置 / 模組未載入 | 檢查 SetHandler proxy:fcgi / 載入 mod_proxy_fcgi |
| PHP-FPM 連線失敗 | 端口 9000 被佔 / 防火牆 / php-fpm 未啟動 | netstat -ano | findstr 9000 / 重啟 php-fpm |
| MySQL 連線拒絕 | 服務未啟 / 密碼錯 / 主機名解析 | 服務管理器啟動 / 用 127.0.0.1 代替 localhost |
| 中文亂碼 | 資料庫/表/連線 charset 不一致 | 全鏈路 utf8mb4:連線 DSN、建表、PHP internal_encoding |
| Class 'PDO' not found | 未啟用 pdo_mysql 擴展 | php.ini 開啟 extension=pdo_mysql |
httpd-vhosts.conf,配合 C:\Windows\System32\drivers\etc\hosts 實現 project1.local 訪問composer.phar 放入 PATH,管理 PHP 依賴php_xdebug.dll,配置 php.ini 遠程除錯手動搭建 WAMP 環境核心步驟:
httpd.conf (DocumentRoot、DirectoryIndex、模組)php.ini (擴展、時區、錯誤、Opcache)php-fpm.conf (池設定、監聽端口)SetHandler proxy:fcgi://)理解這些細節,遷移至 Docker、生產部署、雲端服務時都能游刃有餘。