运行composer时禁用xdebug

gre*_*ire 97 php xdebug composer-php

运行时composer diagnose,我收到以下错误:

加载了xdebug扩展,这可以减慢Composer的速度.建议在使用Composer时禁用它.

如何在运行Composer时禁用xdebug?

小智 77

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

sudo php5dismod -s cli xdebug
Run Code Online (Sandbox Code Playgroud)

从中删除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
Run Code Online (Sandbox Code Playgroud)

  • 我添加了两个别名`别名xdebug-on ='sudo php5enmod -s cli xdebug'`和`alias xdebug-off ='sudo php5dismod -s cli xdebug'`,所以现在很容易启用`xdebug-on`并禁用`xdebug-off` xdebug. (4认同)
  • 谢谢你:)但我有ubuntu 16.04如果有人需要使用这个只是运行sudo phpdismod -s cli xdebug (2认同)
  • 对于php 7 sudo phpdismod -s cli xdebug的作品 (2认同)

Joy*_*abu 76

更新:问题已在Composer 1.3中修复.通过执行将composer更新到最新版本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 $@
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最优雅的问题解决方案,恕我直言.谢谢乔伊斯! (3认同)
  • 最好.脚本.自从 (2认同)

Gui*_*Don 40

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

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

php -n -d extension=needed_ext.so composer.phar
Run Code Online (Sandbox Code Playgroud)

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

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

然后你可以创建一个别名,让它再次含糖.

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

php -n -d extension=json.so composer.phar
Run Code Online (Sandbox Code Playgroud)

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

它看起来很难看(我试过并且没有用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
Run Code Online (Sandbox Code Playgroud)


Adr*_*osa 14

通过创建别名,您将抑制该composer xdebug错误消息.

只需将此行添加到您~/.bash_aliases的系统中,它就可以完美运行.

alias composer="php -n /usr/local/bin/composer"
Run Code Online (Sandbox Code Playgroud)

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

source ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

用法:

$ composer --version
Run Code Online (Sandbox Code Playgroud)

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

更新:

作为@AlexanderKachkaev在评论中提到它的价值没有补充memory_limit的如下,以避免崩溃IM一些情况:

alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Run Code Online (Sandbox Code Playgroud)

  • 只要在安装后或更新后的脚本中需要其中一个扩展,这将无法很好地发挥作用......虽然可能是一个很好的解决方案. (3认同)

xse*_*rat 13

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

XDEBUG_MODE=off composer install
Run Code Online (Sandbox Code Playgroud)

它可以使用XDebug 3


ezz*_*ron 12

我想出了一个适用于OSX的答案,并且可能适用于任何使用"additional ini dir"中的单个.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"
Run Code Online (Sandbox Code Playgroud)


Joo*_*ost 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 "$@"
Run Code Online (Sandbox Code Playgroud)

这些-d选项有效地禁用了xdebug.该COMPOSER_DISABLE_XDEBUG_WARN=1部分禁用警告编写器问题.

首选禁用xdebug扩展(请参阅编写器故障排除),但我个人更喜欢更简单的脚本.

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

运行xdebug但ini-disabled:0m19

在没有xdebug的情况下运行:0m10


sci*_*lot 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的点播模式,您可以禁用Xdebug的为您的全球PHP安装,并且当它需要PhpStorm只会启用它 - 当你调试你的脚本,或者当你需要的代码覆盖率报告.

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

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

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


KHo*_*its 5

当您可能有使用 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 模块。