在运行作曲家时禁用xdebug


98

运行时composer diagnose,出现以下错误:

xdebug扩展已加载,这可能会使Composer变慢一点。建议在使用Composer时将其禁用。

如何仅在运行Composer时禁用xdebug?

Answers:


81

更新:此问题已在Composer 1.3中修复。通过执行composer self-update,将作曲家更新到最新版本,而不是尝试以下解决方法。


这是我对@ezzatron代码的修改。我已经更新了脚本,可以从phpinfo输出中检测ini文件。

#!/bin/sh

php_no_xdebug () {
    temporaryPath="$(mktemp -t php.XXXX).ini"

    # Using awk to ensure that files ending without newlines do not lead to configuration error
    php -i | grep "\.ini" | grep -o -e '\(/[a-z0-9._-]\+\)\+\.ini' | grep -v xdebug | xargs awk 'FNR==1{print ""}1' | grep -v xdebug > "$temporaryPath"

    php -n -c "$temporaryPath" "$@"
    rm -f "$temporaryPath"
}

php_no_xdebug /usr/local/bin/composer.phar $@
# On MacOS with composer installed using brew, comment previous line
# Install jq by executing `brew install jq` and uncomment following line.
# php_no_xdebug /usr/local/Cellar/composer/`brew info --json=v1 composer | jq -r '.[0].installed[0].version'`/libexec/composer.phar $@

3
恕我直言,这是迄今为止最完美的解决方案。谢谢乔伊斯!
Thomas Hansen

2
最好。脚本。曾经
Maciej Paprocki

1
我不得不将shebang调整为bin/bash而不是/bin/sh,因为后者不喜欢该function关键字(Ubuntu 14.04 LTS)。
ashnazg

我已更新代码并删除了function关键字,以实现更好的兼容性。
Joyce Babu

1
您可以通过运行composer self-update
Joyce Babu

77

该命令将禁用CLI的PHP5 Xdebug模块(并因此禁用作曲家):

sudo php5dismod -s cli xdebug

它从以下位置删除xdebug.ini符号链接/etc/php5/cli/conf.d/

建议在 http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

请注意,对于Ubuntu 16.04,您可能需要像这样运行它:

sudo phpdismod -s cli xdebug

4
我添加了两个别名alias xdebug-on='sudo php5enmod -s cli xdebug'alias xdebug-off='sudo php5dismod -s cli xdebug',因此现在很容易启用xdebug-on和禁用xdebug-offxdebug。
Daniel Mecke

不便携。可能仅适用于Linux。
Diti

在Laravel Homestead盒子(Ubuntu / Debian)上效果很好。有关其工作方式的详细说明,请访问:laracasts.com/discuss/channels/forge/disable-xdebug
Justin

2
感谢这个:)但我的Ubuntu 16.04,如果有人需要使用这只是执行sudo phpdismod -s CLI Xdebug的
天使M.

ubuntu中的php7怎么样?我是否只需要删除符号链接?/etc/php/7.0/cli/conf.d
gastonnina

40

我认为没有配置PHP的选项,因此它可以根据目标脚本加载不同的配置。至少,并非没有复制.ini文件...

但是,您可以在使用php运行composer时添加这些选项:

php -n -d extension=needed_ext.so composer.phar

-n会告诉PHP忽略任何php.ini。这将阻止xdebug为该命令加载。

-doptions允许您添加所需的任何选项(例如,激活needed_ext.so)。您可以使用多个-d选项。当然,这是可选的,您可能不需要它。

然后,您可以创建一个别名,使其再次变得含糖。

一个典型的解决方案(因为作曲家需要json):

php -n -d extension=json.so composer.phar

greg0ire>我的解决方案,基于此:

#!/bin/bash
options=$(ls -1 /usr/lib64/php/modules| \

    grep --invert-match xdebug| \

    # remove problematic extensions
    egrep --invert-match 'mysql|wddx|pgsql'| \

    sed --expression 's/\(.*\)/ --define extension=\1/'| \

    # join everything together back in one big line
    tr --delete '\n'
)

# build the final command line
php --no-php-ini $options ~/bin/composer $*

alias composer=/path/to/bash/script.sh

它看起来很丑陋(我尝试使用xargs尝试失败了),但是可以工作……虽然我不得不禁用某些扩展名,否则会收到以下警告:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/php/modules/mysqli.so: undefined symbol: mysqlnd_connect in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_mysql.so' - /usr/lib64/php/modules/pdo_mysql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_pgsql.so' - /usr/lib64/php/modules/pdo_pgsql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/wddx.so' - /usr/lib64/php/modules/wddx.so: undefined symbol: php_XML_SetUserData in Unknown on line 0

-n昨天尝试过,遇到了问题,因为我错过了phar扩展名。我会尝试添加越来越多的扩展,直到它起作用为止,我认为这是一个很好的解决方案。根据别名,我已经有一些不需要维护的zsh别名。也许我会尝试用bash脚本替换二进制文件,或者看看是否可以配置别名。
greg0ire

但是,这种白名单方法的问题在于,白名单可能会根据人们的需求而增长composer.json,例如“ ext-ldap”:“ *”,或者仅取决于使安装后任务正常运行所需的条件…如果只有一种方法可以将扩展名列入黑名单…
greg0ire 2015年

1
我将尝试使用php -m
greg0ire 2015年

我想到了,但是,我假设您在开发环境中使用xdebug。作曲家太慢了,需要进行此调整吗?
Gui-Don

哦,不,我刚刚从输出看到这个diagnose,因为我要建开发搬运工容器为我的球队,最小速度的提高可以受益于所有的人
greg0ire

14

通过创建别名,您将消除该composer xdebug错误消息。

只要将此行添加到您~/.bash_aliases的系统中,它就可以正常工作。

alias composer="php -n /usr/local/bin/composer"

重新加载外壳程序以使新别名composer可用。

source ~/.bash_profile

用法:

$ composer --version

注意:
您不一定需要使用任何其他参数。
根据您的系统,您可能会使用.bashrc而不是.bash_profile

更新:

正如@AlexanderKachkaev在评论中提到的那样,按如下方式添加memory_limit以避免在某些情况下崩溃是毫无意义的:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"

3
一旦在安装后或更新后脚本中需要其中一个扩展,这种方法将无法很好地发挥作用……尽管对于简单项目而言,这可能是一个很好的解决方案。
greg0ire '16

1
-n选项禁用Phar扩展,因此可能无法从composer.phar
brzuchal

1
这对我有用。另外,我禁用了内存限制以避免崩溃:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Alexander Kachkaev

对于我的情况,此解决方案非常简单且可行。来自@AlexanderKachkaev的内存限制建议是必须的。很好地编辑答案。
亨利

12

我想出了一个对OSX非常有效的答案,并且可能适用于使用“附加ini目录”中的各个.ini文件加载其扩展名的任何PHP版本:

#!/bin/sh

function php-no-xdebug {
    local temporaryPath="$(mktemp -t php-no-debug)"

    find /opt/local/etc/$1/php.ini /opt/local/var/db/$1/*.ini ! -name xdebug.ini | xargs cat > "$temporaryPath"
    php -n -c "$temporaryPath" "${@:2}"
    rm -f "$temporaryPath"
}

alias composer="php-no-xdebug php56 ~/bin/composer"

大!我基于此为Ubuntu 14.04-15.10 gist.github.com/perk11/816c4e64023ea26976cf
Konstantin

太棒了,在Mac OS上,在brew安装的php 7.1上运行良好。TY!
安东尼奥·卡洛斯·里贝罗

7

我通常为每个项目创建一个Shell脚本,因为每个项目都有另一个PHP版本。它在/bin/旁边的目录中composer.pharcomposer.json并且像./bin/composer在项目目录中一样运行它。

看起来像这样(对于php56)

#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

COMPOSER_DISABLE_XDEBUG_WARN=1 /opt/local/bin/php56 \
    -d xdebug.remote_enable=0 -d xdebug.profiler_enable=0 \
    -d xdebug.default_enable=0 $DIR/../composer.phar "$@"

这些-d选项有效地禁用了xdebug。该COMPOSER_DISABLE_XDEBUG_WARN=1部件禁用警告作曲家问题。

最好禁用xdebug扩展(请参阅composer故障排除)),但是我个人更喜欢更简单的脚本。

我的机器上的一些时间安排:2使用xdebug并启用ini来运行:1m33

使用xdebug运行,但已禁用ini:0m19

不带xdebug运行:0m10


我认为,既然您正在禁用XDebug,则不需要COMPOSER_DISABLE_XDEBUG_WARN=1::如果收到警告,则意味着您的scrit不起作用。xdebug.remote_autostart如果禁用了远程调试,则定义似乎无用。
greg0ire

你说的对xdebug.remote_autostart。关于脚本的有效性:Composer检查xdebug扩展是否已加载,而不是实际上是否在执行任何操作,请查看此处的代码。ini选项在“常规” php脚本中可以正常工作,但是再次:我没有做任何性能测试……
Joost

(最后)在composer手册中找到了有关此故障排除的相关部分:xdebug对composer的影响。它解释说,通过ini标志禁用所有xdebug选项不足以减轻性能问题。因此我的脚本将无法工作。太糟糕了!
Joost

我做了一些时间安排(在Mac OS X上),我必须说我对使用脚本提高性能感到非常满意!启用 xdebug选项需要1分33秒禁用选项则需要0分19分。如果没有xdebug扩展名,则占用0m10
Joost

好的,所以无论如何都有改进。虽然不是最好的改进,但还是有很大的改进(至少在OS X上如此)
greg0ire

6

如果使用PHPStorm,则最新版本(2016.2)带有一项功能,该功能可按需启用XDebug for CLI脚本,这意味着您可以在开发计算机上简单地全局关闭XDebug。当项目中的代码需要IDE时,它将即时启用它。

https://blog.jetbrains.com/phpstorm/2016/06/xdebug-on-demand-for-cli-php-scripts-in-phpstorm-2016-2-eap/

PhpStorm 2016.2引入了Xdebug On Demand模式,您可以在其中禁用全局PHP安装的Xdebug,而PhpStorm仅在需要时(在调试脚本或需要代码覆盖率报告时)启用它。

您需要编辑PHP Interpreters首选项,以包括XDebug的路径,如链接文章中所述。

对我来说,这似乎是一个完美的解决方案,因为在IDE中时,我通常只需要XDebug。

但是,当您“脱机”时,XDebug确实还有其他潜在用途,例如,错误日志中的扩展堆栈转储,如果将其全局关闭会丢失。当然,您不应该在生产环境中启用XDebug,因此这将仅限于开发中的beta测试或自动测试CLI脚本之类的用例。


5

当您可能有使用PHP的并发进程(例如,作为CI管道的一部分)时,您可以告诉PHP指向不同的模块加载目录,而不是临时启用或禁用PHP模块。

尽管这与上面提到的某些解决方案相似,但这解决了一些极端情况,当詹金斯或其他在同一台计算机上同时运行测试的CI运行器使用它们时,这非常有用。

最简单的方法是使用环境变量 PHP_INI_SCAN_DIR

在脚本或构建任务中使用它很容易:

export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug php composer install

当然,您可能想先准备/etc/php.d.noxdebug,做类似的事情:

mkdir /etc/php.d.noxdebug cp /etc/php.d/* /etc/php.d.noxdebug rm /etc/php.d.noxdebug/xdebug.ini

这意味着您的环境类似于旧的php环境,仅缺少一个模块。这意味着您不必担心需要像使用php -n解决方案那样加载phar / json模块。


我将使用符号链接,而不只是复制ini文件。
greg0ire

1
我避免使用符号链接,因为它给人以文件夹同步的印象,而新模块不会自动包含在“ noxdebug”文件夹中。
哈比人(KHobbits)

4

我想出了一个基于Windows的Composer安装程序的解决方案-它适用于任何Composer安装,它基本上是复制已加载的INI文件并注释掉xdebug zend扩展名,然后在运行composer时加载该配置文件。

我打开了一个问题,看他们是否要整合此更改:

https://github.com/composer/windows-setup/issues/58

您可以在此处找到我的说明和代码。


简单有效:)通过自我更新更新作曲家后,是否需要再次应用?
marcovtwout,2016年

4

乔伊斯的回答所述所述,最新版本的Composer中不再存在此问题。

Composer文档已更新为注意此。它详细说明了如何使用Composer启用xdebug(如果需要)。

您可以通过自我更新来更新您的Composer版本

在Mac上,我必须执行以下操作: sudo php /opt/local/bin/composer self-update

可以在本期中找到有关在Homebrew PHP安装环境中进行此操作的更多详细信息。


那很棒!您知道此更改的公关在哪里吗?我需要它在另一个CLI应用程序
托马什Votruba

3

直接操作PHP配置

这是我基于Mac OS X 上的Homebrew安装的PHP安装所做的贡献。

这是一个shell脚本包装程序,旨在保存为的可执行文件/usr/local/bin/composer,而Composer二进制文件位于/usr/local/bin/composer.phar

#!/bin/sh
sed -i '' -e 's:zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini
/usr/local/bin/php /usr/local/bin/composer.phar "$@"
sed -i '' -e 's:;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini

操作理论

包装器脚本:

  • 使用sed临时修改配置文件,从而禁用Xdebug(第2行)
  • 执行Composer,将args传递给命令(第3行)
  • 使用sed还原配置文件,重新启用Xdebug(第4行)

该脚本与PHP 5.5的OS X / Homebrew安装耦合。应调整路径以使其与其他PHP版本以及其他操作系统和程序包管理器的目录布局一起使用。还要注意,某些版本的sed不需要在该-i选项后加上empty-string参数。

警告用户

该脚本非常简单,因为它可以直接在主要的PHP配置文件上运行,但是这也是一个缺点:Xdebug也将针对碰巧与此脚本同时执行的所有脚本禁用。

在我的开发环境中,这是可以接受的折衷方案,因为Composer是手动执行的,并且只能偶尔执行;但是,如果在自动部署过程中执行Composer,则可能不希望使用此技术。


我不确定这是否会影响Composer处理错误的方式-您是否有特定的示例或关注点?该脚本旨在作为问题的快速解决方案,尚未经过全面的测试。话虽如此,在我使用它的时候,它一直没有任何问题。
j13k 2016年

1
我担心的是脚本的最后一行可能无法运行。
greg0ire

2

在大多数情况下,您不需要在CLI模式下使用xdebug。如果可以接受,则可以不同地配置cli和cgi。

因此,如果使php-cli.iniconf-cli.d接近退出php.ini文件,则可以不同地配置cli和cgi(对于cgi来说应该是php.iniconf.d)。只是不要将xdebug.ini放入conf-cli.d中。


2

如果在OS X上使用brew安装composer,则可以使用以下别名:

alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"

1

对于具有多个PHP版本的macports安装,我的快速解决方案是为Composer编写以下简单的外壳包装程序:

/user/local/bin/composer-nodebug.sh

#!/bin/bash

sudo mv /opt/local/var/db/php53/xdebug.ini /opt/local/var/db/php53/xdebug.NOT
sudo mv /opt/local/var/db/php54/xdebug.ini /opt/local/var/db/php54/xdebug.NOT
sudo mv /opt/local/var/db/php55/xdebug.ini /opt/local/var/db/php55/xdebug.NOT
composer $1 $2 $3 $4 $5 $6 $7
sudo mv /opt/local/var/db/php53/xdebug.NOT /opt/local/var/db/php53/xdebug.ini
sudo mv /opt/local/var/db/php54/xdebug.NOT /opt/local/var/db/php54/xdebug.ini
sudo mv /opt/local/var/db/php55/xdebug.NOT /opt/local/var/db/php55/xdebug.ini

然后运行任何作曲家命令,如下所示:

sudo composer-nodebug.sh update

缺点:

  • 需要sudo(除非您将INI文件设置为chmod)
  • 如果在中途杀死它,则INI文件将被修改
  • 将需要添加将来的PHP版本。
  • 在运行时,其他PHP进程会受到影响

不优雅,但简单。


我认为您可以使用快捷方式来代替$1…$7…也许$@是这样,您必须要看一下。
greg0ire

>如果您在修改INI文件的途中杀死它,则可以通过捕获kill信号来修复>将需要添加将来的PHP版本。您还可以通过一个简单的循环来解决该问题
greg0ire

1

为composer创建别名以禁用xdebug并防止内存错误:

将此行添加到您的〜/ .bash_profile中

alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'

重新启动终端以使新别名可用。


-3

这是我摆脱PHP5-cli版本的Xdebug警告的快速解决方案。我已经删除了Ubuntu 14.04上Xdebug对PHP5-cli的支持。

cd /etc/php5/cli/conf.d/

须藤rm 20-xdebug.ini

现在在PHP5-cli上不再有Xdebug警告。


2
sudo phpdismod xdebug将是首选的暴力破解方法rm
Jeff Puckett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.