在MacOS Catalina 10.15上安装Xdebug

19

我试图在OS X 10.15上安装Xdebug,遇到以下问题:

/private/tmp/pear/install/xdebug/xdebug.c:25:10: 致命错误: 找不到 'php.h' 文件

我尝试按照这里描述的方法修复问题:在MacOs Mojave上安装xdebug-'php.h'文件未找到

不幸的是,在此目录中找不到头文件:/Library/Developer/CommandLineTools/Packages

有什么想法可以获得OS X 10.15的当前头文件吗?

5个回答

49

更新

对于那些只想在MacOS上使用内置PHP版本的xdebug支持的人来说,本答案中的大部分说明都是不必要的。在进行任何操作之前,您应该检查/usr/lib/php/extensions/no-debug-non-zts-20180731/目录下是否已经存在xdebug.so文件,这个文件应该默认就在那里。如果是这样,您可以跳过本答案中的启用PHP支持部分。

对于您来说,使用Homebrew也是可行的解决方案(并且可以防止其他问题)。

对于其他想要在MacOS上构建二进制文件并遇到头文件错误的人来说,完整的答案适用于您。它也直接回答了OP的问题。需要注意的是,从源代码构建xdebug并尝试使用那个版本的xdebug.so与内置PHP一起使用会导致"代码签名"错误。正如这里这里所述,唯一的真正解决方案是编译并使用自己的PHP实例,而不是内置的PHP实例。在任何情况下,使用Homebrew会更容易


简而言之

苹果决定删除/usr/includemacOS_SDK_headers_for_macOS_10.14.pkg包中的头文件。为了安装Xdebug,您需要手动编译Xdebug,并在phpizemake中正确引用。

更多细节,我写了一篇关于这个问题解决方案的博客文章。


Translated Answer:

简而言之,苹果公司决定在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 网站 下载源代码。

git clone https://github.com/xdebug/xdebug.git
cd xdebug
git checkout tags/2.7.2

phpize

接下来,我们需要复制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'

可能会看到一些警告,现在暂时忽略它。最后,我们需要运行:

make install

同样,这个命令会失败,因为它无法将扩展移动到正确的位置。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。这将使任何安装都能够找到必要的头文件,而无需手动编辑文件或编译器标志。

1
最有价值的答案!应该标记为正确答案!谢谢先生! - eltomato
你救了我的一天。 - ludovico
这是解决问题的最佳方法。它对我有用。谢谢,路易斯。 - Raja Mohammed
2
为了支持PHP 7.4,您需要安装XDebug 2.9(而不是2.7.2)。只需按照这些安装说明进行操作,在make install之后执行本文“启用PHP支持”章节中的所有步骤。请记住,您可能会在不同位置拥有php.ini文件。运行php --ini以找出其位置并编辑正在使用的文件。 - Dejv
1
我一直做得很好,直到执行 ./configure 命令时出现了问题。我一直收到 no such file or directory: ./configure 的错误提示。还有其他人遇到过这个问题吗?或者只有我这么幸运? :D - cbloss793
显示剩余8条评论

1
如果您正在使用brew,我通过重新安装php并重新链接来解决这个问题:
brew reinstall php@7.3
brew link --overwrite php

很遗憾,Brew的东西并不总是按照预期工作,这取决于你的版本。 - jamespsterling

1
我在尝试在MacOS Catalina 10.15上安装xdebug时遇到了错误:
pecl install xdebug-3.0.1

错误:

/private/tmp/pear/install/xdebug/xdebug.c:25:10: fatal error: 'php.h' file not found

这是因为苹果决定在 /usr/include 中删除头文件,就像您可以在其他答案中看到的那样。
然后我在 .bash_profile 中添加了配置,并在控制台执行了这些行:
echo 'export PATH="/usr/local/opt/php@7.3/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/php@7.3/sbin:$PATH"' >> ~/.bash_profile
export LDFLAGS="-L/usr/local/opt/php@7.3/lib"
export CPPFLAGS="-I/usr/local/opt/php@7.3/include"
source ~/.bash_profile

之后,您可以尝试使用pecl再次安装xdebug:

pecl install xdebug-3.0.1

注意:之前我已经使用“brew”安装了PHP 7.3。您应该根据自己的喜好调整上面的行中的php和xdebug版本。


正如答案中所指出的,这仅适用于您已经使用brew安装了PHP。如果您没有使用brew,则需要使用Xcode中的头文件。 - Louis Charette
实际上,在使用Homebrew、xdebug或不使用xdebug时,应该需要export PATH来运行PHP本身。使用brew的“link”和“unlink”方法也可以工作(然后无需编辑bash_profile)。如果Homebrew php版本在正常安装后在您的路径中,xdebug应该可以自己安装。有关brew link的详细信息,请参见其他答案或:https://getgrav.org/blog/macos-bigsur-apache-multiple-php-versions - Louis Charette

-1
我建议您使用"brew"安装PHP,然后使用安装在brew的PHP版本中的"pecl"工具来安装Xdebug。

这正是我所做的。当尝试使用pecl安装Xdebug时,我遇到了上述错误。 - Guenter
1
那意味着它正在选择错误的 pecl 工具——安装在您的 Mac 上的工具。您需要确保使用提供的 brew 版本。 - Derick
@Guenter,那个提示解决了你的问题吗?我也遇到了同样的麻烦,我已经执行了 brew install php,但仍然出现相同的错误。 - Carter Pape
虽然这个解决方案是可以接受的,但从技术上讲它并没有回答最初的问题。请查看我的答案,了解如何解决缺失头文件的问题。 - Louis Charette
或者使用Docker,但还有其他需要它的东西。pyenv依赖于它。 - Hayden
显示剩余2条评论

-2

1
回答问题时,如果主要参考了外部网站的信息,应该包括一个摘要,使其成为主要来源和参考。这将有助于回答经得起时间的考验。 - Louis Charette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接