Answers:
更新:此问题已在Composer 1.3中修复。通过执行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 $@
bin/bash
而不是/bin/sh
,因为后者不喜欢该function
关键字(Ubuntu 14.04 LTS)。
composer self-update
该命令将禁用CLI的PHP5 Xdebug模块(并因此禁用作曲家):
sudo php5dismod -s cli xdebug
它从以下位置删除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
alias xdebug-on='sudo php5enmod -s cli xdebug'
和alias xdebug-off='sudo php5dismod -s cli xdebug'
,因此现在很容易启用xdebug-on
和禁用xdebug-off
xdebug。
我认为没有配置PHP的选项,因此它可以根据目标脚本加载不同的配置。至少,并非没有复制.ini文件...
但是,您可以在使用php运行composer时添加这些选项:
php -n -d extension=needed_ext.so composer.phar
-n
会告诉PHP忽略任何php.ini。这将阻止xdebug为该命令加载。
-d
options允许您添加所需的任何选项(例如,激活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
-n
昨天尝试过,遇到了问题,因为我错过了phar
扩展名。我会尝试添加越来越多的扩展,直到它起作用为止,我认为这是一个很好的解决方案。根据别名,我已经有一些不需要维护的zsh别名。也许我会尝试用bash脚本替换二进制文件,或者看看是否可以配置别名。
composer.json
,例如“ ext-ldap”:“ *”,或者仅取决于使安装后任务正常运行所需的条件…如果只有一种方法可以将扩展名列入黑名单…
php -m
通过创建别名,您将消除该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"
-n
选项禁用Phar
扩展,因此可能无法从composer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
我想出了一个对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"
我通常为每个项目创建一个Shell脚本,因为每个项目都有另一个PHP版本。它在/bin/
旁边的目录中composer.phar
,composer.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 "$@"
这些-d
选项有效地禁用了xdebug。该COMPOSER_DISABLE_XDEBUG_WARN=1
部件禁用警告作曲家问题。
最好禁用xdebug扩展(请参阅composer故障排除)),但是我个人更喜欢更简单的脚本。
我的机器上的一些时间安排:2使用xdebug并启用ini来运行:1m33
使用xdebug运行,但已禁用ini:0m19
不带xdebug运行:0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
::如果收到警告,则意味着您的scrit不起作用。xdebug.remote_autostart
如果禁用了远程调试,则定义似乎无用。
如果使用PHPStorm,则最新版本(2016.2)带有一项功能,该功能可按需启用XDebug for CLI脚本,这意味着您可以在开发计算机上简单地全局关闭XDebug。当项目中的代码需要IDE时,它将即时启用它。
PhpStorm 2016.2引入了Xdebug On Demand模式,您可以在其中禁用全局PHP安装的Xdebug,而PhpStorm仅在需要时(在调试脚本或需要代码覆盖率报告时)启用它。
您需要编辑PHP Interpreters首选项,以包括XDebug的路径,如链接文章中所述。
对我来说,这似乎是一个完美的解决方案,因为在IDE中时,我通常只需要XDebug。
但是,当您“脱机”时,XDebug确实还有其他潜在用途,例如,错误日志中的扩展堆栈转储,如果将其全局关闭会丢失。当然,您不应该在生产环境中启用XDebug,因此这将仅限于开发中的beta测试或自动测试CLI脚本之类的用例。
当您可能有使用PHP的并发进程(例如,作为CI管道的一部分)时,您可以告诉PHP指向不同的模块加载目录,而不是临时启用或禁用PHP模块。
尽管这与上面提到的某些解决方案相似,但这解决了一些极端情况,当詹金斯或其他在同一台计算机上同时运行测试的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模块。
我想出了一个基于Windows的Composer安装程序的解决方案-它适用于任何Composer安装,它基本上是复制已加载的INI文件并注释掉xdebug zend扩展名,然后在运行composer时加载该配置文件。
我打开了一个问题,看他们是否要整合此更改:
https://github.com/composer/windows-setup/issues/58
您可以在此处找到我的说明和代码。
这是我基于Mac OS X 上的Homebrew安装的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
包装器脚本:
该脚本与PHP 5.5的OS X / Homebrew安装耦合。应调整路径以使其与其他PHP版本以及其他操作系统和程序包管理器的目录布局一起使用。还要注意,某些版本的sed不需要在该-i
选项后加上empty-string参数。
该脚本非常简单,因为它可以直接在主要的PHP配置文件上运行,但是这也是一个缺点:Xdebug也将针对碰巧与此脚本同时执行的所有脚本禁用。
在我的开发环境中,这是可以接受的折衷方案,因为Composer是手动执行的,并且只能偶尔执行;但是,如果在自动部署过程中执行Composer,则可能不希望使用此技术。
在大多数情况下,您不需要在CLI模式下使用xdebug。如果可以接受,则可以不同地配置cli和cgi。
因此,如果使php-cli.ini和conf-cli.d接近退出php.ini文件,则可以不同地配置cli和cgi(对于cgi来说应该是php.ini和conf.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编写以下简单的外壳包装程序:
/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
缺点:
不优雅,但简单。
$1…$7
…也许$@
是这样,您必须要看一下。
为composer创建别名以禁用xdebug并防止内存错误:
将此行添加到您的〜/ .bash_profile中
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
重新启动终端以使新别名可用。
这是我摆脱PHP5-cli版本的Xdebug警告的快速解决方案。我已经删除了Ubuntu 14.04上Xdebug对PHP5-cli的支持。
cd /etc/php5/cli/conf.d/
须藤rm 20-xdebug.ini
现在在PHP5-cli上不再有Xdebug警告。
sudo phpdismod xdebug
将是首选的暴力破解方法rm