2019-07-20

如何在 Windows 讓 Apache 在一個 host 中,指定某個資料夾下的 php 是跑不同的版本

標題下的好像很怪…簡略說明一下

其實就是 Windows 下 Apache 跑 php-fpm (Fastcgi) - 使用 VirtualHost 這篇的另一個形式…我的目的還是要在一個 apache service 中跑不同版本的 php ;只是之前是使用 VirtualHost 來操作,但我現在是希望在一個 host …或者也可以理解為一個 VirualHost 下,不同的 Directory 可以跑不同的 php 版本,這樣我就不用換 VirualHost 的 domain:port ,只要切換 localhost/______/ 就好了。

前置作業說明:

  1. 跟之前一樣使用 xampp ,apache 2.4.39 x64 + php 7.3.7 x64,這是主要的,然後指定一個 localhost/php52 這個位置可以跑 php 5.2.17 x86
  2. 作不作 vhost 都無所謂,因為這一篇要的就是一個 host 就做到可以跑不同的 php 版本
  3. 如前一篇說的,因為此種方式已經算改了 xampp 的部份算大改了,所以會建議就不要讓 apache load httpd-xampp.conf 了,或者將 httpd-xampp.conf 中的每一行都用 # 註解起來
操作:
與前篇的操作雷同,那四行啟動 php-cgi 的還是要放在該放的位置,用前篇的說法就是放在 host 或 vhost 的設定裡面,但不要放進 DocumentRoot 或 Directory 中,會錯誤。

接著,比較重要的是處理針對 localhost/php52 這邊的處理…以下我用 alias 的方式表現
Alias /php52 "{php52-directory-real-path}"
<Directory "{php52-directory-real-path}">
Options ExecCGI
<FilesMatch "\.php$">
ProxyFCGIBackendType GENERIC
SetHandler "proxy:fcgi://localhost:9000/"
ProxyFCGISetEnvIf "reqenv('SCRIPT_FILENAME') =~ m#^/?(.*)$#" SCRIPT_FILENAME "$1"
</FilesMatch>
AllowOverride AuthConfig
Require local
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
{php52-directory-real-path} 指的是你 php52 的實際路徑,如果是跟我一樣用 alias 的記得 Options ExecCGI 要寫,至於 AllowOverride, Require 我只是套用 xampp 中對 phpmyadmin 的 alias 設定,Require local 是限定 localhost 連得到…因為我是本機測試嘛,如果要開放也是可以改 Require all granted ;至於 AllowOverride AuthConfig 應該是不需要啦,可以改為 AllowOverride All 或有什麼限制的,我的留下 AuthConfig 只是單純因為我是複製 xampp 對 phpmyadmin 的 alias 設定,AuthConfig 是讓 phpmyadmin 可以走 apache Auth 的功能

FilesMatch 這邊是限定 .php 的檔案要做的行為,以下的三行就是讓 .php 的檔案透過 proxy 的方式傳送到 fcgi://localhost:9000/ 來執行,然後再輸出執行結果…ProxyFCGISetEnvIf 目前我還不確定是什麼意思,但 SCRIPT_FILENAME 是取得目前這個 .php 的實際路徑的用途,所以我猜想這段意思應該是把 .php 的執行結果取得回來後輸出的意思(應該吧)

以上
當然還沒完…應該有注意到「SetHandler "proxy:fcgi://localhost:9000/"」吧…這代表 fastcgi 應該是變成一個類似網路服務的程序在使用 localhost port 9000 ,那怎麼讓 fastcgi listen localhost:9000 ?
因為這是在 windows ,不像 linux 下可以接安裝 php-fpm 然後用 service 的方式啟動… fastcgi listen localhost:9000 是利用 php-cgi.exe 的指令,去執行
{php-path}/php-cgi.exe -b localhost:9000
就行了,上述執行後會常駐,如下圖
這時此視窗就不要關掉,不然該程序就停止了,那特定的資料夾就無法執行特定版本的 php 了…(我是用 powershell 視窗來執行,這沒有一定,要用 cmd 也行)

---如果想要查看 proxy 和 fcgi 的執行狀況,可以將下列這行加在 conf 中,這樣就會將執行狀況輸出至 error.log 了

LogLevel crit proxy_module:trace8 proxy_fcgi_module:trace8

沒有留言: