前言
架設php最簡單的方法,大概是用xampp。但是有時候專案會用到不同php版本,需要切換。就算用xampp也是要用切換的方式,而不是並存。同一時間只能存在一種版本。因此後來自己的電腦也沒使用xampp了。而且我架 Web Server 都是用免安裝。所以換電腦重裝 Windows ,資料都能重用。MySql 資料庫也都還在。只要下個指令把 apache 跟 mysql 重新註冊到 Windows 的服務。
資料夾結構
D:\Servers\
httpd\
httpd-2.4.53-win64-VS16\
php\
php-5.6.40-Win32-VC11-x64\
php-7.4.28-Win32-vc15-x64\
php-8.1.5-nts-Win32-vs16-x64\
mysql\
mariadb-10.6.7-winx64\
D:\Web\abc.com
htdocs\
專案摘要.txt
D:\Web\xyz.com
htdocs\
專案摘要.txt
安裝資料庫 MariaDB
以前 MySQL 就是 MySQL。後來被甲骨文收購,大家怕它可能將來會收費,所以原開發者脫離原團隊,另外做了 MariaDB。號稱完全移植原來的 MySQL。而現在甲骨文的 MySQL 也還是有免費版可以用。大概4這樣。但是不管是 MySQL,還是 MariaDB,安裝方式、寫法都差不多。在新的功能略有差別,本文不詳細說明。
免安裝版
我自己是習慣用免安裝版。這樣之後重裝作業系統比較方便。
下載 mariadb https://downloads.mariadb.org/mariadb/
目前的版本是 mariadb-10.6.7-winx64.zip
解壓縮後放到自己喜歡的地方。例如 D:\Servers\mysql\mariadb-10.6.7-winx64
以前比較舊的版本,要將這個檔案:
my-medium.ini
複製成:
my.ini
然後修改 my.ini
[client]
...
default-character-set = utf8mb4
[mysqld]
...
max_allowed_packet = 128M
...
# 設定 MariaDB 安裝的位置
basedir = C:/Servers/mysql/mariadb-10.3.14-winx64
# 設定 MariaDB 的資料庫檔所存放的位置
datadir = C:/Servers/mysql/mariadb-10.3.14-winx64/data
# 設定 MySQL 預設字元集
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect='SET NAMES utf8mb4;'
[mysql]
...
# 設定 MySQL 預設字元集
default-character-set = utf8mb4
但是現在新版在解壓縮之後沒有這種 ini 檔。
在 Windows CMD 視窗執行mysql_install_db
會自動在 data 資料夾產生 my.ini。也不用去改它。除非特殊需要。
(多新版呢?我也不知道。至少現在mariadb-10.6.7-winx64是這樣)
然後註冊到 Windows 服務就。D:\Servers\mysql\mariadb-10.6.7-winx64\bin\mysqld --install
此指令會把 MariaDB 註冊成 'MySQL'
開啟 Windows 的【服務】,找到 MySQL, 在上面按右鍵,啟動
執行升級
今天發生怪事
上網查到執行一個 upgrade 真的解決了。D:\Servers\mysql\mariadb-10.6.7-winx64\bin\mysql_upgrade -u root -p
如果重新安裝,或許可以順便執行一下。
root 預設沒有密碼。開啟資料庫工具,例如 Heidi SQL(可合法免費使用),或是 Navicat 要付費。
連線資料:
主機:localhost
帳號:root
密碼:(空白)
執行 SQL 指令
--設定密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
--立即生效
flush privileges;
--如果要從遠端連線
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
刪除 SQL 服務C:\> sc delete "MySQL"
安裝 PHP
下載位址: http://windows.php.net/download/
Windows 上的 apache, 選擇 Thread Safe,縮寫 TS。
現在該頁面最上面最新的是 PHP 8.1 (8.1.5),最下面最舊的是 7.4.28
如果要更舊的 5.x 版, 這裡有 https://windows.php.net/downloads/releases/archives/
下載
php-8.1.5-Win32-vs16-x64
php-7.4.28-Win32-vc15-x64
php-5.6.40-Win32-VC11-x64
如果現在在看這篇文章,剛入門,應該不需要用到 5.6 了。
設定 php.ini
將檔案 php.ini-development 複製成為 php.ini,並做適當修改。具體字串可能因版本會有所不同。
例如 php_bz2 這個延伸套件,5.6 以前的版本是這樣寫
extension=php_bz2.dll
7.4以後的版本
extension=bz2
這個要注意一下,php.ini 不要隨便複製。
大概改下面幾個地方:
extension_dir = "ext"
...
extension=bz2
extension=curl
;extension=ffi
;extension=ftp
extension=fileinfo
extension=gd2
extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=ldap
extension=mbstring
extension=exif ; Must be after mbstring as it depends on it
extension=mysqli
extension=oci8_12c ; Use with Oracle Database 12c Instant Client
extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
;extension=shmop
...
date.timezone = "Asia/Taipei"
...
;上傳檔案大小限制
post_max_size = 50M
upload_max_filesize = 50M
;暫存資料夾
sys_temp_dir = "C:\windows\Temp"
upload_tmp_dir = "C:\windows\Temp"
有時候需要在 CMD 視窗執行 php xxx.php,或是設定 Windows 工作排程。就必須去設定 Windows $PATH 系統變數。而且只能擇一設定。
Windows 系統內容 > 進階 > 環境變數
找到 Path,在最後面新增指定的 php 路徑,例如
D:\Servers\php\php-7.4.28-Win32-vc15-x64
但我為了多版本並存,所以我不是用這個方法。而是自己建一個 php.bat 批次檔。看哪裡會用到,就複製到哪裡。每個專案都要弄一份。這個檔案複製一下就好,不礙事。
例如
D:\Web\abc.com\htdocs\php.bat
@D:\Servers\php\php-8.1.5-Win32-vs16-x64\php.exe %*
連線 Oracle 資料庫
如果要連線 Oracle 資料庫,除了要啟用 php_oci 相關模組,還要另外安裝 Oracle Instant Client。這個要注意。到 Oracle 官網下載就可以。如果沒有安裝這個,啟動 httpd 的時候不會報錯,但是比如在 Laravel 使用 composer 指令的時候就會報錯,說找不到 ext\php_oci 模組,但是在該目錄下又明明存在 php_oci.dll。當時我剛開始使用 Oracle,查了好久。
安裝 Apache
下載 apache: http://www.apachelounge.com/download/
解壓縮到喜歡的地方,例如 D:\Servers\httpd\httpd-2.4.53-win64-VS16
這裡通常只放新的。httpd有什麼新的就用,通常沒影響。
下載 mod_fcgid.so
一樣是這裡 http://www.apachelounge.com/download/
搜尋 mod_fcgid,注意版本要符合。
解壓縮之後,把 mod_fcgid.so 放到 Apache 的 modules 裡面
將 apache 註冊成 Windows 服務D:\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\bin\httpd -k install
刪除服務sc delete Apache2.4
註:在 CMD 視窗用 sc delete,如果是 PowerShell,要用D:\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\bin\httpd -k uninstall
安裝 Visual C++
這個套件若沒裝好,很可能導致 apache 無法讀取 php modules,因而無法啟動。
VS16,要安裝 Microsoft Visual C++ 2015-2019 Redistributable
vc11,要安裝 Microsoft Visual C++ Studio 2012
編輯 Apache24\conf\httpd.conf
解除下面兩行的註解符號 #
LoadModule rewrite_module modules/mod_rewrite.so
...
Include conf/extra/httpd-vhosts.conf
其它 module 之後視情況再修改。
修改 DirectoryIndex
#DirectoryIndex index.html
DirectoryIndex index.php index.html
修改 SRVROOT 常數
#Define SRVROOT "c:/Apache24"
Define SRVROOT "D:/Servers/httpd/httpd-2.4.53-win64-VS16/Apache24"
新增測試網站
新增資料夾
D:\Web\php8x\htdocs
D:\Web\php7x\htdocs
D:\Web\php5x\htdocs
在裡面各新增一個檔案 phpinfo.php<?php phpinfo(); ?>
修改 apache 的 httpd-vhosts.conf
D:\M\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\conf\extra\httpd-vhosts.conf
共建四個站。第1個是localhost,這個最好保留。第一個不管 ServerName 設成什麼,都會被localhost讀取
LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
AddType application/x-httpd-php php
#預設執行環境
FcgidInitialEnv PHPRC "C:/Servers/php/php-7.4.28-Win32-vc15-x64"
FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "D:/Web/localhost"
ServerName localhost
ErrorLog "logs/localhost-error.log"
CustomLog "logs/localhost-access.log" common
FcgidInitialEnv PHPRC "D:/Servers/php/php-7.4.28-Win32-vc15-x64"
FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000
<Directory "D:/Web/localhost">
Options FollowSymLinks ExecCGI
# All => 讓 .htaccess 可以運作
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "D:/Web/php8x"
ServerName www.php8x.local
ServerAlias php8x.local
ErrorLog "logs/php8x.local-error.log"
CustomLog "logs/php8x.local-access.log" common
FcgidInitialEnv PHPRC "D:/Servers/php/php-8.1.5-Win32-vs16-x64"
FcgidWrapper "D:/Servers/php/php-8.1.5-Win32-vs16-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000
<Directory "D:/Web/php8x">
Options FollowSymLinks ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "D:/Web/php7x"
ServerName www.php7x.local
ServerAlias php7x.local
ErrorLog "logs/php7x.local-error.log"
CustomLog "logs/php7x.local-access.log" common
FcgidInitialEnv PHPRC "D:/Servers/php/php-7.4.28-Win32-vc15-x64"
FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000
<Directory "D:/Web/php7x">
Options FollowSymLinks ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "D:/Web/php5x"
ServerName www.php5x.local
ServerAlias php5x.local
ErrorLog "logs/php5x.local-error.log"
CustomLog "logs/php5x.local-access.log" common
FcgidInitialEnv PHPRC "D:/Servers/php/php-5.6.40-Win32-VC11-x64"
FcgidWrapper "D:/Servers/php/php-5.6.40-Win32-VC11-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000
<Directory "D:/Web/php5x">
Options FollowSymLinks ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
以上我用的都是正斜線 /,比較不會出錯。
為什麼這叫正斜線呢?英文叫 forward slash,人在往前行走或跑步的時候,身體會向前傾。而文字由左至右,所以向右傾斜的就是向前 forward。相反的就是反斜線 bask slash。
修改 Windows hosts檔
C:\Windows\System32\drivers\etc\hosts
127.0.0.1 php8x.local
127.0.0.1 php7x.local
127.0.0.1 php5x.local
執行網頁
第一次執行網頁時,如果沒有在開頭加 www,例如只寫 php8x.local/phpinfo.php,可能會被google當成是在搜尋這個字串。要加上 http:// ,例如 http://php8x.local/phpinfo.php 第二次就沒問題了。