답변:
업데이트 : 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
composer self-update
이 명령은 CLI 용 PHP5 Xdebug 모듈을 비활성화합니다 (따라서 composer).
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를 쉽게 활성화 xdebug-on
및 비활성화 할 수 xdebug-off
있습니다.
대상 스크립트에 따라 다른 구성을로드 할 수 있도록 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
-n
어제 시도했는데 phar
확장 프로그램 이 없어서 문제가 발생했습니다 . 작동 할 때까지 더 많은 확장 기능을 추가해 보겠습니다. 좋은 해결책이라고 생각합니다. 별칭에 따라 유지 관리하지 않는 zsh 별칭이 이미 있습니다. 바이너리를 bash 스크립트로 바꾸거나 별칭을 구성 할 수 있는지 살펴 보겠습니다.
composer.json
"ext-ldap": "*"에서 요구하는 사항에 따라 또는 단순히 설치 후 작업을 제대로 실행하는 데 필요한 사항에 따라 화이트리스트가 커질 수 있다는 것입니다. ... 단지 확장을 블랙리스트하는 방법 ...이 있다면
php -m
diagnose
, 내가 짓고 있어요 이후 개발 고정 표시기 용기를 내 팀을 위해, 최소 속도 향상은 그들 모두에게 이익을 얻을 수
별칭을 만들면 해당 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에서 꽤 잘 작동하는 대답을 생각 해냈다. 그리고 아마도 "additional 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"
모든 프로젝트에는 다른 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 확장을 비활성화하는 것이 선호되지만 ( 작성기 문제 해결 참조 ) 개인적으로 더 간단한 스크립트를 좋아합니다.
내 컴퓨터의 일부 타이밍 : 2 xdebug 및 ini 활성화로 실행 : 1m33
xdebug로 실행하지만 ini 비활성화 : 0m19
xdebug없이 실행 : 0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
경고가 표시되면 스크 릿이 작동하지 않는다는 의미입니다. xdebug.remote_autostart
원격 디버깅이 비활성화 된 경우 정의 는 쓸모가 없어 보입니다.
xdebug.remote_autostart
. 스크립트 효과에 대해 : Composer는 xdebug 확장이로드되었는지 확인합니다. 실제로 여기에서 코드를 살펴보고 있는지 확인합니다 . ini 옵션은 "일반"PHP 스크립트에서 잘 작동하지만 다시 한 번 성능 테스트를 수행하지 않았습니다.
PHPStorm을 사용하는 경우 최신 릴리스 (2016.2)에는 주문형 CLI 스크립트 용 XDebug를 활성화하는 기능이 포함되어 있습니다. 즉, 개발 컴퓨터에서 XDebug를 전역 적으로 끌 수 있습니다. IDE는 프로젝트 내부의 코드에서 필요할 때 즉시 활성화합니다.
PhpStorm 2016.2에는 전역 PHP 설치를 위해 Xdebug를 비활성화 할 수있는 Xdebug On Demand 모드가 도입되었으며, PhpStorm은 스크립트를 디버깅 할 때 또는 코드 검사 보고서가 필요할 때 필요한 경우에만 활성화합니다.
링크 된 기사에 설명 된대로 XDebug 경로를 포함하도록 PHP 인터프리터 환경 설정을 편집해야합니다.
나에게 이것은 내가 IDE에있는 동안 보통 XDebug만을 원하기 때문에 완벽한 해결책처럼 보인다.
그러나 XDebug는 "오프라인"일 때 다른 잠재적 인 용도 (예 : 오류 로그의 확장 스택 덤프)를 사용합니다. 이는 전역 적으로 끄면 손실됩니다. 물론 프로덕션에서 XDebug를 활성화해서는 안되므로 베타 테스트 또는 개발중인 자동 테스트 CLI 스크립트와 같은 사용 사례로 제한됩니다.
PHP 모듈을 일시적으로 활성화 또는 비활성화하는 데 혼란스럽지 않고 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 모듈을로드해야하는 것에 대해 걱정할 필요가 없습니다.
Windows 기반 Composer 설치 프로그램에 대한 솔루션을 찾았습니다. 모든 Composer 설치에서 작동해야합니다. 기본적으로로드 된 INI 파일의 복사본을 만들고 xdebug zend 확장을 주석 처리 한 다음 composer를 실행할 때 해당 구성 파일을로드합니다. .
이 변경 사항을 통합하고 싶은지 확인하기 위해 문제를 열었습니다.
https://github.com/composer/windows-setup/issues/58
내 지침과 코드를 찾을 수 있습니다.
Joyce의 답변 에서 언급했듯이 문제는 더 이상 최신 버전의 Composer에 존재하지 않습니다.
작곡가 문서는 업데이트되어 이주의 . Composer로 xdebug를 활성화하는 방법을 자세히 설명합니다 (필요한 경우).
자동 업데이트 를 사용하여 Composer 버전을 업데이트 할 수 있습니다. .
내 Mac에서는 다음을 수행해야했습니다. sudo php /opt/local/bin/composer self-update
Homebrew PHP 설치의 맥락에서 이에 대한 자세한 내용은 이 문제 에서 찾을 수 있습니다 .
Homebrew를 기반으로 한 내 기여는 다음과 같습니다. 은 Mac OS X에 설치 한 PHP 설치를 입니다.
에서 실행 파일로 저장되도록 설계된 셸 스크립트 래퍼이며 /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
옵션 뒤에 빈 문자열 인수가 필요하지 않습니다 .
스크립트는 기본 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
그런 다음 다음과 같이 composer 명령을 실행하십시오.
sudo composer-nodebug.sh update
단점 :
우아하지는 않지만 단순합니다.
$1…$7
... 어쩌면 그럴 수도 있고 $@
그와 비슷한 것일 수도 있습니다 .