更新
对于只希望在 MacOS 上支持 xdebug 的任何人,在使用 PHP 的内置版本时,此答案中的大部分说明都不是必需的。在做任何事情之前,您应该检查xdebug.so 是否已经存在于/usr/lib/php/extensions/no-debug-non-zts-20180731/ 中,默认情况下应该存在。如果是这样,您可以跳到此答案的在 PHP 中启用支持部分。
使用 Homebrew 也是您可以接受的解决方案 (and can also prevent other issues)。
对于希望在 MacOS 上实际构建二进制文件并遇到标题错误的其他人,完整的答案适合您。它还直接回答 OP 问题。请注意,从源代码构建 xdebug 并实际尝试使用带有内置 PHP 的 xdebug.so 版本应该以“代码签名”错误告终。如here 和here 所述,唯一真正的解决方案是编译和使用您自己的PHP 实例而不是内置实例。在任何情况下,using Homebrew would be easier。
tl;博士
Apple 决定删除 /usr/include 和 macOS_SDK_headers_for_macOS_10.14.pkg 包中的头文件。要安装 Xdebug,您必须使用 phpize 和 make 中的正确引用手动编译 Xdebug。
我写了一篇关于the issue和the solution的博文
原答案:
长话短说,Apple 决定在 MacOS Catalina 中删除 /usr/include,这一直是 UNIX 系统中 C 头文件的默认位置。尝试通过 PEAR / PECL 安装将返回错误,因为编译器将在 /usr/include 中查找必要的头文件。所以解决方法是手动编译Xdebug,手动指定头文件的实际位置,还是Xcode提供的,只是位置不同。
首先,确保安装了 Xcode,包括命令行工具。以下命令将显示默认 SDK 的位置:
$ xcrun --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
您想要的标题 (php.h) 将位于 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/main。
获取源码
让我们编译 2.7.2,从 git 获取源代码。或者,您可以从Xdebug site 下载源代码。
git clone https://github.com/xdebug/xdebug.git
cd xdebug
git checkout tags/2.7.2
php化
接下来我们需要复制phpize,以便我们可以编辑包含路径:
cp /usr/bin/phpize .
nano ./phpize
找到这一行:
includedir="`eval echo ${prefix}/include`/php"
...并用这一行替换它:
includedir="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php"
运行phpize:
./phpize
您现在应该会看到类似这样的内容:
Configuring for:
PHP Api Version: 20180731
Zend Module Api No: 20180731
Zend Extension Api No: 320180731
配置和构建
我们现在可以配置了:
./configure --enable-xdebug
...并使用定义为编译器标志的自定义 SDK 位置运行 make:
make CPPFLAGS='-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/main -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/TSRM -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/Zend -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/ext -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/ext/date/lib'
可能会看到一些警告,暂时忽略它。最后,我们需要运行:
进行安装
同样,此命令将失败,因为它无法将扩展移动到正确的位置。 SIP 会阻止它。但不用担心,我们将在下一步手动处理。 make install 仍然是必需的,因为它将签署 *.so 文件。
在 PHP 中启用支持
接下来,我们将可执行文件移动到安全的地方。我使用/usr/local/php/extensions。
sudo mkdir -p /usr/local/php/extensions
sudo cp /usr/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so /usr/local/php/extensions
然后我们编辑 PHP 配置以启用 Xdebug。只需编辑php.ini:
sudo nano /etc/php.ini
我们在底部添加以下内容:
[xdebug]
zend_extension=/usr/local/php/extensions/xdebug.so
xdebug.remote_enable=on
xdebug.remote_log="/var/log/xdebug.log"
xdebug.remote_host=localhost
xdebug.remote_handler=dbgp
xdebug.remote_port=9000
重新启动内置服务器以确保:
sudo apachectl restart
最后测试一切正常:
php -i | grep "xdebug support"
如果上述命令没有返回任何内容,那么 Xdebug 在您的安装中不可用。返回步骤以找出缺少的内容。
注意:
更完整的解决方法是编辑php-config --include-dir 的结果,它返回/usr/include/php。这将使任何安装都可以找到必要的头文件,而无需手动编辑文件或编译器标志。