常年在 Windows 下做 PHP
开发,经历了很多痛苦,这个痛苦主要来自于 PHP
环境和开发工具。工欲善其事,必先利其器,就是这个“器”折磨了我很久。
其实在 Windows 下只做一些简单的 PHP
开发还是可以的,而且 Windows 下有很多一键安装包,省去了我们搭建环境的麻烦和时间,此前我一直使用的就是 Laragon
,自由灵活,墙裂推荐。但是比如 Redis
高版本之后,就没有相应的 Windows 版本了,还有定时任务、异步队列等功能,在 Windows 下开发就变得举步维艰。
后来,我使用了很长一段时间的 VirtualBox
+ CentOS
+ PHP
的方案,这在一定程度上使得我的开发环境与正式环境基本能够保持一致。不过由于太耗性能,再加上 Windows 提供了更好的方案,就放弃了这种开发方式。
直到 WSL2
出现,我便彻底转到 WSL2
下开发了,而且 PhpStorm
对 WSL
支持的也很好,最关键的是 WSL2
既方便又轻量,对于我来说是作为开发环境的不二之选。
Windows 开启 WSL2
墙裂推荐使用 Windows terminal,与 WSL2 结合使用,简直是天作之合。
官方文档:适用于 Linux 的 Windows 子系统文档 | Microsoft Docs
新版安装方式
wsl --install
此命令将启用所需的可选组件,下载最新的 Linux 内核,将 WSL2
设置为默认值,并安装 Linux 发行版(默认安装 Ubuntu)。
更改默认安装的 Linux 发行版
查看可安装的 Linux 发行版
wsl -l -o
安装其它 Linux 发行版
wsl --install -d <Distribution Name>
将 <Distribution Name>
替换为要安装的发行版的名称。
等待安装完成,设置用户名和密码即可。
子系统安装在 %LOCALAPPDATA%\Packages
中,里面带有 Ubuntu 的文件夹就是了。
资环管理器访问也极为方便,微软果然在 Linux 的道路上越走越远,难怪大家都说 Windows 是 Linux 最好的发行版🤣。
准备
使用 Windows terminal 进入 Ubuntu 后,还有一些准备工作要做。
因为个人很喜欢用
oh-my-zsh
所以所有的设置都是在~/.zshrc
中,如果不使用zsh
的话,把~/.zshrc
换成~/.bashrc
即可!
设置普通用户 sudo 不需要输入密码
不然每次使用 sudo 都要输入密码,实在太烦了。
sudo vim /etc/sudoers
# %sudo ALL=(ALL:ALL) ALL 这里注释掉,新增下面一条
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
使用 wq!
强制保存
更换镜像
此处以阿里云镜像为例,使用以下命令快速更换
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
或者手动编辑文件
sudo vim /etc/apt/sources.list
清空原来的内容(非 insert 状态下,连续按 D 键,可以逐行删除),添加以下内容
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
更新软件
sudo apt update
sudo apt list --upgradable
sudo apt upgrade -y
安装必要的软件
sudo apt install -y zip unzip curl gnupg2 ca-certificates lsb-release ubuntu-keyring
安装 Nginx
安装 Ubuntu 发行的 Nginx
sudo apt install -y nginx
个人不喜欢 Ubuntu 发行的 Nginx 的目录结构,另外使用 Nginx 官方提供的安装方式,可以保持 Ubuntu 和 CentOS 下 Nginx 的一致性。
使用官网提供的方式安装 Nginx
官方文档:http://nginx.org/en/linux_packages.html#Ubuntu
导入官方 Nginx 签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
验证下载的文件是否包含正确的密钥
gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
设置 apt 仓库默认安装稳定版本的 Nginx
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
设置 apt 存储库优先使用官方的包而不是 Ubuntu 提供的包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
执行安装
sudo apt update
sudo apt install nginx
安装 PHP
全文以
8.1
为例,若要安装其它版本,只需将8.1
换为相应版本即可,若要安装多个PHP
版本,只需重复执行安装即可。需要注意的是PHP cli
会默认使用最新安装的PHP
版本。
# 添加 PHP 的 PPA 源
sudo add-apt-repository ppa:ondrej/php
# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list
# 更新 apt 存储库
sudo apt update
# 安装 PHP 8.1 扩展
sudo apt install -y php8.1-fpm php8.1-cli php8.1-bcmath php8.1-curl php8.1-gd php8.1-mbstring php8.1-mysql php8.1-xml php8.1-zip php8.1-dev
安装 MySQL
执行安装
sudo apt install -y mysql-server-8.0
MySQL 启动报错
sudo usermod -d /var/lib/mysql/ mysql
启动 MySQL
sudo service mysql start
查看 MySQL 初始密码
sudo cat /etc/mysql/debian.cnf
登录 MySQL
mysql -u debian-sys-maint -p
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的密码';
FLUSH PRIVILEGES;
使用 Navicat 连接 MySQL 直接用
127.0.0.1
连接,不要使用localhost
连接
安装 Redis
官方文档:https://redis.io/download
# 添加 Redis 的 PPA 源
sudo add-apt-repository ppa:redislabs/redis
# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list
# 更新 apt 存储库
sudo apt update
# 安装 Redis
sudo apt install redis
安装 phpredis 扩展
安装多版本
PHP
扩展,如果使用sudo pecl -d install redis
直接安装,新安装的扩展会覆盖前面安装的扩展,导致在使用前面安装的PHP
版本时会报错。
sudo pecl -d php_suffix=8.1 install redis
安装 swoole 扩展
sudo pecl -d php_suffix=8.1 install swoole
启用扩展
此处以 PHP8.1
为例,启用 redis
扩展。
sudo su
printf "; priority=20\nextension=redis.so\n" > /etc/php/8.1/mods-available/redis.ini
printf "; priority=20\nextension=swoole.so\n" > /etc/php/8.1/mods-available/swoole.ini
exit
sudo phpenmod -v 8.1 redis swoole
安装composer
下载安装文件
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
下载 composer.phar 文件
php composer-setup.php
删除安装文件
php -r "unlink('composer-setup.php');"
全局安装(推荐)
sudo mv composer.phar /usr/local/bin/composer
更换中国镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
升级 Git 到最新版
# 添加 Git 的 PPA 源
sudo add-apt-repository ppa:git-core/ppa
# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list
# 更新 apt 存储库
sudo apt update
# 更新 Git
sudo apt upgrade -y
配置 Nginx 和 PHP
是
php-fpm
和Nginx
和网站根目录都属于同一个用户(你的用户),避免各种读取、编辑、运行的权限问题。
创建 /var/www/html
目录(个人喜好)
sudo mkdir -p /var/www/html
修改所有者
sudo chown -R 你的用户名:你的用户名 /var/www/html
修改 Nginx 配置
sudo vim /etc/nginx/nginx.conf
user 你的用户名
修改 php-fpm 配置
sudo vim /etc/php/8.1/fpm/pool.d/www.conf
user = 你的用户名
group = 你的用户名
listen.owner = 你的用户名
listen.group = 你的用户名
Nginx 站点配置文件示例
fastcgi_buffering
设置为off
是为了防止WSL
死机。
fastcgi_pass
设置为该站点需要的PHP
版本。
server {
listen 80;
server_name localhost;
root /var/www/html;
fastcgi_buffering off;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_buffering off;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
设置开机启动 Nginx、php-fpm、MySQL、Redis
vim ~/.zshrc
添加以下内容,如果同时安装了 PHP8.1
和 PHP7.4
则将 php8.1-fpm
和 php7.4-fpm
都放到 services
中。
# 设置服务自启
services=(nginx php8.1-fpm php7.4-fpm mysql redis-server)
for service in "${services[@]}"
do
if (( $(ps -ef | grep -v grep | grep $service | wc -l) == 0 ))
then
# Uncomment to get messages.
# echo "Starting service ${service}"
(sudo service $service start > /dev/null &)
fi
done
重启终端,再次进入 Ubuntu 服务就会自动开启。PHP
开发环境到这就算基本完成了,当然这只是在 Windows 下搭建 PHP 开发环境的一种方案,也是我个人的喜好,你也可以在 WSL2
中安装宝塔面板一类的软件,或者是使用 docker
容器技术来搭建。总之,在 Windows 下搭建 PHP
开发环境有很多方案,没有最好的,只有最适合的。
顺便吐槽一句, PHP
要是和 Golang
开发和部署都一样方便就好了!😅