Mac + Nginx + Mysql + Php


PHP 编译安装

脚本编译安装

MacOS 环境可使用 Homebrew 或 Phpbrew 来安装 PHP,参考代码如下:

  1. # Homebrew 安装示例
  2. brew install php72 --with-apache --with-freetype
  3. # Phpbrew 安装示例
  4. phpbrew install -d 7.4.20 +default +fpm +debug

手动编译安装

1. 清理本机PHP

  1. ```
  2. // phpize
  3. which phpize
  4. sudo rm -rf /usr/bin/phpize
  5. // php
  6. which php
  7. sudo rm -rf /usr/bin/php
  8. sudo rm -rf /usr/lib/php
  9. sudo rm -rf /usr/share/php
  10. // php-config
  11. which php-config
  12. sudo rm -rf /usr/bin/php-config
  13. // php-fpm
  14. which php-fpm
  15. sudo pkill -INT -o php-fpm
  16. sudo rm -rf /usr/sbin/php-fpm
  17. sudo rm -rf /private/etc/php-fpm.d
  18. sudo rm -rf /private/etc/php*
<a name="ry0qm"></a>
### 2. 下载并编译PHP源码

1. 从 [PHP官网](http://php.net) 下载源码, 解压, 并进入该目录。
1. 编译安装。 `./configure` 这一步,参数众多 ,可以尽量减少,以最大限度的减少出错的概率。而没有被编译进来的模块,可以通过对模块单独编译的方式,来二次启用这些模块。这些模块以后会以.so文件的形式,出现在extension目录之中。参数有疑惑时, 可以通过 `./configure --help` 进行查看。
```shell
// 执行过make, 就需要clean, 第一次不需要
make clean

// 编译的配置, 参数根据情况修改
./configure --prefix=/usr/local/php72

// 打包
make

// 安装
sudo make install

3. 进行软链操作

对系统目录下的相关文件,进行软连接操作. 请注意检查对应系统目录下的相关文件,是否删除完成

ln -s /usr/local/php72/bin/phpize /usr/local/bin/phpize
ln -s /usr/local/php72/bin/php /usr/local/bin/php
ln -s /usr/local/php72/bin/php-config /usr/local/bin/php-config

编译参数

—prefix

默认情况下, make install 会将所有文件安装至 /usr/local/bin , /usr/local/lib 等目录,使用 --prefix 可以指定安装路径。

—with-iconv

iconv是一个计算机程序,采用命令行界面,允许将某种特定编码的文件转换为另一种编码。基于GPL公开源代码,是GNU项目的一部分。在各种UNIX操作系统下均可使用。目前还不支持64位架构

执行 ./configure 时失败,且出现如下提示,说明需要安装 libiconv

configure: error: Please specify the install prefix of iconv with --with-iconv=

安装 libiconv

# 下载 libiconv 并解压
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar zxvf libiconv-1.15.tar.gz

# 安装 libiconv 至目录 /usr/local/libiconv
./configure --prefix=/usr/local/libiconv
make
sudo make install

编译 PHP 时指定 libiconv

./configure --with-iconv=/usr/local/libiconv
// 放弃使用 iconv
./configure --without-iconv

运行多版本 PHP

思路: 配置不同版本的PHP-FPM, 分别监听不同端口. 再配合Nginx的配置, 实现多版本PHP的快速切换

已安装 PHP 信息

以 Homebrew 安装的 PHP 为例,安装信息如下:

# PHP 路径如下:
/usr/local/Cellar/php/7.2.11/bin/php
# 查看 php 信息命令
./usr/local/Cellar/php/7.2.11/bin/php -v

# php-fpm 路径如下:
/usr/local/Cellar/php/7.2.11/sbin/php-fpm
# php-fpm 的配置文件路径如下:
/usr/local/etc/php/7.2.11/php-fpm.conf

MacOS 自带的 PHP 信息如下,可以使用 php-fpm -t 命令测试配置文件,会提示配置文件的路径。

# php-fpm 的配置文件路径如下:
/private/etc/php-fpm.conf

# ====== php-fpm -t 输出结果如下 =======
# NOTICE: configuration file /private/etc/php-fpm.conf test is successful

php-fpm 启动脚本配置

为方便管理, 将php源代码中的 init.d.php-fpm.in(php-fpm 启动脚本)文件复制到每个php版本安装文件的 sbin 目录下。将 init.d.php-fpm.in 软链到 /usr/local/bin 目录下,以便在任何目录都可以执行 php72 相关的命令。

# 复制 php-fpm 启动脚本
cp PHP源码路径/sapi/fpm/init.d.php-fpm.in PHP安装路径/sbin
# 软链接 php72
ln -s PHP安装路径/sbin/init.d.php-fpm.in /usr/local/bin/php72

编辑 init.d.php-fpm.in 文件,根据实际的安装路径修改相关的配置。

prefix=/usr/local
exec_prefix=/usr/local/Cellar/php@7.2/7.2.15

# php-fpm 执行文件
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
# php-fpm.confg 配置文件, 使用 php-fpm -t 命令查看
php_fpm_CONF=${prefix}/etc/php/7.2/php-fpm.conf
# php-fpm.pid 保存pid值的文件, 在 php-fpm.conf 中配置
php_fpm_PID=${prefix}/var/run/php72-fpm.pid

编辑 php-fpm.conf 文件,修改“pid”的保存文件路径,确保与上一步的配置相匹配。操作后就能在任意位置通过 php72 start 来启动7.2版本的 php-fpm。

    [global]
    ; Pid file
    ; Note: the default prefix is /usr/local/var
    ; Default Value: none
    pid = run/php72-fpm.pid

可以根据 init.d.php-fpm.in 文件的相关配置,手动尝试手动运行 php-fpm。

./php-fpm --fpm-config=/usr/local/etc/php/7.2/php-fpm.conf --pid=/usr/local/var/run/php72-fpm.pid

php-fpm 启动脚本错误

执行 php-fpm 启动脚本时,出现报错找不到该命令。是因为文件的权限信息没有正确配置,需要将该文件设置为可执行文件

# 错误信息如下:
./init.d.php-fpm.in: command not found

# 通过`ls -la`命令查看文件的权限信息如下:
-rw-r--r--@  1 zed  staff   2390 Oct  9 23:09 init.d.php-fpm.in

# 将 init.d.php-fpm.in 修改为可执行文件
chmod -R 555 init.d.php-fpm.in

Nginx 配置

编辑 nginx.conf 配置文件,在 http 配置模块中增加 upstream 配置

# php72版本的 fpm 监听 9011
upstream php72 {
    server 127.0.0.1:9011;
}

# php71版本的 fpm 监听 9000
upstream php71 {
    server 127.0.0.1:9000;
}

为每个项目配置不同的php版本环境即可, 修改后需要重新加载Nginx配置 nginx -s reload

location ~ \.php$ {
        # 根据需求切换 PHP 版本
    fastcgi_pass   php72;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}