PHP本地环境不会搭建,看这里!

前言

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,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
shell复制代码# 版本
$ 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系统就没有自带,需要自己安装。

1
2
3
4
5
shell复制代码# 安装
$ brew install composer

$ composer --version
Composer version 1.9.0 2019-08-02 20:55:32

检查laravel是否安装

这个不是非必须,主要是后面会创建laravel项目,来测试php环境是否搭建成功,建议安装,后续你也会用到。

1
2
3
4
5
6
shell复制代码# 安装
$ composer global require laravel/installer

# 测试
$ laravel --version
Laravel Installer 4.1.1

检查nginx是否安装

由于我搭建php环境选择的方案是 nginx + php-fpm,所以这里必须安装nginx(其实不管啥方案都会用到nginx,区别是自己安装,还是别人帮你安装好)。

1
2
3
4
5
6
shell复制代码# 安装
$ brew install nginx

# 测试
$ nginx -v
nginx version: nginx/1.19.5

多版本共存

由于历史原因,很多项目的php版本并没有一个统一的标准,项目版本可能会在php5.6、php7.2,甚至php8.0之间跳跃,而版本的不一致则带来语法的不一致,导致出现一些奇怪的问题,所以多版本共存就显得非常重要。

本次通过homebrew实现多版本并存,实现起来也比较简单,首先我们弃用Mac自带的php,全部使用brew安装的。

安装php5.6

1
2
3
4
5
6
shell复制代码# 安装
$ 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

1
2
3
4
5
6
shell复制代码# 安装
$ 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解释器,并进行处理,具体可以参考这里

1
2
3
4
5
6
7
8
9
shell复制代码# 配置文件路径可通过 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

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
shell复制代码# 启动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.创建项目

1
2
3
4
5
6
shell复制代码# 创建项目
# 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 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ini复制代码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 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ini复制代码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_logerror_log,这样出错的时候才能定位到,因为很多情况下都是Nginx配置出问题!!!

2.注意浏览器代理问题,很多人包括我习惯性在浏览器测试(GET请求),但有时候由于代理问题,请求会失败,这时可尝试在命令行,或者其他浏览器执行(个人经验)

3.之前一开始配置时参考过一篇文章[《Laravel 项目部署,php-fpm 及 nginx 配置》],但是配置后会出现”访问直接下载index.php文件“的情况,原因是该文的Nginx配置有点问题:

1
2
3
4
5
6
7
8
9
shell复制代码# 作者的配置(不能说他配置有问题,只能说大家环境不同)
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# 实际的配置
location / {
try_files $uri /index.php?$query_string;
}

解决方案参考:stackoverflow.com/questions/1…

提醒:这里要给个提醒,很多人由于配置不正确(权限或者路径问题),导致访问失败,所以切记一定要加上 access_log 和 error_log,才能知道报了什么错!!另外,有时候可能由于代理问题,在浏览器直接测试可能会不成功。

参考

1.PHP安装配置篇-学院君

2.mac中利用brew实现多版本php共存以及任意切换

3.Mac下启动php-fpm问题解决

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%