Skip to content

支持并发多版本PHP的macOS开发环境#

为了充分利用XenForo框架,您需要搭建一个能够运行XenForo的本地Web服务器,并配备一个能够理解代码并帮助您进行调试的代码编辑器。

幸运的是,现在满足这些需求非常简单,而且完全免费。

本文档及其附带的视频将帮助您在运行macOS 11 Big Sur 或更高版本的Macintosh上开始开发。如果您想跳过解释,可以直接阅读总结

作为额外的好处,这种方法将允许您同时运行多个PHP版本,因此您可以在PHP 5.6上运行XenForo 1.5,在PHP 7.4上运行XenForo 2.1,在PHP 8.0上运行XenForo 2.2,而无需在访问特定版本时手动切换PHP版本。稍后会详细介绍。

注意

您必须使用具有管理员权限的用户帐户登录macOS才能完成本文档中的步骤。

Homebrew#

Homebrew 是macOS的包管理器,它提供了一种相对简单的方式来安装运行本地Web和数据库服务器所需的所有组件。它还可以做更多事情,但这超出了本文档的范围。

Homebrew的一个优点是它将软件包安装到一个单独的目录树中,因此它与Mac的其他部分很好地隔离,使得维护和卸载比其他方法更加轻松。

尽管安装是通过命令行完成的,但不要因此而退缩,因为结果非常值得。

作为额外的奖励,就在我写这篇文章时,Homebrew宣布了3.0版本,支持Apple Silicon

Xcode命令行工具#

要安装Homebrew,我们需要从Apple获取一些开发者工具。

Xcode 是Apple用于开发macOS和iOS应用程序的IDE。它包含了各种命令行工具,这些工具对于一般应用程序构建是必要的,并且方便的是,这些工具可以作为单独的包提供,而无需安装整个Xcode套件。

在Mac上打开一个终端窗口,并输入以下命令:

Bash
sudo xcode-select --install;

这将提示您在命令行中输入密码,然后会打开一个安装窗口,允许您下载并安装这些工具。

注意

每当您安装macOS更新时,都应再次运行此命令,因为有时您的Mac在更新过程中不会保留命令行工具。

安装Homebrew#

在终端窗口中输入以下命令:

Bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)";

观察输出并根据需要进行确认。

注意

Homebrew安装在/usr/local(适用于macOS Intel)或/opt/homebrew(适用于Apple Silicon)。如果您的Mac使用Apple Silicon,则在本教程的其余部分中给出的命令需要替换为使用正确的路径。

安装Homebrew软件包#

现在是时候使用Homebrew安装一些软件包了。我们将为Homebrew提供一些关于额外软件源的信息,然后使用一个长命令安装(几乎)所有我们需要的软件。

PHP, Apache, MariaDB, ElasticSearch, Mailhog, ImageMagick#

以下命令将安装三个版本的PHPApache HTTP ServerMariaDB(我们将使用它作为MySQL引擎)、ElasticSearchMailHogImageMagick

如果您更愿意安装MySQL而不是MariaDB,请阅读此注释

Bash
brew tap elastic/tap;
brew tap shivammathur/php;
brew install pkg-config mariadb httpd mailhog imagemagick elastic/tap/elasticsearch-full shivammathur/php/php@5.6 shivammathur/php/php@7.4 shivammathur/php/php@8.0;

此命令需要几分钟才能完成,因为这里有很多软件要安装,但好事总是值得等待的...

多版本PHP与Xdebug和ImageMagick#

正如我之前所说,此过程将提供同时运行多个PHP版本的能力,而无需运行脚本来切换它们。

运行以下命令以将Xdebug和ImageMagick部署到您安装的每个PHP版本中。

Bash
brew unlink php;

brew link --force php@5.6;
pecl install xdebug-2.5.5;
printf "\n" | pecl install imagick;
brew unlink php@5.6;

brew link --force php@7.4;
pecl install xdebug;
printf "\n" | pecl install imagick;
brew unlink php@7.4;

brew link --force php@8.0;
pecl install xdebug;
printf "\n" | pecl install imagick;

同样,这将需要几分钟来下载并安装所有必要的软件。

注意

在撰写本文时,ImageMagick无法与PHP 8正常工作,但我保留了该命令,因为到您运行这些命令时,情况可能已经改变。如果pecl install imagick命令在PHP 8上失败,您可以手动构建imagick扩展

截图:macOS运行XenForo,使用Xdebug和Visual Studio Code进行调试

配置#

我们将尽可能减少对每个软件组件的默认配置文件的更改,而是让服务器查看包含我们特定指令的额外配置文件。

注意

我在此展示的配置中包含了我自己的macOS用户名kier,但在每个实例中,您需要将kier替换为您自己的用户名。如果您不确定您的Mac用户名是什么,请在终端窗口中使用whoami命令。

MariaDB#

我们现在需要启动并运行MariaDB。

在终端窗口中输入以下命令:

Bash
brew services start mariadb;
sudo /usr/local/bin/mysql_upgrade;

您将被要求输入MySQL root密码 - 目前还没有密码,因此在提示时只需按回车键。

接下来:

Bash
sudo /usr/local/bin/mysql_secure_installation;

您可以按回车键接受此脚本询问的大多数问题的默认选项,除了root密码,您需要设置它。由于这只是一个开发安装,密码为root是可以的。

Apache#

首先编辑以下文件:/usr/local/etc/httpd/httpd.conf

保持配置文件的所有内容不变,但在文件的最后添加以下行:

ApacheConf
Include /usr/local/etc/httpd/extra/httpd-dev.conf

现在,创建并编辑文件/usr/local/etc/httpd/extra/httpd-dev.conf

并在其中添加以下内容:

ApacheConf
User kier
Group staff

Listen 80
ServerName localhost
Timeout 3600

LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
LoadModule deflate_module lib/httpd/modules/mod_deflate.so
LoadModule mime_magic_module lib/httpd/modules/mod_mime_magic.so
LoadModule expires_module lib/httpd/modules/mod_expires.so
LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

<VirtualHost *:80>
    DocumentRoot "/Users/kier/Documents/www"

    <Directory "/Users/kier/Documents/www">
        Options Indexes FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://localhost:9080"
    </FilesMatch>
</VirtualHost>

注意

假设您将kier的三个实例替换为您自己的用户名,此配置将期望从您的Documents文件夹中的www目录提供Web文件。您需要创建此目录,或者如果您希望从其他目录提供服务,请更改配置中的两个路径实例。

PHP#

每个PHP版本都需要自己的配置编辑,但幸运的是,它们都很小。

Xdebug和Mailhog#

我们需要为每个PHP版本设置一些合理的默认值并启用Xdebug。

首先编辑/usr/local/etc/php/5.6/php.ini/usr/local/etc/php/7.4/php.ini/usr/local/etc/php/8.0/php.ini文件,并删除文件顶部引用xdebug或imagick的任何行,然后保存文件。

接下来,创建、编辑并保存以下三个_ini_文件,并为每个文件添加以下内容:

/usr/local/etc/php/5.6/conf.d/php-dev.ini#
INI
post_max_size = 20M
upload_max_filesize = 10M
date.timezone = UTC

[mailhog]
smtp_port = 1025
sendmail_path = "/usr/local/bin/mhsendmail"

[xdebug]
zend_extension = "xdebug.so"
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000

[imagick]
extension = "imagick.so"

/usr/local/etc/php/7.4/conf.d/php-dev.ini /usr/local/etc/php/8.0/conf.d/php-dev.ini#
INI
post_max_size = 20M
upload_max_filesize = 10M
date.timezone = UTC

[mailhog]
smtp_port = 1025
sendmail_path = "/usr/local/bin/mhsendmail"

[xdebug]
zend_extension = "xdebug.so"
xdebug.mode = "debug,develop"
xdebug.discover_client_host = 1
xdebug.client_port = 9000

[imagick]
extension = "imagick.so"

警告

在撰写本文时,pecl install imagick无法与PHP 8正常工作。如果您在尝试运行此命令时收到错误,并且您不想手动构建imagick扩展,则需要通过在extension = "imagick.so"行前添加分号来注释掉PHP 8的php-dev.ini中的该行。


Fast CGI (php-fpm)#

我们将使用FastCGI进程管理器(FPM)实现PHP以允许版本切换,但首先我们需要告诉每个PHP版本如何响应,以便让我们同时运行多个版本。

创建以下文件,然后输入并保存以下内容,将用户名更改为您自己的:

/usr/local/etc/php/5.6/php-fpm.d/x.conf

ApacheConf
user = kier
group = staff
listen = 127.0.0.1:9056

注意端口9056的使用。我通过从PHP版本号5.6中删除小数点并将连接值56加到9000,得到9056

接下来,您需要将此文件复制到以下位置,并根据需要更改端口号:

/usr/local/php/7.4/php-fpm.d/x.conf(使用端口9074

/usr/local/php/8.0/php-fpm.d/x.conf(使用端口9080

虽然PHP 7.4和8.0会吸收我们新指定的FPM配置,但PHP 5.6需要一些帮助。编辑文件/usr/local/etc/php/5.6/php-fpm.conf,并在文件的最底部添加以下内容:

ApacheConf
include=/usr/local/etc/php/5.6/php-fpm.d/*.conf

自动启动#

现在所有配置都已完成,我们可以启动服务器并指示它们在系统启动时加载。

Bash
brew services start elasticsearch-full;
brew services start php@5.6;
brew services start php@7.4;
brew services start php@8.0;
brew services start httpd;

选择PHP版本#

这是最聪明的部分。我们可以通过.htaccess文件中的一些配置来指示Apache将PHP脚本传递给我们安装的任何PHP版本。

我们在上面构建的配置将默认服务器使用PHP 8.0,但可以轻松地在每个目录的基础上覆盖此设置。

在您的Documents/www文件夹中,创建以下文件夹和文件的树结构(或下载此zip,其中包含相同的内容):

  • Documents
  • www
    • info
    • php5.6
      • info.php
    • php7.4
      • info.php
    • php8.0
      • info.php

在每个index.php文件中,添加以下内容:

PHP
<?php

phpinfo();

如果您使用浏览器访问这些位置中的任何一个,您将看到PHP 8.0被报告为正在使用的版本。

注意

因为我们将www目录放在您的Documents文件夹中,这带来了一些优势,比如可能会自动将您的www文件夹备份到iCloud,但它也会在Apache和每个PHP版本首次尝试访问www目录时导致一些稍微烦人的权限提示。只需注意提示并在出现时确认它们。

接下来,在每个php版本目录中创建一个.htaccess文件,与info.php文件一起,并添加以下内容:

PHP 5.6的.htaccess#

ApacheConf
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://localhost:9056"
</FilesMatch>

PHP 7.4的.htaccess#

ApacheConf
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://localhost:9074"
</FilesMatch>

PHP 8.0的.htaccess#

ApacheConf
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://localhost:9080"
</FilesMatch>

注意我们在此处使用了FPM配置中的自定义端口号。

有了这些文件,刷新任何PHP版本目录的PHP信息页面应显示正确目标的PHP版本。从这些目录提供的任何PHP文件也应使用相同的PHP版本。

您现在可以在www目录中广泛散布这些.htaccess文件,以使任何目录选择您选择的任何PHP版本。

截图:通过Apache Web服务器同时运行的三个PHP版本

注意

可下载的zip中的.htaccess文件已将SetHandler指令注释掉,您需要删除该行前的前导#才能使指令生效。

IDE、调试和数据库管理器#

为了充分利用您现在组装的强大Web服务器软件套件,重要的是超越简单的文本编辑器来满足您的编码需求。

查看我们关于Visual Studio Code以及如何将其与Xdebug一起使用的部分。

资源链接#