运行composer时禁用xdebug

时间:2015-06-26 22:44:08

标签: php composer-php xdebug

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

  

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

如果我在运行Composer时如何禁用xdebug?

18 个答案:

答案 0 :(得分:76)

此命令将禁用CLI(以及作曲家)的PHP5 Xdebug模块:

sudo php5dismod -s cli xdebug

它从/etc/php5/cli/conf.d/

中删除 xdebug.ini 符号链接

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

建议这样做

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

sudo phpdismod -s cli xdebug

答案 1 :(得分:73)

更新:问题已在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 $@

答案 2 :(得分:40)

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

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

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

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

-d选项允许您添加所需的任何选项(例如,激活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

答案 3 :(得分:14)

通过创建别名,您可以取消composer xdebug错误消息。

只需将此行添加到系统中的~/.bash_aliases即可,它应该可以正常运行。

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

重新加载shell以使新别名composer可用。

source ~/.bash_profile

用法:

$ composer --version

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

<强>更新

正如@AlexanderKachkaev在评论中提到的那样,在以下情况下添加memory_limit是值得的,以避免在某些情况下崩溃:

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

答案 4 :(得分:12)

我想出了一个适用于OSX的答案,并且可能适用于任何PHP版本,它使用单独的.ini文件加载其扩展名,其他内容包括&#34;:

#!/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"

答案 5 :(得分:7)

我通常为每个项目创建一个shell脚本,因为每个项目都有另一个PHP版本。它位于/bin/composer.phar旁边的composer.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 troubleshooting),但我个人更喜欢更简单的脚本。

我机器上的一些时间: 2 使用xdebug和ini-enabled运行:1m33

使用xdebug运行,但ini-disabled:0m19

不使用xdebug运行:0m10

答案 6 :(得分: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模式,您可以在其中禁用Xdebug进行全局PHP安装,PhpStorm仅在需要时启用它 - 当您调试脚本时,或者需要代码覆盖率报告时。

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

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

然而,当您“离线”时,XDebug确实有其他潜在用途,例如:错误日志中的扩展堆栈转储,您可以通过全局关闭它来丢失它。当然,您不应该在生产中启用XDebug,因此这将仅限于开发中的beta测试或自动测试CLI脚本等用例。

答案 7 :(得分:4)

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

我已经打开了一个问题,看看他们是否愿意整合这一变化:

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

您可以在那里找到我的说明和代码。

答案 8 :(得分:4)

Joyce's answer所述,最新版本的Composer中不再存在此问题。

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

您可以使用self-update更新您的Composer版本。

在我的Mac上,我必须这样做:sudo php /opt/local/bin/composer self-update

有关Homebrew PHP安装环境中有关此内容的更多详细信息,请参阅this issue

答案 9 :(得分:3)

在大多数情况下,您不需要在CLI模式下使用xdebug。如果这对你来说是可以接受的,那么你可以用不同的方式配置cli和cgi。

因此,如果您在退出php.ini文件附近进行 php-cli.ini conf-cli.d ,则可以不同地配置cli和cgi(对于cgi,将是 php.ini conf.d )。只是不要将xdebug.ini放入conf-cli.d。

答案 10 :(得分:3)

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

虽然这与上面提到的一些解决方案类似,但这解决了一些边缘情况,当Jenkins或其他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模块。

答案 11 :(得分:3)

直接操作PHP配置

以下是基于Homebrew在Mac OS X上安装的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版本和其他操作系统一起使用。和包裹经理&#39;目录布局。另请注意,某些版本的sed不需要-i选项后面的空字符串参数。

Caveat Utilitor

该脚本很简单,因为它直接在主要的PHP配置文件上运行,但然而这也是一个缺点:对于碰巧与此同时执行的任何脚本,Xdebug也将被禁用脚本。

在我的开发环境中,这是一个可接受的权衡,因为Composer是手动执行的,只是偶尔执行;但是,如果将Composer作为自动部署过程的一部分执行,则可能不希望使用此技术。

答案 12 :(得分:2)

如果在OS X上使用brew安装composer 您可以使用此别名:

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

答案 13 :(得分:1)

我使用多个版本的PHP安装macports的快速解决方案就是为Composer编写这个简单的shell包装器:

/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(除非你chmod INI文件)
  • 如果您在修改INI文件的过程中将其删除
  • 将需要添加未来的PHP版本。
  • 正在运行其他PHP进程受影响

不优雅,但很简单。

答案 14 :(得分:0)

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

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

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

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

答案 15 :(得分:0)

(Windows)

基于documentation,我使用环境变量PHPRC,因此我可以选择大声加载哪个INI文件,这样,我可以选择执行命令之前是否要启用或禁用Xdebug(例如{ {1}}。

我有两个INI文件,一个文件启用了Xdebug(composer install),另一个文件禁用了Xdebug(php-xdebug.ini-这也是默认文件)。

我使用了一些批次(放置在php.ini环境变量中,因此可以在任何地方执行):

要启用Xdebug,我致电 PATH

xon.bat

要禁用Xdebug,请致电 @ECHO OFF set PHPRC=C:/path-to-php/php-xdebug.ini

xoff.bat

通过调用@ECHO OFF set PHPRC= ,我可以检查加载了哪个INI文件。

或者,您可以使用环境变量php --ini,在其中设置要从中加载其他INI文件的目录的路径。优点是您可以加载多个INI文件。

答案 16 :(得分:0)

您可以禁用Xdebug设置环境变量:

XDEBUG_MODE=off composer install

它可以在XDebug 3中使用。

答案 17 :(得分:-3)

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

  

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

     

sudo rm 20-xdebug.ini

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