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

时间:2014-05-01 13:32:44

标签: php apache debugging xdebug php-ini

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

5 个答案:

答案 0 :(得分:13)

即使您将两个站点分开并使用两个不同的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脚本(即PHP-CLI)出错,因为zend_extensions需要模块的完整路径。 Xdebug文档中也说明了这一点:http://xdebug.org/docs/install

因此,要消除错误,只需注释掉该行(或只删除它)。只要您没有加载任何其他模块,您也可以注释掉或删除extension_dir行,例如:

extension = memcached.so 

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

首先,运行:

$ 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 :(得分:1)

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

干杯! :)

答案 4 :(得分:0)

我尝试了上面提到的所有过程,并在谷歌搜索后尝试了 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 扩展

$ 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