【问题标题】:Installation of Xdebug on MacOS Catalina 10.15在 MacOS Catalina 10.15 上安装 Xdebug
【发布时间】:2019-10-10 07:36:48
【问题描述】:

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

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

我试图解决这里描述的问题:Installing xdebug on MacOs Mojave - 'php.h' file not found

很遗憾在这个目录下找不到头文件:/Library/Developer/CommandLineTools/Packages

我可以从哪里获得 OS X 10.15 的当前头文件?

【问题讨论】:

    标签: xcode macos xdebug macos-catalina


    【解决方案1】:

    更新

    对于只希望在 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 版本应该以“代码签名”错误告终。如herehere 所述,唯一真正的解决方案是编译和使用您自己的PHP 实例而不是内置实例。在任何情况下,using Homebrew would be easier


    tl;博士

    Apple 决定删除 /usr/includemacOS_SDK_headers_for_macOS_10.14.pkg 包中的头文件。要安装 Xdebug,您必须使用 phpizemake 中的正确引用手动编译 Xdebug。

    我写了一篇关于the issuethe 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。这将使任何安装都可以找到必要的头文件,而无需手动编辑文件或编译器标志。

    【讨论】:

    • 最有价值的答案!这应该被标记为正确!谢谢楼主!
    • 你拯救了我的一天
    • 这是解决问题的最佳方式。它对我有用。谢谢,路易斯
    • 为了支持 PHP 7.4,您需要安装 XDebug 2.9(不是 2.7.2)。只需按照these installation instructions 并在make install 之后执行本文“在 PHP 中启用支持”一章的所有步骤。请记住,您可能在不同的位置有 php.ini 文件。运行php --ini 找出位置并编辑正在使用的那个。
    • ./configure 命令之前我一直很好。我不断收到no such file or directory: ./configure。其他人遇到这种情况还是我只是幸运的人? :D
    【解决方案2】:

    我尝试在 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
    

    这是由于 Apple 决定删除 /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 中的 ehder 文件。
    • 实际上,无论是否使用 Homebrew,无论是否使用 xdebug,都应该需要 export PATH 才能让 PHP 本身运行。使用 brew "link" 和 "unlink" 方法也应该有效(然后不需要编辑bash_profile)。如果正常安装后 Homebrew php 版本在您的路径中,则 xdebug 应该自行安装没有问题。对于 brew 链接,请参阅其他答案或:getgrav.org/blog/macos-bigsur-apache-multiple-php-versions
    【解决方案3】:

    如果您使用的是brew,我通过重新安装php并重新链接来解决这个问题:

    brew reinstall php@7.3
    brew link --overwrite php
    

    【讨论】:

    • 不幸的是,brew stuff 不能按预期工作,具体取决于您的版本。
    【解决方案4】:

    我建议你使用“brew”安装PHP,然后使用安装版brew的PHP自带的“pecl”工具安装Xdebug。

    【讨论】:

    • 这正是我所做的。尝试使用 pecl 安装 Xdebug 时出现上述错误
    • 这意味着它选择了错误的 pecl 工具 - 与 Mac 一起安装的工具。您需要确保使用提供的 brew。
    • @Guenter 该提示是否解决了您的问题?我遇到了同样的问题,并且遇到了brew install php,但仍然遇到同样的错误。
    • 虽然这个解决方案是可以接受的,但它在技术上并不能回答最初的问题。请参阅我关于如何解决缺少标题问题的答案。
    • 或 docker 但还有其他需要它的东西。 pyenv 对它有依赖。
    【解决方案5】:

    您可以在此站点上找到包含现成补丁的详细说明:https://profilingviewer.com/installing-xdebug-on-catalina.html

    【讨论】:

    • 主要引用外部站点的答案应包含信息摘要,以便它成为主要来源和参考。这将有助于答案经得起时间的考验。