支持并发多版本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上打开一个终端窗口,并输入以下命令:
这将提示您在命令行中输入密码,然后会打开一个安装窗口,允许您下载并安装这些工具。
注意
每当您安装macOS更新时,都应再次运行此命令,因为有时您的Mac在更新过程中不会保留命令行工具。
安装Homebrew#
在终端窗口中输入以下命令:
/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#
以下命令将安装三个版本的PHP、Apache HTTP Server、MariaDB(我们将使用它作为MySQL引擎)、ElasticSearch、MailHog和ImageMagick。
如果您更愿意安装MySQL而不是MariaDB,请阅读此注释。
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版本中。
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用户名kier
,但在每个实例中,您需要将kier
替换为您自己的用户名。如果您不确定您的Mac用户名是什么,请在终端窗口中使用whoami
命令。
MariaDB#
我们现在需要启动并运行MariaDB。
在终端窗口中输入以下命令:
您将被要求输入MySQL root密码 - 目前还没有密码,因此在提示时只需按回车键。
接下来:
您可以按回车键接受此脚本询问的大多数问题的默认选项,除了root密码,您需要设置它。由于这只是一个开发安装,密码为root
是可以的。
Apache#
首先编辑以下文件:/usr/local/etc/httpd/httpd.conf
保持配置文件的所有内容不变,但在文件的最后添加以下行:
现在,创建并编辑文件/usr/local/etc/httpd/extra/httpd-dev.conf
并在其中添加以下内容:
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
#
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
#
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
注意端口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
,并在文件的最底部添加以下内容:
自动启动#
现在所有配置都已完成,我们可以启动服务器并指示它们在系统启动时加载。
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 8.0被报告为正在使用的版本。
注意
因为我们将www
目录放在您的Documents
文件夹中,这带来了一些优势,比如可能会自动将您的www文件夹备份到iCloud,但它也会在Apache和每个PHP版本首次尝试访问www目录时导致一些稍微烦人的权限提示。只需注意提示并在出现时确认它们。
接下来,在每个php版本目录中创建一个.htaccess
文件,与info.php
文件一起,并添加以下内容:
PHP 5.6的.htaccess#
PHP 7.4的.htaccess#
PHP 8.0的.htaccess#
注意我们在此处使用了FPM配置中的自定义端口号。
有了这些文件,刷新任何PHP版本目录的PHP信息页面应显示正确目标的PHP版本。从这些目录提供的任何PHP文件也应使用相同的PHP版本。
您现在可以在www
目录中广泛散布这些.htaccess文件,以使任何目录选择您选择的任何PHP版本。
注意
可下载的zip中的.htaccess
文件已将SetHandler
指令注释掉,您需要删除该行前的前导#
才能使指令生效。
IDE、调试和数据库管理器#
为了充分利用您现在组装的强大Web服务器软件套件,重要的是超越简单的文本编辑器来满足您的编码需求。
查看我们关于Visual Studio Code以及如何将其与Xdebug一起使用的部分。