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


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

我最近在我的服务器上安装了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 时出现此错误?

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

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 
有时从

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

首先,运行:

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

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

现在确定正在使用哪个 php.ini:

$ php -i | grep php.ini

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

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

我尝试了上面提到的所有过程,为此以及谷歌搜索后的许多类似过程,我仍然以此错误告终

$  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来解决这个问题。如果您没有按照此处的说明安装它

$ 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 扩展

$ 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

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

我在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 端口!

干杯!:)