前言
架设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 = utf8mb4collation-server = utf8mb4_general_ciinit-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=bz2extension=curl;extension=ffi;extension=ftpextension=fileinfoextension=gd2extension=gettext;extension=gmp;extension=intl;extension=imap;extension=ldapextension=mbstringextension=exif ; Must be after mbstring as it depends on itextension=mysqliextension=oci8_12c ; Use with Oracle Database 12c Instant Clientextension=odbcextension=openssl;extension=pdo_firebirdextension=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 = 50Mupload_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
将所有预设的 c:/Apache24 改成正确的路径。例如 D:/Servers/httpd-2.4.53-win64-VS16/Apache24视情况修改 #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.htmlDirectoryIndex 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.soAddHandler fcgid-script .fcgi .phpAddType 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" .phpFcgidMaxRequestLen 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.local127.0.0.1 php7x.local127.0.0.1 php5x.local
执行网页
第一次执行网页时,如果没有在开头加 www,例如只写 php8x.local/phpinfo.php,可能会被google当成是在搜寻这个字串。要加上 http:// ,例如 http://php8x.local/phpinfo.php 第二次就没问题了。