运行作曲家时禁用 xdebug


Disabling xdebug when running composer

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

xdebug 扩展被加载,这可能会稍微减慢 Composer 的速度。 建议在使用作曲家时禁用它。

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

更新:对于 Xdebug 3+

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

通过别名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 将作曲家更新到最新版本,而不是尝试以下解决方法。


对于 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 的 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 的选项,因此它可以根据目标脚本加载不同的配置。至少,并非没有复制.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

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

XDEBUG_MODE=off composer install

它可以使用XDebug 3。

通过创建别名,您将禁止显示该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"

我想出了一个对OSX非常有效的答案,并且可能适用于使用"附加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"

我通常为每个项目创建一个 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 扩展是首选(请参阅作曲家故障排除(,但我个人喜欢更简单的脚本。

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

使用 xdebug 运行但禁用了 ini:0m19

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

如果您使用 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 引入了 Xdebug On Demand 模式,您可以在其中为全局 PHP 安装禁用 Xdebug,而 PhpStorm 只会在需要时启用它 - 当您调试脚本或需要代码覆盖率报告时。

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

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

但是,当您

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

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

直接操作 PHP 配置

以下是我基于Mac OS X上Homebrew安装的PHP安装的贡献。

它是一个 shell 脚本包装器,旨在保存为 /usr/local/bin/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 选项后面的空字符串参数。

警告实用器

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

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

我想出了一个基于 Windows 的 Composer

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

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

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

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

正如Joyce的回答中所指出的,这个问题在最新版本的Composer中不再存在。

作曲家文档已更新以说明这一点。它详细介绍了如何使用 Composer 启用 xdebug(如果需要(。

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

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

自制 PHP 安装的上下文中,有关此内容的更多详细信息可以在此问题中找到。

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

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

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

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

在大多数情况下,

在CLI模式下不需要xdebug。如果您可以接受,则可以以不同的方式配置 cli 和 cgi。

因此,如果你在退出的php.ini文件附近制作php-cli.iniconf-cli.d,那么你可以以不同的方式配置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 $7}')"

对于使用多个版本的 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(除非你对 INI 文件进行 chmod(
  • 如果你中途杀死它,INI文件被修改
  • 将需要添加未来的 PHP 版本。
  • 当它正在运行时,其他PHP进程受到影响

不优雅,但简单。

(Windows(

根据文档,我使用环境变量 PHPRC ,所以我可以选择加载哪个 INI 文件,因此我可以在执行命令(如 composer install(之前选择是要启用还是禁用 Xdebug。

我有两个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 文件。

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

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

sudo rm 20-xdebug.ini

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