运行作曲家时禁用 xdebug
Posted
技术标签:
【中文标题】运行作曲家时禁用 xdebug【英文标题】:Disabling xdebug when running composer 【发布时间】:2015-09-13 23:58:22 【问题描述】:运行composer diagnose
时,出现以下错误:
xdebug 扩展已加载,这会稍微减慢 Composer。 建议在使用 Composer 时禁用它。
如何仅在运行 Composer 时禁用 xdebug?
【问题讨论】:
【参考方案1】:我认为没有配置 php 的选项,因此它可以根据目标脚本加载不同的配置。至少,不是不复制 .ini 文件...
但是,您可以在使用 php 运行 composer 时添加这些选项:
php -n -d extension=needed_ext.so composer.phar
-n
会告诉 PHP 忽略任何 php.ini。这将阻止 xdebug 为这个命令加载。
-d
options 允许您添加任何您想要的选项(例如,激活 required_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=\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 脚本替换二进制文件,或者看看我是否可以配置别名。
不过,这种白名单方法的问题在于,白名单可能会根据人们在composer.json
中的要求而增长,例如“ext-ldap”:“*”,或者仅仅取决于需要什么才能使安装后任务正常运行……如果有办法将扩展列入黑名单……
我会尝试对php -m
的输出做点什么
我想到了,但是,我假设您在开发环境中使用 xdebug。作曲家这么慢,需要这个调整吗?
哦,不,我刚刚从diagnose
的输出中看到了这一点,并且由于我正在为我的团队构建development docker containers,因此最小的速度改进可以使所有人受益【参考方案2】:
我想出了一个非常适合 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 创建了一个通用脚本 太棒了,在 Mac OS 上运行良好,在 brew 上安装了 php 7.1。泰!【参考方案3】:我通常为每个项目创建一个 shell 脚本,因为每个项目都有另一个 PHP 版本。它位于composer.phar
和composer.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 的情况下运行:1m33
使用 xdebug 运行但已禁用 ini:0m19
不使用 xdebug 运行:0m10
【讨论】:
我认为由于您禁用了 XDebug,因此您不需要COMPOSER_DISABLE_XDEBUG_WARN=1
:如果您收到警告,则仅表示您的脚本不起作用。如果禁用远程调试,定义 xdebug.remote_autostart
似乎没用。
xdebug.remote_autostart
是对的。关于脚本的有效性:Composer 检查是否加载了 xdebug 扩展,而不是它是否真的在做任何事情look at the code here。 ini 选项在“常规”php 脚本中工作正常,但同样:我没有进行任何性能测试...
(终于)在作曲家手册中找到了关于这个troubleshooting: xdebug impact on composer的相关部分。它解释说通过 ini 标志禁用所有 xdebug 选项不足以缓解性能问题。所以我的脚本不起作用。太糟糕了!
我做了一些计时(在 Mac OS X 上),我必须说我对使用我的脚本的性能改进非常满意! xdebug 选项启用需要1m33,选项disabled需要0m19。如果没有 xdebug 扩展,它需要 0m10.
好的,无论如何都有改进。不是最好的改进,但仍然是一个巨大的改进(至少在 OS X 上)【参考方案4】:
通过创建别名,您将抑制 composer
xdebug
错误消息。
只需将此行添加到您系统中的~/.bash_aliases
,它应该可以完美运行。
alias composer="php -n /usr/local/bin/composer"
重新加载 shell 以使新别名 composer
可用。
source ~/.bash_profile
用法:
$ composer --version
注意:
您不一定需要使用任何其他参数。
根据您的系统,您可能使用.bashrc
而不是.bash_profile
。
更新:
正如@AlexanderKachkaev 在 cmets 中提到的那样,添加 memory_limit 如下以避免在某些情况下崩溃是毫无价值的:
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
【讨论】:
一旦在安装后或更新后脚本中需要其中一个扩展,这将不会很好地发挥作用……不过,对于简单的项目来说,这可能是一个很好的解决方案。-n
选项禁用Phar
扩展,因此它可能无法从composer.phar
运行
这对我有用。另外,我禁用了内存限制以避免崩溃:alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
这个解决方案非常简单,适合我的情况。 @AlexanderKachkaev 的内存限制建议是必须的。最好编辑答案。【参考方案5】:
此命令将禁用 CLI(以及 composer)的 PHP5 Xdebug 模块:
sudo php5dismod -s cli xdebug
它会从/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
【讨论】:
我已经添加了两个别名alias xdebug-on='sudo php5enmod -s cli xdebug'
和alias xdebug-off='sudo php5dismod -s cli xdebug'
,所以现在很容易启用xdebug-on
和禁用xdebug-off
xdebug。
不可移植。可能仅限 Linux。
在 Laravel Homestead box (Ubuntu/Debian) 上运行良好。对其工作原理的详细描述:laracasts.com/discuss/channels/forge/disable-xdebug
感谢 :) 但我有 ubuntu 16.04,如果有人需要使用它,只需运行 sudo phpdismod -s cli xdebug
ubuntu中的php7怎么样?我只需要删除符号链接吗? /etc/php/7.0/cli/conf.d【参考方案6】:
直接操作 PHP 配置
这是我基于在 Mac OS X 上安装的 Homebrew-installed PHP 的贡献。
它是一个 shell-script 包装器,旨在保存为/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
选项后面的空字符串参数。
警告实用程序
这个脚本很简单,因为它直接在主要的 PHP 配置文件上运行,然而这也是一个缺点:Xdebug 也将被禁用任何碰巧与此同时执行的脚本脚本。
在我的开发环境中,这是一个可以接受的折衷方案,因为 Composer 是手动执行的,而且只是偶尔执行;但是,如果将 Composer 作为自动化部署过程的一部分执行,您可能不想使用此技术。
【讨论】:
我不确定 Composer 处理错误的方式是否会有所不同——您有具体的示例或问题吗?该脚本旨在作为问题的快速解决方案,尚未经过彻底的实战测试。话虽如此,在我使用它的这段时间里,它没有任何问题。 我担心脚本的最后一行可能不会运行。【参考方案7】:更新:对于 Xdebug 3+:
从 Xdebug 3 开始,可以通过将选项 xdebug.mode
设置为 off
或设置环境变量 XDEBUG_MODE=off
来完全禁用 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
这是我对@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==1print ""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 $@
【讨论】:
这是迄今为止最优雅的问题解决方案,恕我直言。谢谢乔伊斯! 最佳。脚本。曾经 我不得不将 shebang 调整为bin/bash
而不是 /bin/sh
,因为后者不喜欢 function
关键字(Ubuntu 14.04 LTS)。
您可以通过运行composer self-update
来确认您运行的是最新版本
新作曲家版本肯定还有这个问题,至少在我的 docker 容器中是这样【参考方案8】:
在大多数情况下,您不需要在 CLI 模式下使用 xdebug。如果这对您来说是可以接受的,那么您可以以不同的方式配置 cli 和 cgi。
因此,如果您使 php-cli.ini 和 conf-cli.d 接近退出 php.ini 文件,那么您可以不同地配置 cli 和 cgi(对于 cgi 它将是 php.ini 和 conf.d)。只是不要将 xdebug.ini 放入 conf-cli.d 中。
【讨论】:
【参考方案9】:如果您在 OS X 上使用 brew 安装 composer 你可以使用这个别名:
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk 'print $7')"
【讨论】:
【参考方案10】:我为基于 Windows 的 Composer 安装程序提出了一个解决方案 - 它应该适用于任何 Composer 安装,它基本上只是复制加载的 INI 文件并删除 xdebug zend 扩展,然后在加载该配置文件时加载它运行作曲家。
我已经打开了一个问题,看看他们是否愿意整合此更改:
https://github.com/composer/windows-setup/issues/58
你可以在那里找到我的说明和代码。
【讨论】:
简单有效:) 自更新作曲家更新后还要重新申请这个吗?【参考方案11】:我对 macports 安装的快速解决方案是为 Composer 编写这个简单的 shell 包装器,使用多个版本的 PHP:
/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
然后像这样运行任何 composer 命令:
sudo composer-nodebug.sh update
缺点:
需要 sudo(除非您对 INI 文件进行 chmod) 如果你在中途杀死它,INI 文件会被修改 将需要添加未来的 PHP 版本。 在运行时其他 PHP 进程受到影响不优雅,但简单。
【讨论】:
我认为你可以使用快捷方式来代替$1…$7
...也许它是$@
或类似的东西,你必须看看。
> 如果你在修改 INI 文件的过程中中途终止它,你可以通过捕获终止信号来修复它 > 将需要添加未来的 PHP 版本。你也可以用一个简单的循环来解决这个问题【参考方案12】:
这是我摆脱 PHP5-cli 版本上的 Xdebug 警告的快速解决方案。我在 Ubuntu 14.04 上移除了 Xdebug 对 PHP5-cli 的支持。
cd /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
现在 PHP5-cli 上不再有 Xdebug 警告。
【讨论】:
sudo phpdismod xdebug
将是暴力破解rm
的首选方法【参考方案13】:
如果您使用 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 解释器首选项以包含 XDebug 的路径,如链接文章中所述。
对我来说,这似乎是一个完美的解决方案,因为我通常只需要在 IDE 中使用 XDebug。
但是,当您“离线”时,XDebug 确实有其他潜在用途,例如错误日志中的扩展堆栈转储,全局关闭它会丢失。当然,您不应该在生产环境中启用 XDebug,因此这将仅限于开发中的 beta 测试或自动化测试 CLI 脚本等用例。
【讨论】:
【参考方案14】:当您可能有使用 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 模块。
【讨论】:
我会使用符号链接而不是仅仅复制 ini 文件。 我避免使用符号链接,因为它给人的印象是文件夹是同步的,而新模块不会自动包含在“noxdebug”文件夹中。【参考方案15】:如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。
【讨论】:
太好了!你知道这个变化的公关在哪里吗?我在另一个 CLI 应用程序中需要它【参考方案16】:为 composer 创建一个别名以禁用 xdebug 并防止内存错误:
将此行添加到您的 ~/.bash_profile
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
重新启动终端以使新别名可用。
【讨论】:
【参考方案17】:(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 扩展时提高性能,Composer 会在没有它的情况下自动重新启动 PHP。” (来源:getcomposer.org/doc/articles/…) 是的,我读到 composer & xdebug 的问题应该已经解决了,但就我而言,我所看到的很明显。composer install
启用 xdebug 需要永远,另一方面,禁用 xdebug 的相同命令可以正常工作(我 拥有最新的作曲家)。我试着玩COMPOSER_ALLOW_XDEBUG
,但没有效果。也许我没有解决原因(当然,如果我知道原因,我肯定会专注于它),但好处是存在的,我相信它可以帮助某人。【参考方案18】:
您可以禁用 Xdebug 设置环境变量:
XDEBUG_MODE=off composer install
可使用XDebug 3。
【讨论】:
以上是关于运行作曲家时禁用 xdebug的主要内容,如果未能解决你的问题,请参考以下文章