【Windows】安装 Apache Web Server(含多版本PHP并存)

前言
架设php最简单的方法,大概是用xampp。但是有时候专案会用到不同php版本,需要切换。就算用xampp也是要做切换,而不是并存。因此後来自己的电脑都没使用xampp了。而且我架 Web Server 都是用免安装,可以带着走。换电脑、重装 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, 在上面按右键,启动

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/
https://ithelp.ithome.com.tw/upload/images/20220414/20148098sgyQtpived.jpg

下载
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
;暂存资料夹
;upload_tmp_dir =
upload_tmp_dir = "tmp"

有时候需要在作业系统层面执行 php,例如在 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,注意版本要符合。
https://ithelp.ithome.com.tw/upload/images/20220414/20148098J5AapSifBG.jpg

解压缩之後,把 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

  1. 将所有预设的 c:/Apache24 改成正确的路径。
    例如 D:/Servers/httpd-2.4.53-win64-VS16/Apache24
  2. 视情况修改 #ServerName www.example.com:80 。若使用 httpd-vhosts.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 [email protected]
    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 [email protected]
    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
        # All => 让 .htaccess 可以运作
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


<VirtualHost *:80>
    ServerAdmin [email protected]
    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
        # All => 让 .htaccess 可以运作
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


<VirtualHost *:80>
    ServerAdmin [email protected]
    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
        # All => 让 .htaccess 可以运作
        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

执行网页
https://ithelp.ithome.com.tw/upload/images/20220414/20148098U8QPL4xG7J.jpg

第一次执行网页时,如果没有在开头加 www,例如只写 php8x.local/phpinfo.php,可能会被google当成是在搜寻这个字串。请加上 http://
http://php8x.local/phpinfo.php
第二次就没问题了。


<<:  忘记 PPPoE 拨接的帐号和密码

>>:  【C#】Creational Patterns Abstract Factory Mode

【零基础成为 AI 解梦大师秘笈】Day30 - Django 整合部署 AI model

AI 解梦最终秘笈 前言 系列文章简介 大家好,我们是 AI . FREE Team - 人工智慧自...

EP 09 - [TDD] Message 加密及解密 (1/2)

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

Day2-JavaScript(JS)与TypeScript(TS)的差异比较

第二天,我们来谈谈JavaScript(JS)与TypeScript(TS)的比较吧! 使用Java...

[DAY2] 适者生存下的环境

前言 哈罗,我是神天,一个不专业的废物.w. 欢迎大佬在下面用力的鞭打我这个不成熟的废物 昨天忘记提...

Real Microsoft MS-900 Dumps - Get Outstanding Results

Why it is important to pass the Microsoft 365 MS-9...