Xdebug 错误:“加载 xdebug.so 失败:xdebug.so:无法打开共享对象文件:没有这样的文件或目录”

Posted

技术标签:

【中文标题】Xdebug 错误:“加载 xdebug.so 失败:xdebug.so:无法打开共享对象文件:没有这样的文件或目录”【英文标题】:Xdebug Error: "Failed loading xdebug.so: xdebug.so: cannot open shared object file: No such file or directory" 【发布时间】:2014-06-17 23:52:20 【问题描述】:

我最近在我的服务器上安装了xdebug,但仅限于我们的测试站点使用它,它使用它自己的php.ini 文件。

例如测试站点php.ini位于:

/home/test_site/public_html/subdomain_name/php.ini

在这个 php.ini 文件中,我有以下用于 xdebug 的内容:

[XDebug]
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so

xdebug.profiler_append = 0

xdebug.profiler_enable = 1

xdebug.profiler_enable_trigger = 0

xdebug.profiler_output_dir = /home/test_site/xdebug

xdebug.profiler_output_name = "cachegrind.out.%s-%u.%h_%r"

现在,xdebug 工作很好,没有问题。

但是,在我们的主站点上,它也有自己的 php.ini 文件,例如位于:

/home/main_site/public_html/php.ini

在这个文件中我没有 xdebug 的内容。

现在,我最近在 cpanel 中为 main site 设置了一个 cron,例如:

php -f /home/main_site/public_html/cron_jobs/main_cron.php > /home/main_site/public_html/logs/main_cron.log 2>&1

现在,在检查日志文件中 cron 的输出后,我得到了输出:

Failed loading xdebug.so:  xdebug.so: cannot open shared object file: No such file or directory

当主站点甚至不应该加载 xdebug 时,为什么我会收到此错误?

【问题讨论】:

您可能需要仔细检查您用于运行 main_cron.php 脚本的 php-cli 版本是否未使用其中包含 xdebug 配置的 php.ini。 php -i | grep xdebug 应该告诉你。然后,php -i | grep php.ini 应该会显示 php-cli 配置为使用哪个 php.ini。 请尝试which php找出执行脚本的PHP版本路径。 @dcarrith 当我运行php -i | grep xdebug 时,我得到了Failed loading xdebug.so: xdebug.so: cannot open shared object file: No such file or directory。当我运行php -i | grep php.ini 时,我收到了相同的错误消息以及Configuration File (php.ini) Path => /usr/local/lib ... Loaded Configuration File => /usr/local/lib/php.ini @KraneBird /usr/local/bin/php @Brett - 你检查过/usr/local/lib/php.ini 看看那里是否有zend_extension=xdebug.so 吗?您可能只需将 extension_dir 设置为存储 xdebug.so 的位置。 sudo find / -name xdebug.so 找到它。然后,当然要重启 Apache。 【参考方案1】:

即使您将两个站点分开并使用两个不同的 php.ini 文件,CRON 仍将使用 PHP-CLI 配置使用的任何 php.ini 文件。所以,要弄清楚哪个 php.ini CRON 正在使用,这是要使用的命令:

php -i | grep php.ini

如果 PHP-CLI 碰巧使用了一个您没想到它会使用的 php.ini 文件(例如 /usr/local/lib/php.ini),那么这将是弄清楚为什么您会在其中看到 Xdebug 错误的关键日志。

原来/usr/local/lib/php.ini 文件设置了这两个值:

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20090626"
zend_extension = "xdebug.so"

这导致 CRON(即 PHP-CLI)运行的 php 脚本出错,因为 zend_extensions 需要模块的完整路径。 Xdebug 文档中也说明了这一点:http://xdebug.org/docs/install

所以,要摆脱错误,只需注释掉该行(或删除它)。只要您不加载任何其他模块,您也可以注释掉或删除 extension_dir 行,例如:

extension = memcached.so 

【讨论】:

【参考方案2】:

有时从 XDebug 库的加载位置可能会很困难,因为它可以通过在 php.ini 中指定路径或通过在 mods-available 中添加库来完成。

首先,运行:

$ sudo grep 'xdebug' -r /etc/php/*

这将为您提供加载扩展的文件。

现在确定正在使用的 php.ini:

$ php -i | grep php.ini

这将为您提供正在使用的 php 版本(如果您有多个 php 版本)。现在将 php 版本与第一步的结果链接起来。

现在,要么您必须注释掉加载 xdebug 扩展的行,要么从 /etc/php/xx/mods-available 中删除 xdebug.ini 文件(加载扩展)(其中 xx 代表 php正在使用的版本)。

【讨论】:

【参考方案3】:

作为记录,在 Linux Mint 中,我认为在某些 Ubuntu 系统中。要更改 php.ini,最好转到 /etc/php/7.0/cli/conf.d 并查找 xdebug.ini,您必须更改我上面帖子中所说的行.

【讨论】:

【参考方案4】:

我在下面的 Linux 中尝试过并且工作正常,

您可以使用以下命令来定位 xdebug.so 文件路径

locate xdebug.so

ex: /usr/lib/php/20160303/xdebug.so

使用以下命令定位当前的 php.ini 文件

php -i | grep php.ini

ex: 

Configuration File (php.ini) Path => /etc/php/7.1/cli
Loaded Configuration File => /etc/php/7.1/cli/php.ini

之后将下面的 xdebug 配置添加到 cli 和 apache2 文件夹的 php.ini 文件中,并使用正确的 xdebug.so 文件路径。

vi /etc/php/7.1/cli/php.ini
vi /etc/php/7.1/apache2/php.ini

[xdebug]
zend_extension=/usr/lib/php/20190902/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_autostart = 1

最后重启apache2服务器

sudo service apache2 restart

确保您在编辑器中使用了正确的 xdebug 端口!

干杯! :)

【讨论】:

【参考方案5】:

我尝试了上面提到的所有过程,并且在谷歌搜索后对于this 和许多类似的过程,我仍然遇到了这个错误

$  php -i | grep php.ini
Failed loading /usr/lib/php/20200930/xdebug.so:  /usr/lib/php/20200930/xdebug.so: undefined symbol: zend_get_properties_for
Configuration File (php.ini) Path => /etc/php/7.3/cli
Loaded Configuration File => /etc/php/7.3/cli/php.ini

我通过使用 Pecl 更新 Xdebug 解决了这个问题。如果您没有按照说明安装它here

$ pecl install xdebug

现在我更改了我的xdebug.ini 文件。你可以使用

$ locate xdebug.ini

zend_extension = usr/lib/php/20180731/xdebug.so 添加到文件中。

xdebug.ini

[xdebug]
zend_extension = usr/lib/php/20180731/xdebug.so

最新版本的Xdebug 3.0.4 仍然使用这些usr/lib/php/20180731/xdebug.so,但如果您尝试使用$ locate xdebug.so,您会看到不同的文件位置。

Php 输出正确的 Zend Extensions

$ php -v
PHP 7.3.27-9+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Feb 23 2021 15:10:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.27, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.27-9+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v3.0.4, Copyright (c) 2002-2021, by Derick Rethans

【讨论】:

以上是关于Xdebug 错误:“加载 xdebug.so 失败:xdebug.so:无法打开共享对象文件:没有这样的文件或目录”的主要内容,如果未能解决你的问题,请参考以下文章

使用 XDebug 时 Xampp 错误 324 空响应

xdebug : phpunit 代码覆盖的致命错误

xdebug.start_start_with_request=yes 如果调试客户端没有监听,则没有错误

PHP 单元。错误:没有代码覆盖驱动程序可用。 (安装了xdebug)

XDebug 断点在 Visual Studio Code 中给出 PHP 错误

qcachegrind 错误:未知的文件格式。从 php xdebug 生成的文件