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

Bre*_*ett 13 php apache debugging xdebug php-ini

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

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

/home/test_site/public_html/subdomain_name/php.ini
Run Code Online (Sandbox Code Playgroud)

在这个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"
Run Code Online (Sandbox Code Playgroud)

现在,事情是,xdebug 工作正常,没有问题.

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

/home/main_site/public_html/php.ini
Run Code Online (Sandbox Code Playgroud)

在这个文件里面,我什么都没有xdebug.

现在,我最近在cpanel中设置了一个cron,用于main site:

php -f /home/main_site/public_html/cron_jobs/main_cron.php > /home/main_site/public_html/logs/main_cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

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

Failed loading xdebug.so:  xdebug.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当主站点甚至不能加载xdebug时,为什么会出现此错误?

dca*_*ith 15

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

php -i | grep php.ini
Run Code Online (Sandbox Code Playgroud)

如果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"
Run Code Online (Sandbox Code Playgroud)

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

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

extension = memcached.so 
Run Code Online (Sandbox Code Playgroud)


小智 7

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

首先,运行:

$ sudo grep 'xdebug' -r /etc/php/*
Run Code Online (Sandbox Code Playgroud)

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

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

$ php -i | grep php.ini
Run Code Online (Sandbox Code Playgroud)

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

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