【问题标题】:Xdebug on macOS 10.13 with PHP 7macOS 10.13 上的 Xdebug 与 PHP 7
【发布时间】:2018-03-17 13:26:36
【问题描述】:

所以 macOS High Sierra 10.13 现在带有 PHP 7.1。在配置 Apache 时,我还从 /etc/php.ini.default 文件创建了一个新的 /etc/php.ini,确保在重新启动 Apache 后检查 PHP 正在加载该文件,但是 macOS 10.13 附带的 Xdebug 扩展版本似乎没有加载或者在你运行phpinfo();时出现

我的 php.ini 肯定正在加载:

$ php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

这是我配置 Xdebug 的 /etc/php.ini 的样子:

[xdebug]    
zend_extension = "/usr/lib/php/extensions/no-debug-non-zts-20160303/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

[更新,修正了这里的错字...]

但是,Xdebug 不加载并且检查 php -i 没有结果:

$php -i | grep xdebug
PHP Warning:  Method xdebug_start_function_monitor() cannot be a NULL 
    function in Unknown on line 0
    PHP Warning:  xdebug: Unable to register functions, unable to load in Unknown on line 0
    Segmentation fault: 11

是的,文件的路径是正确的:

$ ls /usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
/usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so*

这曾经在 PHP 5 上工作,所以我希望有人可以帮助我和其他任何人在未来遇到这个问题。

当我检查我的 apache 日志时,我收到以下错误:

Failed loading /usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so:  dlopen(/usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so, 9): Symbol not found: _xdebug_monitored_function_dtor
  Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
  Expected in: flat namespace
 in /usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so

我在找出如何解决此错误方面没有取得进展:

Symbol not found: _xdebug_monitored_function_dtor

【问题讨论】:

  • 请注意,Apache 可能使用不同的 php.ini(一个 php.ini 用于 CLI/终端,一个用于 Apache/web 服务器)。所以最好检查在实际浏览器中捕获的phpinfo() 输出,以查看使用了什么 php.ini 以及是否加载了 xdebug。当然,如果它们都使用相同的 ini 文件,那么可以在终端中执行此类检查。是的 --zend_extension 带有完整路径(更安全)
  • 谢谢,我检查了 CLI 和浏览器,它们都在加载相同的 php.ini 文件。
  • FWIW,看起来 Apple 在更新中修复了它。它适用于 macOS 10.13.6 :)

标签: php apache xdebug macos-high-sierra


【解决方案1】:

如果您在 Mac OS X mojave 上安装了多个 PHP 版本(即 7.1、7.2 和 7.3)的 brew,您可以执行以下操作:

  1. 使用 brew brew install autoconf 安装 autoconf。

  2. 更改为您想要 Xdebug 的 PHP 版本,运行 brew unlink php@7.1 && brew link --force --overwrite php。这将从 PHP 7.1 切换到 PHP 7.3。

  3. xdebug网站下载最新的Xdebug源码。

  4. 解压 Xdebug tar 并导航到解压后的目录,您可以在其中看到所有文件。

  5. 运行 phpize 为新的 Zend 引擎配置构建。

  6. 运行./configure

  7. 运行make

  8. Xdebug 扩展 xdebug.so 被编译到 modules 目录中。

  9. /usr/local/lib/php/7.3.1/extensions/ 下创建一个新目录路径并将xdebug.so 复制到此位置。这里,7.3.1 是我之前切换的当前版本,更改它以匹配您的 PHP 版本。

  10. 在编辑器中打开php.ini 并输入 zend_extension="/usr/local/lib/php/7.3.1/extensions/xdebug.so" 然后保存更改。

  11. 运行php -v,它将显示Xdebug已正确配置。

如果您想在另一个 PHP 版本上配置 Xdebug,那么只需从第 2 步一直重复到第 11 步。如前文所述,这样您无需在 Mac OS X 上禁用/启用系统完整性保护。

【讨论】:

    【解决方案2】:

    大家好,在 Mac 上安装 xDebug 时遇到错误。

    错误:未知类型名称“uint64_t”

    您的 local/bin/include 中有导致此错误的文件。通过删除它们,您可以摆脱错误。不过,您可能需要重新安装 brew。

    https://github.com/cython/cython/issues/2009

    【讨论】:

    • 请指定我们应该删除哪些文件。即使从您的消息来源来看也不清楚。
    • 来自github.com/cython/cython/issues/2009#issuecomment-481395357 "/usr/local/include" 中的所有文件。请注意,我没有通过 Homebrew 进行很多其他安装,但我有一个节点文件,我不理会它并删除了其他所有内容,并且有效。
    【解决方案3】:

    对于迟到的任何人,问题的初步尝试似乎在 macOS 10.13.6 中运行良好

    【讨论】:

      【解决方案4】:

      为了安装它,你必须有 xcode 命令行工具。

      所以你需要运行:

      xcode-select --install
      

      那你需要安装autoconf:

      brew install autoconf
      

      然后你必须下载code from here. 之后你必须在源代码的文件夹中运行:

      1. phpize
      2. ./configure
      3. make
      4. sudo cp modules/xdebug.so /usr/local/php/extensions(如果该目录不存在,则创建它)

      最后在 php.ini 中添加

      zend_extension=/usr/local/php/extensions/xdebug.so
      

      之后你可以在 php.ini 中启用 xdebug 并重启 apache

      sudo apachectl restart
      

      【讨论】:

        【解决方案5】:

        好吧,我终于让它自己运行了,它运行良好!我假设 macOS High Sierra 附带的 xdebug 二进制文件(位于:/usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so)与 PHP7 的新 Zend 引擎不兼容。

        于是我从xdebug website 下载了最新的源码并做了以下操作:

        1. 用 brew 安装了 autoconf;
        2. 运行 phpize 为新的 Zend 引擎配置构建;
        3. 运行./configure
        4. 运行make

        现在新的二进制文件在modules/xdebug.so

        但是 macOS 系统完整性保护 (SIP) 将阻止您覆盖 /usr/lib/php/extensions/ 下的 xdebug.so。我不想禁用它,所以我在/usr/local/lib/php/extensions/ 下创建了一个新的目录路径,并将新的二进制文件复制到这个位置。我不确定这个目录是否是放置它的最佳位置,或者这是否是不好的做法,但它对我有用。

        最后我重新配置了我的 php.ini 以使用新的二进制文件,一切都运行良好!

        【讨论】:

        • 我克隆了 git 存储库,并尝试重现您的步骤 1-4。但我确实收到一条错误消息:致命错误:找不到'php.h'文件
        • 我自己一开始就有这个。我不记得究竟是什么为我解决了这个问题,我认为是安装 autoconf 或升级到 Xcode 9.0。我认为它一定是 autoconf,因为这使我的编译器可以看到我认为包含在最新 PHP 安装中的 php.h 标头。
        • 我收到了这个Failed loading /usr/local/php/extensions/xdebug.so: dlopen(/usr/local/php/extensions/xdebug.so, 0x0009): code signature in (/usr/local/php/extensions/xdebug.so) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
        • 我遇到了和@abbood一样的错误,有人可以帮忙吗?
        • @Ali123 写了zend_extension=xdebug.so,不需要绝对路径
        【解决方案6】:

        你在“zend_extention”中打错了。这应该是zend_extension。 我认为完整的路径是不必要的 zend_extension=xdebug.so 应该够了

        【讨论】:

        • 谢谢,这让我发现了一个我能够解决的新问题。更新了问题。
        • xdebug install guide 建议使用完整的目录路径,而不仅仅是"xdebug.so"
        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        • 2017-12-02
        • 1970-01-01
        相关资源
        最近更新 更多