我最近在我的服务器上安装了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 端口!
干杯!:)