PHP7 CLI尝试加载xdebug两次 - "无法加载Xdebug - 它已经被加载"

54

在将Ubuntu从14.04升级到16.04后,PHP CLI开始抱怨xdebug:

$ php -v
Cannot load Xdebug - it was already loaded
PHP 7.0.13-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

只有一个 .ini 文件:

$ ls -la /etc/php/7.0/cli/conf.d/ | grep xdebug
lrwxrwxrwx 1 root root   38 Jan 19 11:41 20-xdebug.ini -> /etc/php/7.0/mods-available/xdebug.ini

我只在这个 php -i 的输出中找到了一次提到它:

$ php -i | grep -i configuration
Cannot load Xdebug - it was already loaded
Configuration File (php.ini) Path => /etc/php/7.0/cli
Loaded Configuration File => /etc/php/7.0/cli/php.ini
Configuration

整个目录中只有一处提到xdebug(因此它没有被重复包含):

/etc/php/7.0$ grep -r xdebug *
mods-available/xdebug.ini:zend_extension=xdebug.so
mods-available/xdebug.ini:[xdebug]
mods-available/xdebug.ini:xdebug.remote_enable=1
mods-available/xdebug.ini:xdebug.remote_autostart=1
mods-available/xdebug.ini:xdebug.remote_port=9000
mods-available/xdebug.ini:xdebug.idekey=PHPSTORM

如果我执行$ phpdismod xdebug,会得到以下输出,表明它仍然加载了xdebug:
$ php -v
PHP 7.0.13-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

已经完成这一步骤后,如phpinfo()所示,它不再出现在Apache配置中。

我该如何修复这个问题?


编辑:根据要求提供的附加输出:

$ php --ini
Cannot load Xdebug - it was already loaded
Configuration File (php.ini) Path: /etc/php/7.0/cli
Loaded Configuration File:         /etc/php/7.0/cli/php.ini
Scan for additional .ini files in: /etc/php/7.0/cli/conf.d
Additional .ini files parsed:      /etc/php/7.0/cli/conf.d/10-mysqlnd.ini,
/etc/php/7.0/cli/conf.d/10-opcache.ini,
/etc/php/7.0/cli/conf.d/10-pdo.ini,
/etc/php/7.0/cli/conf.d/15-xml.ini,
/etc/php/7.0/cli/conf.d/20-bcmath.ini,
/etc/php/7.0/cli/conf.d/20-calendar.ini,
/etc/php/7.0/cli/conf.d/20-ctype.ini,
/etc/php/7.0/cli/conf.d/20-curl.ini,
/etc/php/7.0/cli/conf.d/20-dom.ini,
/etc/php/7.0/cli/conf.d/20-exif.ini,
/etc/php/7.0/cli/conf.d/20-fileinfo.ini,
/etc/php/7.0/cli/conf.d/20-ftp.ini,
/etc/php/7.0/cli/conf.d/20-gd.ini,
/etc/php/7.0/cli/conf.d/20-gettext.ini,
/etc/php/7.0/cli/conf.d/20-iconv.ini,
/etc/php/7.0/cli/conf.d/20-json.ini,
/etc/php/7.0/cli/conf.d/20-mbstring.ini,
/etc/php/7.0/cli/conf.d/20-mcrypt.ini,
/etc/php/7.0/cli/conf.d/20-mysqli.ini,
/etc/php/7.0/cli/conf.d/20-pdo_mysql.ini,
/etc/php/7.0/cli/conf.d/20-pdo_sqlite.ini,
/etc/php/7.0/cli/conf.d/20-phar.ini,
/etc/php/7.0/cli/conf.d/20-posix.ini,
/etc/php/7.0/cli/conf.d/20-readline.ini,
/etc/php/7.0/cli/conf.d/20-shmop.ini,
/etc/php/7.0/cli/conf.d/20-simplexml.ini,
/etc/php/7.0/cli/conf.d/20-sockets.ini,
/etc/php/7.0/cli/conf.d/20-sqlite3.ini,
/etc/php/7.0/cli/conf.d/20-sysvmsg.ini,
/etc/php/7.0/cli/conf.d/20-sysvsem.ini,
/etc/php/7.0/cli/conf.d/20-sysvshm.ini,
/etc/php/7.0/cli/conf.d/20-tokenizer.ini,
/etc/php/7.0/cli/conf.d/20-wddx.ini,
/etc/php/7.0/cli/conf.d/20-xdebug.ini,
/etc/php/7.0/cli/conf.d/20-xmlreader.ini,
/etc/php/7.0/cli/conf.d/20-xmlwriter.ini,
/etc/php/7.0/cli/conf.d/20-xsl.ini

$ cat /etc/php/7.0/mods-available/xdebug.ini 
zend_extension=xdebug.so
[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM

作为编程问题,我找到了一些进一步的细节:
路径:
$ ls -la /usr/bin/php
lrwxrwxrwx 1 root root 21 Apr 18  2017 /usr/bin/php -> /etc/alternatives/php
$ ls -la /etc/alternatives/php
lrwxrwxrwx 1 root root 15 Feb 12 15:43 /etc/alternatives/php -> /usr/bin/php7.1

PHP:

$ php -v
Cannot load Xdebug - it was already loaded
PHP 7.1.15-1+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Mar  6 2018 11:10:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.15-1+ubuntu16.04.1+deb.sury.org+2, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans

php7.1:

$ php7.1 -v
PHP 7.1.15-1+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Mar  6 2018 11:10:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.15-1+ubuntu16.04.1+deb.sury.org+2, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans

有趣的是,php二进制文件与php7.1相同,但当以特定方式调用时,它不会显示已加载的消息。

编辑,20181006:

我仍然有这个问题。下面的图片是两个php --ini调用输出的差异。正如您所看到的,加载的ini文件集是相同的。

enter image description here

它们也是相同的符号链接二进制文件:

ben@ben-work:~$ which php
/usr/bin/php
ben@ben-work:~$ ls -la /usr/bin/php
lrwxrwxrwx 1 root root 21 May 15 16:07 /usr/bin/php -> /etc/alternatives/php
ben@ben-work:~$ ls -la /etc/alternatives/php
lrwxrwxrwx 1 root root 15 May 30 10:13 /etc/alternatives/php -> /usr/bin/php7.1
ben@ben-work:~$ which php7.1 
/usr/bin/php7.1

1
请检查所有的.ini文件中是否有zend_extension=行。您可以尝试使用extension=来查看所有扩展...但是xdebug只能通过第一种方式加载。但到目前为止,它必须是/etc/php/7.0/cli/conf.d/20-xdebug.ini,而您似乎只查看了mods-available/xdebug.ini - LazyOne
phpenmod/phpdismod是模仿Apache的a2enmod/a2dismod而来的,它创建和删除cli和apache2目录中conf.d之间以及mods-available目录之间的符号链接,这样你的配置文件就能同时适用于两者。运行它的效果与注释掉扩展行是一样的。 - bcmcfc
@bcmcfc 你解决了这个问题吗?如果是,请提供一个答案,谢谢。我也遇到了同样的问题。 - panepeter
@panepeter 抱歉,不行! - bcmcfc
3
看起来你有两个xdebug.ini文件需要加载。 一个是"/etc/php/7.0/cli/conf.d/20-xdebug.ini", 另一个是"/etc/php/7.0/mods-available/xdebug.ini"。 尝试注释其中一个。 - Marcos Regis
显示剩余8条评论
9个回答

56
我已经通过移除 zend_extension=xdebug.so 并在我的 Docker 容器中使用 docker-php-ext-enable xdebug 命令启用了它,因此我解决了这个问题。也有可能对于您而言,它已经被启用了。

3
没关系,尝试从 /etc/php/7.0/mods-available/xdebug.ini 中删除 'zend_extension=xdebug.so'。 - Magarusu
当我移除它时,xdebug根本不会被加载。 - bcmcfc
没关系,这可能会帮助其他人。 - bcmcfc
你应该将这个回答标为被采纳的答案。这个回答帮我节省了一些时间,谢谢。 - mohammad fallah.rasoulnejad
当我从xdebug.ini中删除了xdebug.xo时,问题得到了解决。谢谢。 - senthil
显示剩余3条评论

16

在Arch Linux中,xdebug软件包会生成以下配置:

/etc/php/conf.d/xdebug.ini
----------
zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
#xdebug.max_nesting_level=300

这会在 /etc/php/php.ini 中加载两次同一个 zend_extension=xdebug.so


1
这解决了我的问题(Fedora Core 29,从FC26新升级) 要查看加载的ini文件:php --ini => 列表中可能有xdebug.ini - Arcesilas
对于我在Mac上使用Homebrew,最近的升级编辑了我的默认php.ini设置,并在我的行顶部添加了这些新的xdebug设置,包括在先前版本中。 - gillytech
在Ubuntu 20中,通过注释掉zend_extension = xdebug.so这一行解决了问题。 - Fellipe Sanches

10
你需要在PHP配置目录中搜索zend_extension声明,例如。
grep -Hnir zend_extension /etc/php/7.2/

这个命令会告诉你在哪里可以找到文件:指定扩展名的定义所在行,以我的情况为例:

/etc/php/7.2/mods-available/xdebug.ini:2:zend_extension=/usr/lib/php/20170718/xdebug.so
/etc/php/7.2/cli/php.ini:1938:; zend_extension = /usr/lib/php/20170718/xdebug.so
/etc/php/7.2/apache2/php.ini:368:zend_extension = /usr/lib/php/20170718/xdebug.so

这里,cli/php.iniapache2/php.ini都是同一个配置文件,但mods-available/xdebug.ini是另一个仅包含xdebug信息的文件。

你可以在php.ini中注释或移动有关xdebug的行,并将它们放到xdebug.ini中,在[xdebug]部分下创建一个合并的配置文件。

例子:

#xdebug.ini
[xdebug]
zend_extension=/usr/lib/php/20170718/xdebug.so
xdebug.collect_params=4
xdebug.collect_vars=on
xdebug.remote_autostart=on

xdebug.var_display_max_children=128
xdebug.var_display_max_data=4086
xdebug.var_display_max_depth=10

6

我遇到了同样的问题,并通过在php.ini文件中删除多余的代码行zend_extension="xdebug.so"来解决它。

对于Mac用户,php.ini可能位于/usr/local/etc/php/目录下,但您可以运行以下命令来查找php.ini文件:

$ php -i | grep php.ini

谢谢!这对我有用(macOS High Sierra)。使用Homebrew安装了PHP(brew install php@7.3)和使用pecl安装了xdebug(pecl install xdebug)。然后PHP向我显示了这个消息。在php.ini的顶部,zend_extension="xdebug.so"被添加了两次。 - Robin van Baalen

4

Debian和其衍生版本:

我解决了这个问题,找到我的php.ini文件,将 zend_extension=xdebug.so 更改为旧版本 (因此我猜测注释该行也会有同样的效果) zend_extension_ts=zdebug.so

随后,使用命令 php -i | grep xdebug 检查只有一个conf.d 文件夹中包含 zend_extension=xdebug.so,如果有多个则删除其他条目。


3

问题的原因可能是重复的配置文件。在我的情况下,15-xdebug.inidnf install php-pecl-xdebug3-3.0.4-1.el8.remi.8.0.x86_64 添加了。列出INI文件如下:

ls /etc/php*/*xdebug.ini

/etc/php-cli.d/99-xdebug.ini  /etc/php.d/15-xdebug.ini  /etc/php.d/99-xdebug.ini  /etc/php-zts.d/15-xdebug.ini

1

对于遇到相同问题的用户。

在我的情况下,问题出现在 php cli 上,因此每次我尝试在控制台中使用 php 时,都会收到通知:无法加载 ionCube PHP Loader - 扩展已加载

我猜其他扩展也会类似。

最终我做的是:

cd /opt/cpanel/ea-php56/root/etc
grep -r "cube" .
# now I saw two files loading the .so files:
# ./php.d/01-ioncube.ini:zend_extension="/opt/cpanel/ea-php56/root/usr/lib64/php/modules/ioncube_loader_lin_5.6.so"
# ./php.d/pecl.ini:zend_extension="/opt/cpanel/ea-php56/root/usr/lib64/php/modules/ioncube_loader_lin_5.6.so"
mv php.d/pecl.ini .

那就是它。

1

这只是我面对的问题,试图解决它,希望能帮助别人找到解决方法。

显然,它在两个地方声明,但这没有什么坏处。对我来说,它是在/etc/php/8.1/cli/conf.d/99-xdebug.ini中声明的(出于某种原因,这是默认设置)

还有这里/etc/php/8.1/cli/php.ini

通过执行php -i | grep php.ini,您会发现它只提到了第二个位置(我的假设是它覆盖了第一个加载位置)

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

所以我在第二个ini文件中注释掉了zend_extension这一行。


0

https://stackoverflow.com/users/2192660/javier-domenech的建议下,我发现了两个文件:

/etc/php/7.4/cli/conf.d/20-xdebug.ini, /etc/php/7.4/cli/conf.d/99-xdebug.ini。

删除99-etc后,laravel php服务器停止抱怨找不到xdebug(尽管它仍然可以正常工作)。

但最重要的是:这导致在尝试运行phpunit测试套件时出现真正的异常: PHPUnit\Framework\Exception: Xdebug: [Step Debug] Could not connect to debugging client 这实际上阻止了phpunit的运行。

删除之前的操作,再结合在phpunit.xml中设置属性:processIsolation="true",也解决了这个奇怪的phpunit问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接