Windows 使用 XAMPP 執行多個不同的 PHP 版本

Lastor
Code 隨筆放置場
10 min readApr 14, 2021

這陣子有幸碰到了 php 的專案,稍微研究了一下如何在 windows 快速弄一個 php 環境,這邊簡單做個紀錄。

作為一個前端,不打算太深入 php,所以試圖尋找簡單快速的方式,讓 windows 本機端能跑 php 專案,只求能進行簡單的 debug 操作。其他太深的東西不涉獵。

php 基本知識

如果你跟我一樣是 JavaScript user,沒怎用過 php,就需要先有個基本概念。php 與 JS 有個根本性的差異,就是瀏覽器看不懂 php,它是後端語言。

並且不像 Node.js 可以自己起一個 HTTP Server,大多情況下,都必須要在本機上安裝開源的 Apache 或是微軟的 IIS (大宗為 Apache)。透過 HTTP Server 執行 php 後,才能把結果顯示在 client 端的瀏覽器上。

另外,php 圈子主流是 Linux 與 Mac,對 windows 用戶不太友好。因此,坊間高人們就製作出了 php開發環境懶人包,諸如 XAMPP 或是 WAMP,直接幫你一併裝好 php、Apache、MySQL 等玩意,並做好基本設置。

這邊採用 XAMPP 來做說明。如何安裝就不提了,這個安裝很容易,無腦下一步即可。

VScode 串接 XAMPP 中的 php

XAMPP 安裝好後,可以在安裝目錄底下找到 php 資料夾,php 的核心都放在這。所以只要將 VScode 的 php 執行檔路徑連過去即可。有改安裝路徑的,記得改一下位置。

// VScode setting
"php.validate.executablePath": "C:/xampp/php/php.exe",

如果有使用 Code Runner 這個擴充套件,一樣指一下路徑就可以跑 php 了。

"code-runner.executorMap": {
"php": "D:/xampp/php/php.exe"
}

基本語法的智能提示,現在一般推薦用 PHP Intelephense 這個擴充套件。它也可以做為陽春的 formatter 使用,如希望用它來作為 VScode 的 formatter,就加上這條設定。

"[php]": {
"editor.defaultFormatter": "bmewburn.vscode-intelephense-client"
},

這樣在 VScode 就可以比較愉快的編寫 php code 了。

XAMPP 快速使用

打開 XAMPP Control Panel,可以看到中間會列出各個 module,右手邊可以選擇 Start、Config、Logs。最重要的 module 只有 Apache,至於資料庫的 MySQL 有需要再啟動。

各模塊點下 Start 就可以啟動了,將核心的 Apache HTTP Server 啟動之後,面板上會顯示對應的 port,預設是 80,瀏覽器上直接連結 localhost 就可以連到 XAMPP 的入口頁面。上方的選單有個 PHPInfo,在裡面可以 check PHP 版本。

再來就是 Web data 的位置在哪的問題,放在安裝目錄底下的 htdocs 資料夾,這資料夾就是網站的 root,裡面已經有預設的資料,也就是方才看到的入口頁那些東西。

可以簡單的新增一個資料夾 test 之類的,在裡面放一個 php 檔案,就完成基本的 hello world 頁面。

// ./htdocs/test/index.php
<?php
echo 'Hello World';

最後就是開瀏覽器連過去便是。

localhost/test/index.php

如此,一個基本的 php 環境就架好了。

XAMPP 兼容不同版本的 php

這是做開發勢必會碰到的問題,不同的專案可能 php 版本不一樣。我不確定 php 有沒有類似 JS 的 babel 之類的玩意,反正這邊試著用最單純粗暴的方式來解決這個需求。

php 也有類似 JS nvm 這類的版本管理工具,但我搜尋到最多人推薦的是 PHPBrew,但它好像 windows 會 run 不起來,光是安裝可能就會搞半天,另外有一套 for windows 的,叫做 PHPStudy,只是 Google 第一頁就出現疑似有後門的討論,就果斷放棄使用版本管理工具的路線。

後來查到說 XAMPP 可以用很理所當然的方式來做到 php 版本切換,就是把不同版本的 php 檔案放進去,然後改一下 Apache 的設定即可,這顯然比去研究 PHPBrew 怎麼在 windows 上執行要容易的多。

這邊介紹兩種方法:
1. 直接指定該資料夾要運行哪個版本的 php
2. 設定不同 port 執行不同版本的 php

Step 1. 下載所需版本的 php

不管是用哪種方法,首先要先去 php 官網下載 其他版本的 php 包。這邊先假設,XAMPP 安裝的版本是 php v8.0.3,然後去官網抓 php v7.4 的版本來進行。下載時,選擇「Non Thread Safe」的版本,此版本才有 php-cgi.exe 這個檔案。

下載完之後解壓,直接整包放到 xampp 的安裝目錄下即可,並重新命名個短一點的名子,例如 php7_4

Step 2. 修改 php.ini

去方才下載好的 php7_4 裡面找 php.ini-development 這支檔案,複製出一個新的,重新命名為 php.ini。然後打開它,把這一行 uncomment。這行 code 上方有官方註解,說這是 Windows 環境需要做的設置

extension_dir = "ext"

Step 3. 修改 Apache 設定

這邊是要告訴 Apache,我們多裝了一個 php,讓它能串接起來。在 xampp 的控制面板上,Apache 模塊右手邊的 config,打開 Apache (httpd-xampp.conf) 這支檔案。在尾端加上下列設定。

#
# php v7.4
#
ScriptAlias /php7_4 "C:/xampp/php7_4"
Action application/x-httpd-php74-cgi /php7_4/php-cgi.exe
<Directory "C:/xampp/php7_4">
AllowOverride None
Options None
Require all denied
<Files "php-cgi.exe">
Require all granted
</Files>
</Directory>

(記得確認安裝路徑,就算寫錯了,Apache 也不會跟你說是路徑錯了,超坑)

Step 4. 關閉 SetEnv PHPRC 設定

繼續在 httpd-xampp.conf 這支檔案,上方去找這一行,把它 comment 起來屏蔽掉,否則在執行時會出現 403 錯誤。

SetEnv PHPRC "\\xampp\\php"

有興趣的話,可以先不做這部,完成下面的動作,讓它跳出 403 錯誤。

接著可以從控制面板去翻出 error log,看起來似乎是因為多了一包其他版本的 php,但 XAMPP 預設還是以內嵌的 php 路徑,去動態尋找其他依賴的檔案,導致一部分抓到了內嵌版本,一部分抓到了我們追加的版本,進而導致 php 跑不起來。

把上面那一行 comment 掉,Apache 就不會進行動態加載 php 了。

如此,新裝的 php 就跟 XAMPP 的 Apache 串起來了。接下來看是想用上述的哪種方法,來區分執行不同版本。

Step 5. (方法1) 直接指定該資料夾要運行哪個版本的 php

一樣,繼續對 httpd-xampp.conf 這支檔案加設定。例如在 htdocs 追加了一個 test74,然後指定這資料夾裡面的頁面都執行 v7.4 版的 php。

<Directory "D:\xampp\htdocs\test74">
<FilesMatch "\.php$">
SetHandler application/x-httpd-php74-cgi
</FilesMatch>
</Directory>

重點是在 SetHandler 這行,前面 Step 3 的時候,有定義 x-httpd-php74-cgi 指向到 php7_4 底下的 php-cgi.exe。

之後可以在 test74 底下新增一個 index.php,並加上這行:

// ./htdocs/test74/index.php
<?php
echo 'php version ' . phpversion();

然後重新啟動 Apache,開瀏覽器去連看看,應該就會順利顯示版本為 7.4。

Step 5. (方法2) 設定不同 port 執行不同版本的 php

這邊是利用 Apache 的 VirtualHost 機能,來做到切換 port 的效果。一樣是在 httpd-xampp.conf 這支檔案,尾端加上設定。

Listen 8074
<VirtualHost *:8074>
<FilesMatch "\.php$">
SetHandler application/x-httpd-php74-cgi
</FilesMatch>
</VirtualHost>

這邊從 code 上直觀理解起來,應該是類似對 port 掛監聽器,這樣 Apache 收到 GET 請求時,如果 port 是指定的 port,就執行下方的設定,指向到 php7_4 底下的執行檔。

可以用跟上面 Step 5 (方法1) 相同的做法,新增一個 index.php 來確認是否成功。只是這邊的差異就是不用管資料夾了,而是這個 port 下,htdocs 裡面所有的檔案都會改用 v7.4 版本的 php 來 run。

上述兩種做法挑一個喜歡的即可,兩個都用可能會有衝突,這我就沒實驗了。

將 Web Data 的 Root 移到 XAMPP 外部

這個需求可能也很常見,不然 Web 檔案都必須依附在 xampp 底下的還是頗麻煩,不管要上 git 還是拉套件,在專案管理上都格外的綁手綁腳。

XAMPP 也可以利用 VirtualHost 來指定 Root 的位置,一樣可以直接在 httpd-xampp.conf 上加設定。

Listen 81
<VirtualHost *:81>
DocumentRoot "Your_Outside_Path"
<Directory "Your_Outside_Path">
Require all granted
</Directory>
</VirtualHost>

如果要用預設的 80 port 就不需要加 Listen 指令,然後利用 DocumentRoot 關鍵字,就能指定一個新路徑作為網站的 root。

這邊需要注意的是,網路上的相關教學 <Directory> 裡面包的指令可能是這樣的。

<Directory "Your_Outside_Path">
Order allow,deny
Allow from all

</Directory>

這設定具體啥意思,我就沒去多查了。但它會造成瀏覽器連線時出現 404 錯誤。

You don't have permission to access this resource.

將那兩行改掉即可。

Order allow,deny
Allow from all

Require all granted

--

--

Lastor
Code 隨筆放置場

Web Frontend / 3D Modeling / Game and Animation. 設計本科生,前遊戲業 3D Artist,專擅日本動畫與遊戲相關領域。現在轉職為前端工程師,以專業遊戲美術的角度涉足 Web 前端開發。