运行作曲者时禁用xdebug

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

xdebug扩展被加载,这可能会减慢Composer的速度。 build议使用Composer禁用它。

我只有在运行Composer时才能禁用xdebug?

更新 :这个问题已经在Composer 1.3中解决了 。 通过执行composer self-update更新composer php到最新版本,而不是尝试以下解决方法。


这里是我对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' > "$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符号链接

这是build议在http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/

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

 sudo phpdismod -s cli xdebug 

我不认为有configurationPHP的选项,所以它可以根据目标脚本加载不同的configuration。 至less,不是没有重复的.ini文件…

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

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

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

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

然后你可以创build一个别名,使其再次含糖。

一个典型的解决scheme(因为composer php需要json):

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

greg0ire>我的解决scheme,基于此:

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

我想出了一个适用于OSX的解决scheme,可能适用于任何使用“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" 

通过创build一个别名,你会压制这个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" 

我通常为每个项目创build一个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部分禁用警告composer php问题。

禁用xdebug扩展是首选(请参阅composer php故障排除 ),但我个人喜欢更简单的脚本。

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

运行xdebug但是ini-disabled:0m19

运行时不使用xdebug:0m10

如果您使用PHPStorm,则最新版本(2016.2)提供了按需启用XDebug for CLI脚本的function,这意味着您只需在开发计算机上全局closuresXDebug即可。 当您的项目中的代码需要时,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仅在需要时才启用 – 当您正在debugging脚本时,或者需要代码覆盖率报告时。

您需要编辑您的PHP Interpreters偏好设置以包含XDebug的path,如链接文章中所述。

对我来说,这似乎是一个完美的解决scheme,因为我通常只想在IDE中使用XDebug。

但是,当你“脱机”的时候,XDebug确实有其他潜在的用途,例如错误日志中的扩展堆栈转储,你可以通过全局closures来丢失它。 当然,您不应该在生产环境中启用XDebug,所以这将仅限于在开发中使用诸如betatesting或自动testingCLI脚本的情况。

我想出了一个基于Windows的Composer安装程序的解决scheme – 它应该适用于任何Composer安装,它只是基本制作加载的INI文件的副本,并注释掉xdebug zend扩展,然后在运行作曲者时加载该configuration文件。

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

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

你可以在那里find我的指示和代码。

直接操作PHPconfiguration

这是我在Mac OS X上基于安装了自制软件的 PHP安装的贡献。

这是一个shell脚本封装器,它被devise成可执行文件保存在/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临时修改configuration文件,禁用Xdebug(第2行)
  • 执行Composer,通过parameter passing给命令(第3行)
  • 使用sed恢复configuration文件,重新启用Xdebug(第4行)

该脚本被耦合到PHP 5.5的OS X / Homebrew安装。 应该调整path以与其他PHP版本以及其他操作系统和包pipe理器的目录布局一起工作。 还要注意,某些版本的sed在-i选项后面不需要空string参数。

警告工具

这个脚本非常简单,它直接在主要的PHPconfiguration文件上工作, 但是这也是一个缺点:Xdebug也将被禁用,这个脚本恰好与这个脚本同时执行。

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

在大多数情况下,在CLI模式下不需要xdebug。 如果这是可以接受的比你可以configurationcli和cgi不同。

所以如果你使php-cli.iniconf-cli.d在退出php.ini文件的时候比你可以configurationcli和cgi的方式不同(对于cgi,它将是php.iniconf.d )。 不要把xdebug.ini放到conf-cli.d中。

正如乔伊斯的回答所指出的 ,这个问题在最新版本的Composer中不复存在。

Composer文档已更新,以注意这一点 。 它详细介绍了如何使用Composer启用xdebug(如果需要的话)。

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

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

在这个问题中可以find关于这个在Homebrew PHP安装上下文的更多细节。

如果你在OS X上使用brew来安装composer php,你可以使用这个别名:

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

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

虽然这与上面提到的一些解决scheme类似,但是这解决了一些边缘情况,这在被同时在同一台机器上运行testing的Jenkins或其他CI跑步者使用时非常有用。

最简单的方法是使用环境variablesPHP_INI_SCAN_DIR

在脚本或构build任务中使用它很简单:

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解决scheme一样加载phar / json模块。

对于一个macports安装,有多个PHP版本的快速解决scheme是为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 

然后运行任何composer php命令,如下所示:

 sudo composer-nodebug.sh update 

缺点:

  • 需要sudo(除非你chmod INI文件)
  • 如果你在中途杀死INI文件被修改
  • 将需要添加未来的PHP版本。
  • 而运行其他PHP进程则受到影响

不优雅,但简单。

这里是我的快速解决scheme来摆脱PHP5-CLI版本的Xdebug警告。 我在Ubuntu 14.04上删除了Xdebug for PHP5-cli的支持。

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

sudo rm 20-xdebug.ini

现在PHP5-cli没有更多的Xdebug警告。