前言
2021年第一篇,最近想用 php
搞个项目玩玩,但万万没想到倒在了环境搭建这一步。
首先在网上冲浪一番后,你会发现PHP的搭建方式其实挺多(但有时候选择多并不是一件好事),目前常见的搭建方式有:Homestead(基于虚拟机)、XAMPP、MAMP、Laradock(基于Docker)等,但这些都比较重量级;轻量级的也有,比如 Valet,但之前试过 Valet 发现它会修改本地配置,典型如Nginx,而且在卸载的时候还不小心把Nginx配置全删了,顿时觉得不太可控,所以最后选择的方案是 Nginx + php-fpm
,足够可用,同时也不会太重量级。
注:本文基于 Mac 环境。
安装流程
- 1.检查 php 是否安装
- 2.检查 composer 是否安装
- 3.检查 laravel 是否安装
- 4.检查 php-fpm 是否安装
- 5.检查 nginx 是否安装
- 6.设置多版本共存
- 7.创建 laravel 项目并测试
检查php是否安装
现在比较新的 Mac 系统都会自带php
以及php-fpm
,如下:
# 版本
$ php -v
PHP 7.3.11 (cli) (built: Jun 5 2020 23:50:40) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
# 执行路径
$ which php
/usr/bin/php
# 配置文件
$ ls /etc/php-fpm.conf
/etc/php-fpm.conf
# 实际的配置文件,因为 /etc/php-fpm.conf 使用了include关键字
$ ls /private/etc/php-fpm.d
www.conf www.conf.default
检查composer是否安装
composer
是php的包管理器,类似 pip
,这个Mac系统就没有自带,需要自己安装。
# 安装
$ brew install composer
$ composer --version
Composer version 1.9.0 2019-08-02 20:55:32
检查laravel是否安装
这个不是非必须,主要是后面会创建laravel项目,来测试php
环境是否搭建成功,建议安装,后续你也会用到。
# 安装
$ composer global require laravel/installer
# 测试
$ laravel --version
Laravel Installer 4.1.1
检查nginx是否安装
由于我搭建php环境选择的方案是 nginx + php-fpm
,所以这里必须安装nginx(其实不管啥方案都会用到nginx,区别是自己安装,还是别人帮你安装好)。
# 安装
$ brew install nginx
# 测试
$ nginx -v
nginx version: nginx/1.19.5
多版本共存
由于历史原因,很多项目的php版本并没有一个统一的标准,项目版本可能会在php5.6、php7.2,甚至php8.0之间跳跃,而版本的不一致则带来语法的不一致,导致出现一些奇怪的问题,所以多版本共存就显得非常重要。
本次通过homebrew
实现多版本并存,实现起来也比较简单,首先我们弃用Mac自带的php,全部使用brew安装的。
安装php5.6
# 安装
$ brew install php@5.6
# 配置环境变量 (可通过 brew info php@5.6 查看)
echo 'export PATH="/usr/local/opt/php@5.6/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/usr/local/opt/php@5.6/sbin:$PATH"' >> ~/.zshrc
安装php7.2
# 安装
$ brew install php@7.2
# 配置环境变量 (可通过 brew info php@7.2 查看)
echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.zshrc
php-fpm 配置不同端口
多版本共存的核心是启动不同版本的 php-fpm,所以就要避免端口占用。
为啥需要 php-fpm 呢?这也是我一开始疑惑的地方,这是因为PHP不像Javascript,可以直接被浏览器解析,所以当用户请求PHP程序时,会先经过Nginx,Nginx会通过php-fpm将请求转发到php解释器,并进行处理,具体可以参考这里
# 配置文件路径可通过 brew info php@5.6 或者 brew info php@7.2 得到
# php5.6 监听9001端口
$ vim /usr/local/etc/php/5.6/php-fpm.conf
listen = 127.0.0.1:9001
# php7.2 监听9002端口
$ vim /usr/local/etc/php/7.2/php-fpm.d/www.conf
listen = 127.0.0.1:9002
启动服务
# 启动php5.6
brew services start shivammathur/php/php@5.6
# 启动php7.2
brew services start php@7.2
# 查看
$ ps -ef | grep php-fpm
501 12981 1 0 11:35上午 ?? 0:00.15 /usr/local/opt/php@5.6/sbin/php-fpm --nodaemonize
501 12988 12981 0 11:35上午 ?? 0:00.74 /usr/local/opt/php@5.6/sbin/php-fpm --nodaemonize
501 12989 12981 0 11:35上午 ?? 0:00.00 /usr/local/opt/php@5.6/sbin/php-fpm --nodaemonize
501 13141 1 0 11:35上午 ?? 0:00.14 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize
501 13148 13141 0 11:35上午 ?? 0:00.17 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize
501 13149 13141 0 11:35上午 ?? 0:00.00 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize
此时php多版本搭建完毕,通过后面的测试可以查看搭建是否成功。
项目部署及测试
本次我们会通过部署两个版本的laravel项目,从而测试上述多版本的正确性,以及让朋友们知道如何部署php项目。
1.创建项目
# 创建项目
# laravel 5.2 要求的php版本最低是 5.5.9
composer create-project laravel/laravel=5.2.* php56 --prefer-dist
# laravel 5.6 要求的php版本最低是 7.1.3
composer create-project laravel/laravel=5.6.* php72 --prefer-dist
2.创建 blog56 的配置
vim /usr/local/etc/nginx/servers/php56.conf
server {
# 监听的端口,也就是我们访问的端口
listen 6001 default_server;
server_name 127.0.0.1;
# 默认网站根目录(www目录)
root /Users/xxx/PhpstormProjects/php56/public;
access_log /Users/xxx/PhpstormProjects/php56/access.log;
error_log /Users/xxx/PhpstormProjects/php56/error.log;
location / {
try_files $uri /index.php?$query_string;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
location ~ \.php$ {
# 这个是我们上述设置的端口,9001会交由 php5.6 处理
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3.创建 blog72 的配置
vim /usr/local/etc/nginx/servers/php72.conf
server {
# 监听的端口,也就是我们访问的端口
listen 6002 default_server;
server_name 127.0.0.1;
# 默认网站根目录(www目录)
root /Users/xxx/PhpstormProjects/php72/public;
access_log /Users/xxx/PhpstormProjects/php72/access.log;
error_log /Users/xxx/PhpstormProjects/php72/error.log;
location / {
try_files $uri /index.php?$query_string;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
location ~ \.php$ {
# 这个是我们上述设置的端口,9002会交由 php7.2 处理
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
4.访问测试: 浏览器访问 http://localhost:6001/
以及 http://localhost:6002/
可以看到欢迎界面
踩坑总结
1.Nginx配置一定要加上 access_log
和 error_log
,这样出错的时候才能定位到,因为很多情况下都是Nginx配置出问题!!!
2.注意浏览器代理问题,很多人包括我习惯性在浏览器测试(GET请求),但有时候由于代理问题,请求会失败,这时可尝试在命令行,或者其他浏览器执行(个人经验)
3.之前一开始配置时参考过一篇文章[《Laravel 项目部署,php-fpm 及 nginx 配置》],但是配置后会出现"访问直接下载index.php文件"的情况,原因是该文的Nginx配置有点问题:
# 作者的配置(不能说他配置有问题,只能说大家环境不同)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 实际的配置
location / {
try_files $uri /index.php?$query_string;
}
解决方案参考:https://stackoverflow.com/questions/19285355/nginx-403-error-directory-index-of-folder-is-forbidden
提醒:这里要给个提醒,很多人由于配置不正确(权限或者路径问题),导致访问失败,所以切记一定要加上 access_log 和 error_log,才能知道报了什么错!!另外,有时候可能由于代理问题,在浏览器直接测试可能会不成功。
参考
1.PHP安装配置篇-学院君
2.mac中利用brew实现多版本php共存以及任意切换
3.Mac下启动php-fpm问题解决
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!