我这篇文章配置的是 Windows 的 PHP 开发环境,如果要看 Linux 服务器环境可以访问 Linux 安装和配置 Caddy + PHP + MySQL。
我之前的 PHP 开发环境使用的是 Apache + MySQL + PHP 的集成工具,比较常见的 XAMPP、phpStudy 我都用过。PHP 集成工具对于刚学 PHP 的新手来说确实比较方便,不用写配置文件,安装完成就能自动配置一个 PHP 网站环境。
最近电脑重装了系统,我准备把本地的 PHP 开发环境的 Web 服务器换成 Caddy,MySQL 和 PHP 也准备手动安装配置。
我这里使用的 PHP 环境都是免安装的,PHP 下载解压后就能用,Caddy 是一个 exe 单文件,可以直接运行,MySQL 官方提供了安装包和免安装版,我这里会选择免安装版手动初始化。
Windows 没有完善的包管理器,寻找和下载可能会比 Linux 要麻烦一些,如果你只想快速搭建一个 PHP 开发环境,或者你是刚学 PHP 的新手的话,建议使用 phpStudy 之类的集成环境。
注意,我这里配置的环境主要用来本地开发,不适合用于线上的服务器环境!
一些可选的软件推荐 {#%E4%B8%80%E4%BA%9B%E5%8F%AF%E9%80%89%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%907905}
这是微软的新版命令行终端,支持一个窗口多个标签页的方式来管理多个终端,后面的 MySQL、Caddy、PHP 可能需要开多个终端,用这个新版终端方便管理。
微软的代码编辑器,也是现在最流行的代码编辑器之一。各种语言的项目开发或用来编辑配置文件之类的都可以。
下载和配置 PHP {#%E4%B8%8B%E8%BD%BD%E5%92%8C%E9%85%8D%E7%BD%AE+PHP9820}
访问 https://windows.php.net/downloads/releases/archives/ ,这是 PHP 官方的 Windows 版 PHP 存档,这里提供了从 5.2 到最新版本的 PHP 下载,你可以选择需要的版本下载,你也可以同时下载多个版本。
如果你用的是 Apache 可以选择 Win32-vc15-x64.zip
的链接,如果是其它服务器的话可以选择 nts-Win32-vc15-x64.zip
的链接,我用的 Caddy 选择的是 nts-Win32-vc15-x64.zip
的链接。
你可以创建一个目录来存放 PHP,我下面的 PHP 会放到 D:\www\bin\php
。
把下载的 PHP 压缩包移动到存放位置解压,解压完成后应该能看到 php.exe
、php.ini-development
、php.ini-production
这些文件,把 php.ini-development
重命名为 php.ini
。
打开 php.ini
,默认的 PHP 配置可能会有一些扩展功能没有启用,你可以查找下面列表中的配置项,如果前面有 ;
就去除 ;
,配置完成后保存。
extension=mysqli
extension=pdo_mysql
extension=pdo_pgsql
extension=pdo_sqlite
extension=pgsql
extension=openssl
extension=curl
extension=sqlite3
上面都是一些常用功能和数据库扩展。
为了方便在命令行操作 PHP,可以配置一下环境变量,Windows 配置 PHP 环境变量可以参考 Win10 配置 MySQL 和 PHP 的环境变量 。
下载 MySQL {#%E4%B8%8B%E8%BD%BD+MySQL6010}
访问 https://downloads.mysql.com/archives/community/ ,Product Version(MySQL)版本可以选择你需要的版本,我这里选择的是 8.0,Operating System(操作系统)选择 Microsoft Windows。
选择完成后可能会有几个文件可以选择:
- MSI Installer(Windows 安装程序)
- ZIP Archive(ZIP免安装版)
- ZIP Archive, Debug Binaries & Test Suite(用于 MySQL 相关的开发)
为了避免安装程序在我电脑里生成我不需要的组件和文件,我这里会选择 ZIP 免安装版。
下载的 ZIP 压缩包解压后可能还会有一个带版本号的 mysql 目录,MySQL 相关的程序和库就在 mysql 目录里。
继续配置 MySQL 的环境变量,参考 Win10 配置 MySQL 和 PHP 的环境变量。
MySQL 初始化 {#MySQL+%E5%88%9D%E5%A7%8B%E5%8C%969043}
这里的初始化是用于 ZIP 免安装版的,安装程序在安装的时候就已经初始化了。
在你的 MySQL 目录创建一个 my.ini
文件,可以拷贝下面的内容到你的 my.ini
文件中,部分需要修改为你自己的设置:
[client]
# MySQL 客户端字符编码
default-character-set=utf8mb4
[mysqld]
# MySQL 端口,这里使用 3306
port = 3306
# MySQL 的文件目录
basedir=D:\\www\\bin\\mysql-8.0.21-winx64
# MySQL 数据库文件的存放目录
datadir=D:\\www\\bin\\mysql-8.0.21-winx64\\data
# 最大连接数
max_connections=20
# MySQL 服务端字符编码
character-set-server=utf8mb4
# 存储引擎
default-storage-engine=INNODB
我的 MySQL 目录是 D:\www\bin\mysql-8.0.21-winx64
,MySQL 数据库文件存放目录是 D:\www\bin\mysql-8.0.21-winx64\data
,路径分隔符我这里使用了两个反斜杠 \\
,如果使用一个 \
的话,会被识别为转义符号。
配置文件保存后你还需要手动创建 MySQL 数据库文件的存放目录,我上面配置的是 D:\www\bin\mysql-8.0.21-winx64\data
,我需要在 D:\www\bin\mysql-8.0.21-winx64
创建一个 data
目录。
打开命令行,输入:
mysqld --initialize --user=root --console
成功初始化应该会输出类似下面的提示:
2024-08-06T15:42:17.347652Z 0 [System] [MY-013169] [Server] D:\www\bin\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 15260
2024-08-06T15:42:17.360276Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-08-06T15:42:26.711751Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-08-06T15:42:39.866313Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 0w#PMOd&;B7t
同时也会自动为 root
用户生成一个密码,我上面的 root 密码就是 0w#PMOd&;B7t
。
启动 MySQL:
mysqld --console
成功启动应该会输出类似下面的日志信息:
2024-08-06T15:47:01.461882Z 0 [System] [MY-010116] [Server] D:\www\bin\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) starting as process 4292
2024-08-06T15:47:01.771951Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-08-06T15:47:03.970285Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-08-06T15:47:04.896276Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060
2024-08-06T15:47:06.348869Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-08-06T15:47:06.349340Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-08-06T15:47:06.455195Z 0 [System] [MY-010931] [Server] D:\www\bin\mysql-8.0.21-winx64\bin\mysqld.exe: ready for connections. Version: '8.0.21' socket: '' port: 3306 MySQL Community Server - GPL.
这时候命令行应该无法输入,你需要再开一个命令行终端,不要关闭之前的命令行终端。
下面连接到数据库,输入:
mysql -uroot -p
如果显示 password
就输入初始化时生成的密码,连接成功后会显示一段欢迎信息。
下面修改默认的 root 密码,输入:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
比如我要把密码修改为 misterma.com
:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'misterma.com';
修改完成后输入:
EXIT;
退出 MySQL。
你可以再输入:
mysql -uroot -p
使用新密码尝试连接数据库。
下载和配置 Caddy {#%E4%B8%8B%E8%BD%BD%E5%92%8C%E9%85%8D%E7%BD%AE+Caddy4849}
访问 https://caddyserver.com/download ,Platform(平台)选择 Windows amd64,直接点击 Download 下载。
下载完成后是一个 .exe 的单文件,你可以把文件名称改为 caddy.exe
,你可以把这个 caddy.exe 放到一个单独的目录中,在存放 caddy.exe 的目录中创建一个 Caddyfile
文件作为 Caddy 的配置文件。
下面在 Caddyfile 中配置一个 PHP 站点:
http://:80 {
# 网站目录
root * D:\www\site
# 启用静态文件服务和文件目录显示
file_server browse
# 配置 caddy 和 php-cgi 的通信
php_fastcgi 127.0.0.1:9000
}
在你存放 caddy.exe 的目录中打开一个命令行终端,如果你用的是我上面推荐的新版命令行终端的话,直接在资源管理器鼠标右击,选择 在终端中打开
,就可以在当前的路径下打开一个命令行终端。
如果你要用自带命令行终端的话,也可以打开 Powershell,通过 cd
跳转到指定路径,比如我的 caddy.exe 和配置文件放到了 D:\www\bin\caddy
目录,我就可以直接输入:
cd D:\www\bin\caddy
跳转到存放 caddy 的目录。
进入存放 caddy.exe 和配置文件的目录后输入:
./caddy run
启动 Caddy,成功启动后应该会输出一些日志信息。
Caddy 启动成功后你的命令行应该无法输入,你需要再开一个命令行,输入:
php-cgi -b 127.0.0.1:9000
启动 php-cgi,启动成功后不会输出任何信息,你也不能关闭命令行窗口。
测试 {#%E6%B5%8B%E8%AF%952725}
进入你的 PHP 网站目录,我上面 Caddyfile 配置的是 D:\www\site
,在网站目录创建一个 index.php
,加入:
<?php
phpinfo();
index.php
文件保存后打开浏览器,在地址栏输入 localhost
,如果你配置的不是 80 端口的话,需要加端口号,比如 localhost:8080
。
如果 Caddyfile 配置没有错误,并且成功启动了 Caddy 和 php-cgi 的话,你应该能看到一个 PHP 的信息页面,这个页面会显示 PHP 版本和扩展功能之类的信息。
如果要测试数据库连接的话,你也可以下载一个 phpMyAdmin,这是一个使用 PHP 编写的 MySQL 管理工具,也是使用量最多的 MySQL 管理工具之一。
访问 https://www.phpmyadmin.net/,直接点击Download
下载,下载完成后应该是一个 ZIP 的压缩包,把这个压缩包放到你的 PHP 网站目录解压。打开浏览器,在地址栏输入 localhost
,就像访问本地 PHP 网站一样的使用 phpMyAdmin。
常用命令 {#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A43848}
在配置了环境变量后,可以在任何位置使用命令。
启动 MySQL:
mysqld --console
启动后命令行终端无法输入,关闭终端就会关闭 MySQL。
启动 PHP-cgi:
php-cgi -b 127.0.0.1:9000
启动后命令行终端无法输入,关闭终端就会关闭 PHP-cgi。
Caddy 也可以配置环境变量,只需要把存放 caddy.exe 的目录路径添加到环境变量,你就可以在任何位置使用 caddy
命令。我下面会使用 caddy
命令来操作 Caddy。
使用当前目录下的 Caddyfile 文件启动 Caddy:
caddy run
启动前需要先进入存放 Caddyfile 的目录,启动后命令行终端无法输入,关闭终端也会关闭 Caddy。
如果你要在其它目录运行 caddy run,你需要使用 --config
参数来指定 Caddyfile 的位置,比如我的 Caddyfile 在 D:\www\bin\caddy\Caddyfile
,我可以使用:
caddy run --config D:\www\bin\caddy\Caddyfile
启动 Caddy。
Caddy 可以在后台启动,启动后命令行终端可以继续输入和使用,使用当前目录下的 Caddyfile 在后台启动 Caddy:
caddy start
如果要在其它目录使用 caddy start
还是一样的使用 --config
参数来指定 Caddyfile:
caddy start --config D:\www\bin\caddy\Caddyfile
关闭命令行终端也会关闭 Caddy。
如果你要手动关闭后台启动的 Caddy 可以使用:
caddy stop
如果你感觉输入命令比较麻烦的话,也可以编写一个 Powershell 脚本。
创建一个 .ps1
后缀的文件,比如 start.ps1
,编写脚本内容:
# 启动 MySQL
Start-Process -NoNewWindow -FilePath "mysqld" -ArgumentList "--console"
# 启动 PHP-CGI
Start-Process -NoNewWindow -FilePath "php-cgi" -ArgumentList "-b 127.0.0.1:9000"
# 启动 Caddy
Start-Process -NoNewWindow -FilePath "caddy" -ArgumentList "run --config D:\www\bin\caddy\Caddyfile"
上面的 Caddyfile 需要改成你的 Caddyfile 路径,文件保存后 右击 ,选择 使用 Powershell 运行,上面的命令会在一个 Powershell 窗口中运行,关闭 Powershell 也会关闭启动的 PHP-cgi、MySQL、Caddy。