基于 WSL 在 Windows 中搭建 PHP 本地开发环境

前言

这两天,想必大家都已经刷到这个新闻了 ——「微软宣布 Windows 不再提供对 PHP 的官方支持」:

其实也不必惊慌,Windows 只是不再对 PHP 8.0 及后续版本提供 Windows 版 PHP,在此之前的版本还可以放心使用,只是之前那种基于 Windows 版本的 PHP 集成开发环境需要为未来做好准备。

不过,在学院君这里,我一直给大家推荐的本地集成开发环境是 Laradock,这种 Docker 镜像是基于 Linux 的,与 Windows 系统本身无关,所以不受这个支持的影响。

如果你没有使用 Laradock 的话,现在使用 Windows 官方提供的 Linux 虚拟机方案 WSL 来搭建本地 PHP 开发环境也可以很好地绕过这个限制,并且学院君认为这种基于 Linux 虚拟机的 PHP 环境比 Windows 版本的 PHP 功能更加强大,扩展性也更好:

首先,各种 PHP 扩展都是优先针对 Linux 系统开发、编译和使用的,Windows 系统对应的扩展本身就会滞后,如果长期不支持,那就一直用不上这个扩展,比如之前的 Redis 扩展就是;另外,Windows 系统自身的限制会导致某些 PHP 库函数无法调用,也从某种意义上削弱了 Windows 版 PHP 的功能,比如邮件发送相关的库函数就是如此;最后,我们的生产环境操作系统基本都是 Linux 的,如果以 Windows 作为本地开发环境,所有的代码、扩展、功能都要经过测试系统的严格测试才能上线,否则可能会有不同操作系统处理机制的不一致导致本地代码运行正常,而到了线上环境运行失败的尴尬场面。

所以这些年来,无数前浪相继在原生虚拟机、Vagrant、Docker 等本地开发环境与线上生产环境一致性的解决方案上不断做出努力和迭代,如果到了 2020 年这个时间点上,还在为了不想改变、为了所谓的简单抱守 Windows 版本 PHP 开发环境做本地开发,然后每次上线都战战兢兢,或者为扩展问题不能在本地使用/测试某些功能,就有点不合时宜,与时代脱轨了。

所以从某种意义上说,Windows 宣布官方不再支持 PHP 是件好事情,大家自己玩,能玩的更遛,这里,学院君给大家演示两种在 Windows 系统替代原生 PHP 搭建开发环境的解决方案。

一种是基于 WSL 虚拟机,一种是基于 Laradock。首先,我们来看看如何基于 WSL 搭建 PHP 本地开发环境。

这里,学院君以自己的 Windows 10 专业版操作系统为例作为演示平台。使用 Windows 10 专业版的好处是对开发者友好,很多东西都可以原生支持,比如 Docker Desktop for Windows,这样就不需要自己去折腾其他替代解决方案,如果你在使用 Windows 作为主力操作系统,推荐升级到 Windows 10 专业版。

安装 WSL 版 Ubuntu

WSL 全名是 Windows Subsystem for Linux,即 Windows 中的 Linux 子系统,实际上这是一个与 Windows 系统高度整合的 Linux 虚拟机,极大简化了传统通过 VirtualBox 或者 VMware 等软件安装/启动虚拟机的流程和配置,上手即可使用,而且能够和本地宿主机系统高度兼容(共享文件系统、网络层、进程列表等)。

以 PHP 应用为例,无需配置端口映射即可直接访问 WSL 中运行的 PHP 项目,也可以直接在 WSL 中使用宿主机的某些软件,比如 Visual Studio Code,通过它来编辑虚拟机配置文件,非常方便。

关于 WSL 的启用和初始化配置(我这里使用的是 WSL 2 版本),可以参考 Windows 官方提供的相关文档:Windows Subsystem for Linux Installation Guide for Windows 10,执行完命令并重启系统后,在 Windows 商店搜索「Linux」并选择「Ubuntu 18.04」发行版进行下载安装:

安装完成后就可以通过「启动」按钮启动这个 Ubuntu 虚拟机:

系统初始化

在打开的虚拟机终端窗口中,你可以使用阿里巴巴提供的 Ubuntu 软件源镜像地址替代系统自带的地址来加速虚拟机的软件下载速度,具体步骤参考这篇教程的设置即可,注意要选择适用于 Ubuntu 18.04 版本的配置来更新软件源。

然后运行如下命令更新并升级这个 Ubuntu 系统:

sudo apt update
sudo apt upgrade

安装 PHP 相关软件

接下来,我们可以完全使用这个 Ubuntu 虚拟机终端窗口作为本地开发环境的工作台(Workspace,打开速度很快,就像本地的终端工具一样),Windows 自带的那些狗屎终端工具都可以扔掉了(命令行工具、Powershell、Windows Terminal)。

首先,我们运行如下命令在虚拟机中安装 PHP:

sudo apt install php php-mbstring php-dom php-xml php-zip php-curl php-xdebug

我们安装了 PHP 核心,以及一些必要的扩展,然后安装 Composer:

sudo apt install composer

关于 Composer 的安装也可以使用官方提供的安装步骤:Installation - Linux/Unix/macOS

最后,我们安装下 Git:

sudo apt install git

你可以通过查看版本号验证相关软件已经安装成功:

可以看到,当前安装的 PHP 版本号是 7.2.24,你可以通过升级软件源的方式升级 PHP 到更高版本。

访问本地 PHP 脚本

最后,我们来测试下在 Ubuntu 虚拟机终端窗口运行 Windows 主机上的 PHP 脚本。Windows 主机的文件系统是挂载在 Ubuntu 虚拟机的 /mnt 目录下的:

上面的 c 代表 Windows 宿主机的 C 盘,d 代表 Windows 宿主机的 D 盘,我们通过 ls -l d 遍历该目录,可以看到它与 Windows 文件系统 D 盘目录的目录结构完全一致:

我们可以通过 Visual Studio Code 在 D 盘的 scripts 目录下新建一个 test.php

然后在 Ubuntu 虚拟机中执行这个 PHP 脚本:

这样,我们就可以在 Windows 宿主机通过 Visual Studio Code 或者 PhpStorm 等编辑器编写代码,然后将 Ubuntu 虚拟机作为终端窗口,在对应的挂载目录下执行 PHP 代码了,非常简单。

当然,你还可以在 WSL 中安装 Nginx、MySQL、Apache 等软件,然后启动一个完整的 PHP Web 项目,通过宿主机的浏览器访问,就像这个项目运行在本地 Windows 系统一样。这些都得益于 WSL 与 Windows 宿主机共享网络和文件系统,因此无需像传统虚拟机那样还要再配置端口映射和共享文件夹。

下篇教程,学院君将给大家演示如何在本地 PhpStorm 中集成安装在 WSL 虚拟机中的 PHP CLI,然后在 PhpStorm 中通过 WSL 中的 PHP 执行代码调试、单元测试等工作。

上一篇: PHP/Laravel 本地开发环境搭建:Windows 篇

下一篇: 在 WSL 2 虚拟机中基于 Docker 编排 LNMP 运行环境