运行 composer 时禁用 xdebug

Disabling xdebug when running composer

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

The xdebug extension is loaded, this can slow down Composer a little. Disabling it when using Composer is recommended.

如何才能仅在我是 运行 Composer 时禁用 xdebug?

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

但是,当 运行 作曲家使用 php 时,您可以添加这些选项:

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

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

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

然后你可以创建一个别名,让它再次变甜。

一个典型的解决方案(因为composer需要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=/'| \

    # 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

我想出了一个适用于 OSX 的答案,并且可能适用于任何使用 [=13= 中的单独 .ini 文件加载其扩展的 PHP 版本]:

#!/bin/sh

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

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

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

我通常为每个项目创建一个 shell 脚本,因为每个项目都有另一个 PHP 版本。它位于 composer.pharcomposer.json 旁边的 /bin/ 目录中,我 运行 在我的项目目录中将其作为 ./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

通过创建别名,您将抑制 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"

此命令将禁用 CLI(以及 composer)的 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

直接操作PHP配置

这是我在 Mac OS X 上 Homebrew-installed 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,将参数传递给命令(第 3 行)
  • 使用sed恢复配置文件,重新启用Xdebug(第4行)

该脚本与 PHP 5.5 的 OS X/Homebrew 安装耦合。应调整路径以与其他 PHP 版本和其他操作系统和包管理器的目录布局一起使用。另请注意,某些版本的 sed 不需要 -i 选项后的空字符串参数。

注意实用程序

脚本很简单,因为它直接在主 PHP 配置文件上工作,然而 这也是一个缺点:Xdebug 也将被禁用恰好与该脚本同时执行的脚本。

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

更新:对于 Xdebug 3+

从 Xdebug 3 开始,可以通过将选项 xdebug.mode 设置为 off 或通过设置环境变量 XDEBUG_MODE=off.[=20= 来完全禁用 Xdebug ]

通过别名 composer.

为 composer 禁用 Xdebug 非常容易
alias composer='XDEBUG_MODE=off \composer'

alias composer='php -dxdebug.mode=off $(where composer | fgrep -v composer: |  head -1)'

您可以将别名添加到您的 $HOME/.bashrc 以使其永久化。


更新:对于 Xdebug 1.3 - 3.0.0

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


对于 Xdebug < 1.3

这是我对@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 $@

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

所以如果你让 php-cli.iniconf-cli.d 接近退出php.ini 文件比你可以不同地配置 cli 和 cgi(对于 cgi 它将是 php.iniconf.d).只是不要将 xdebug.ini 放入 conf-cli.d。

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

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

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

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

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

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

我的 macports 安装的快速解决方案,具有多个 PHP 版本,是为 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       
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 进程受到影响

不优雅,但简单。

这是我摆脱 PHP5-cli 版本上的 Xdebug 警告的快速解决方案。我在 Ubuntu 14.04.

上移除了 Xdebug 对 PHP5-cli 的支持

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

sudo rm 20-xdebug.ini

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

如果您使用 PHPStorm,最新版本 (2016.2) 附带了一项功能,可以按需为 CLI 脚本启用 XDebug,这意味着您只需在开发机器上全局关闭 XDebug。 IDE 将在项目中的代码需要时即时启用它。

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

PhpStorm 2016.2 introduces Xdebug On Demand mode where you can disable Xdebug for your global PHP install, and PhpStorm will only enable it when it needs to — when you’re debugging your scripts, or when you need code coverage reports.

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

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

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

而不是混淆临时启用或禁用 [​​=32=] 模块,当您可能有使用 PHP 的并发进程(例如作为 CI 管道的一部分)时,您可以告诉 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 模块。

中所述,此问题在最新版本的 Composer 中已不存在。

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

您可以使用 self-update.

更新您的 Composer 版本

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

可以在 this issue.

中找到关于 Homebrew PHP 安装的更多详细信息

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

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

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

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

(Windows)

基于documentation我使用了环境变量PHPRC,所以我可以选择加载哪个INI文件,这样我就可以选择是否要在执行命令之前启用或禁用Xdebug(喜欢 composer install).

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

我使用了一些批处理(放置在 PATH 环境变量中包含的位置,因此可以从任何地方执行):

为了启用 Xdebug,我调用 xon.bat:

@ECHO OFF
set PHPRC=C:/path-to-php/php-xdebug.ini

要禁用 Xdebug,我调用 xoff.bat:

@ECHO OFF
set PHPRC=

通过调用 php --ini 我可以检查加载了哪个 INI 文件。

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

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

XDEBUG_MODE=off composer install

可以使用 XDebug 3