我这篇文章配置的是 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 之类的集成环境。

注意,我这里配置的环境主要用来本地开发,不适合用于线上的服务器环境!

一些可选的软件推荐

Terminal新版命令行终端

这是微软的新版命令行终端,支持一个窗口多个标签页的方式来管理多个终端,后面的 MySQL、Caddy、PHP 可能需要开多个终端,用这个新版终端方便管理。

Visual Studio Code

微软的代码编辑器,也是现在最流行的代码编辑器之一。各种语言的项目开发或用来编辑配置文件之类的都可以。

下载和配置 PHP

访问 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.exephp.ini-developmentphp.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

访问 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 初始化

这里的初始化是用于 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

访问 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,启动成功后不会输出任何信息,你也不能关闭命令行窗口。

测试

进入你的 PHP 网站目录,我上面 Caddyfile 配置的是 D:\www\site,在网站目录创建一个 index.php,加入:

<?php

phpinfo();

index.php 文件保存后打开浏览器,在地址栏输入 localhost,如果你配置的不是 80 端口的话,需要加端口号,比如 localhost:8080

如果 Caddyfile 配置没有错误,并且成功启动了 Caddy 和 php-cgi 的话,你应该能看到一个 PHP 的信息页面,这个页面会显示 PHP 版本和扩展功能之类的信息。

phpinfo页面截图

如果要测试数据库连接的话,你也可以下载一个 phpMyAdmin,这是一个使用 PHP 编写的 MySQL 管理工具,也是使用量最多的 MySQL 管理工具之一。

访问 https://www.phpmyadmin.net/,直接点击Download 下载,下载完成后应该是一个 ZIP 的压缩包,把这个压缩包放到你的 PHP 网站目录解压。打开浏览器,在地址栏输入 localhost,就像访问本地 PHP 网站一样的使用 phpMyAdmin。

常用命令

在配置了环境变量后,可以在任何位置使用命令。

启动 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。