composer를 실행할 때 xdebug 비활성화


98

실행할 때 composer diagnose다음 오류가 발생합니다.

xdebug 확장이로드되면 Composer가 약간 느려질 수 있습니다. Composer를 사용할 때 비활성화하는 것이 좋습니다.

Composer를 실행할 때만 xdebug를 비활성화하려면 어떻게해야합니까?

답변:


81

업데이트 : 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 $@

3
이것은 IMHO라는 문제에 대한 가장 우아한 해결책입니다. 감사합니다 Joyce!
Thomas Hansen

2
베스트. 스크립트. Ever
Maciej Paprocki

1
후자는 키워드 (Ubuntu 14.04 LTS)를 좋아하지 않았기 때문에 bin/bash대신 셔방을로 조정해야했습니다 . /bin/shfunction
ashnazg dec

호환성 향상을 위해 코드를 업데이트하고 function 키워드를 제거했습니다.
조이스 바부

1
당신은 당신이 실행하여 최신 버전을 실행하고 있는지 확인할 수 있습니다composer self-update
조이스 바부을

77

이 명령은 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

4
두 개의 별칭 alias xdebug-on='sudo php5enmod -s cli xdebug'및을 추가 alias xdebug-off='sudo php5dismod -s cli xdebug'했으므로 이제 xdebug를 쉽게 활성화 xdebug-on및 비활성화 할 수 xdebug-off있습니다.
Daniel Mecke

휴대용이 아닙니다. 아마도 Linux 전용 일 것입니다.
Diti

Laravel Homestead box (Ubuntu / Debian)에서 잘 작동합니다. 작동 방식에 대한 자세한 설명 : laracasts.com/discuss/channels/forge/disable-xdebug
Justin

2
감사합니다 :)하지만 우분투 16.04가 있고 누군가 이것을 사용해야 할 경우 sudo phpdismod -s cli xdebug
Angel M.

우분투의 php7은 어떻습니까? 심볼릭 링크 만 제거하면됩니까? /etc/php/7.0/cli/conf.d
gastonnina

40

대상 스크립트에 따라 다른 구성을로드 할 수 있도록 PHP를 구성하는 옵션이 없다고 생각합니다. 최소한 .ini 파일을 복제하지 않고서는 안됩니다 ...

그러나 php로 composer를 실행할 때 이러한 옵션을 추가 할 수 있습니다.

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

-nPHP는 모든 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 스크립트로 바꾸거나 별칭을 구성 할 수 있는지 살펴 보겠습니다.
greg0ire

그러나이 화이트리스트 접근 방식의 문제점은 사람들이 composer.json"ext-ldap": "*"에서 요구하는 사항에 따라 또는 단순히 설치 후 작업을 제대로 실행하는 데 필요한 사항에 따라 화이트리스트가 커질 수 있다는 것입니다. ... 단지 확장을 블랙리스트하는 방법 ...이 있다면
greg0ire

1
나는의 출력과 뭔가를하려고합니다php -m
greg0ire

내 생각에 떠오르지 만 개발 환경에서 xdebug를 사용한다고 가정합니다. 작곡가가 너무 느려서이 조정이 필요합니까?
Gui-Don

오, 아니, 난 그냥 출력에서 이것을보고 diagnose, 내가 짓고 있어요 이후 개발 고정 표시기 용기를 내 팀을 위해, 최소 속도 향상은 그들 모두에게 이익을 얻을 수
greg0ire

14

별칭을 만들면 해당 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"

3
이것은 설치 후 또는 업데이트 후 스크립트에 확장 기능 중 하나가 필요한 즉시 잘 작동하지 않습니다. 간단한 프로젝트에서는 좋은 솔루션이 될 수 있습니다.
greg0ire

1
-n옵션은 Phar확장 기능 을 비활성화 하므로 실행에 실패 할 수 있습니다composer.phar
brzuchal

1
이것은 나를 위해 일했습니다. 또한 충돌을 피하기 위해 메모리 제한을 비활성화했습니다.alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Alexander Kachkaev 2016 년

이 솔루션은 내 상황에 대해 매우 간단하고 실행 가능합니다. @AlexanderKachkaev의 메모리 제한 제안은 필수입니다. 답을 잘 수정하십시오.
Henry

12

나는 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"

큰! 나는 우분투 14.04-15.10이 기반으로하는 범용 스크립트를 생성 gist.github.com/perk11/816c4e64023ea26976cf
콘스탄틴 Pereiaslov

환상적이며 brew가 설치된 php 7.1에서 Mac OS에서 잘 작동합니다. 타이!
Antonio Carlos Ribeiro

7

모든 프로젝트에는 다른 PHP 버전이 있으므로 일반적으로 프로젝트별로 셸 스크립트를 만듭니다. 그것은 년의 /bin/옆에 디렉토리 composer.pharcomposer.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


XDebug를 비활성화했기 때문에 COMPOSER_DISABLE_XDEBUG_WARN=1경고가 표시되면 스크 릿이 작동하지 않는다는 의미입니다. xdebug.remote_autostart원격 디버깅이 비활성화 된 경우 정의 는 쓸모가 없어 보입니다.
greg0ire

에 대해 맞습니다 xdebug.remote_autostart. 스크립트 효과에 대해 : Composer는 xdebug 확장이로드되었는지 확인합니다. 실제로 여기에서 코드를 살펴보고 있는지 확인합니다 . ini 옵션은 "일반"PHP 스크립트에서 잘 작동하지만 다시 한 번 성능 테스트를 수행하지 않았습니다.
Joost

(마지막으로)이 문제 해결 에 대한 composer 매뉴얼에서 관련 부분을 찾았습니다 : xdebug impact on composer . ini 플래그를 통해 모든 xdebug 옵션을 비활성화하는 것은 성능 문제를 완화하기에 충분하지 않다고 설명합니다. 그래서 내 스크립트가 작동하지 않습니다. 안 됐네요!
Joost

(Mac OS X에서) 약간의 타이밍 작업을했고 스크립트를 사용한 성능 향상에 매우 만족한다고 말해야합니다! xdebug 옵션을 활성화 하면 1m33 이 걸리고 옵션이 비활성화 되면 0m19 가 걸립니다 . xdebug 확장이 없으면 0m10 이 걸립니다 .
Joost

어쨌든 개선이 있습니다. 아니 가장 적합한 개선,하지만 (OS X에 적어도) 그럼에도 불구하고 거대한 개선
greg0ire

6

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에는 전역 PHP 설치를 위해 Xdebug를 비활성화 할 수있는 Xdebug On Demand 모드가 도입되었으며, PhpStorm은 스크립트를 디버깅 할 때 또는 코드 검사 보고서가 필요할 때 필요한 경우에만 활성화합니다.

링크 된 기사에 설명 된대로 XDebug 경로를 포함하도록 PHP 인터프리터 환경 설정을 편집해야합니다.

나에게 이것은 내가 IDE에있는 동안 보통 XDebug만을 원하기 때문에 완벽한 해결책처럼 보인다.

그러나 XDebug는 "오프라인"일 때 다른 잠재적 인 용도 (예 : 오류 로그의 확장 스택 덤프)를 사용합니다. 이는 전역 적으로 끄면 손실됩니다. 물론 프로덕션에서 XDebug를 활성화해서는 안되므로 베타 테스트 또는 개발중인 자동 테스트 CLI 스크립트와 같은 사용 사례로 제한됩니다.


5

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 모듈을로드해야하는 것에 대해 걱정할 필요가 없습니다.


ini 파일을 복사하는 대신 심볼릭 링크를 사용합니다.
greg0ire

1
새로운 모듈은 'noxdebug'폴더에 자동으로 포함되지 않는 반면, 폴더가 동기화되어 있다는 인상을주기 때문에 심볼릭 링크 사용을 피했습니다.
KHobbits

4

Windows 기반 Composer 설치 프로그램에 대한 솔루션을 찾았습니다. 모든 Composer 설치에서 작동해야합니다. 기본적으로로드 된 INI 파일의 복사본을 만들고 xdebug zend 확장을 주석 처리 한 다음 composer를 실행할 때 해당 구성 파일을로드합니다. .

이 변경 사항을 통합하고 싶은지 확인하기 위해 문제를 열었습니다.

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

내 지침과 코드를 찾을 수 있습니다.


간단하고 효과적입니다. :) 자동 업데이트를 통해 작곡가 업데이트 후 다시 적용해야하나요?
marcovtwout

4

Joyce의 답변 에서 언급했듯이 문제는 더 이상 최신 버전의 Composer에 존재하지 않습니다.

작곡가 문서는 업데이트되어 이주의 . Composer로 xdebug를 활성화하는 방법을 자세히 설명합니다 (필요한 경우).

자동 업데이트 를 사용하여 Composer 버전을 업데이트 할 수 있습니다. .

내 Mac에서는 다음을 수행해야했습니다. sudo php /opt/local/bin/composer self-update

Homebrew PHP 설치의 맥락에서 이에 대한 자세한 내용은 이 문제 에서 찾을 수 있습니다 .


훌륭합니다! 이 변화에 대한 PR이 어디에 있는지 알고 있습니까? 나는 다른 CLI 응용 프로그램에 필요
토마스 Votruba에게

3

PHP 구성의 직접 조작

Homebrew를 기반으로 한 내 기여는 다음과 같습니다. 은 Mac OS X에 설치 한 PHP 설치를 입니다.

에서 실행 파일로 저장되도록 설계된 셸 스크립트 래퍼이며 /usr/local/bin/composerComposer 바이너리는 /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에서 오류를 처리하는 방법에 차이가 있을지 잘 모르겠습니다. 구체적인 예나 우려 사항이 있습니까? 스크립트는 문제에 대한 빠른 해결책을위한 것이며 철저한 테스트를 거치지 않았습니다. 내가 그것을 사용하는 동안 아무런 문제없이 작동했다고 말 했음.
j13k

1
내 우려는 스크립트의 마지막 줄이 실행되지 않을 수 있다는 것입니다.
greg0ire

2

대부분의 경우 CLI 모드에서는 xdebug가 필요하지 않습니다. 이것이 허용되는 경우 cli 및 cgi를 다르게 구성 할 수 있습니다.

따라서 php-cli.iniconf-cli.d를 php.ini 파일 종료 근처에 만들면 cli와 cgi를 다르게 구성 할 수 있습니다 (cgi의 경우 php.iniconf.d ). xdebug.ini를 conf-cli.d에 넣지 마십시오.


2

OS X에서 brew를 사용하여 composer를 설치하는 경우 다음 별칭을 사용할 수 있습니다.

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

1

여러 버전의 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

단점 :

  • sudo가 필요합니다 (INI 파일을 chmod하지 않는 한)
  • 중간에 죽이면 INI 파일이 수정됩니다.
  • 향후 PHP 버전이 추가되어야합니다.
  • 다른 PHP 프로세스를 실행하는 동안 영향을받습니다.

우아하지는 않지만 단순합니다.


대신 사용할 수있는 바로 가기가 있다고 생각합니다. $1…$7... 어쩌면 그럴 수도 있고 $@그와 비슷한 것일 수도 있습니다 .
greg0ire

> 중간에 종료하면 INI 파일이 수정되어 종료 신호를 트랩하여> 향후 PHP 버전을 추가해야합니다. 당신은 또한 해결할 수있는 간단한 루프
greg0ire

1

xdebug를 비활성화하고 메모리 오류를 방지하기 위해 composer에 대한 별칭 만들기 :

이 줄을 ~ / .bash_profile에 추가하십시오.

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

새 별칭을 사용할 수 있도록 터미널을 다시 시작하십시오.


-3

다음은 PHP5-cli 버전에서 Xdebug 경고를 제거하는 빠른 솔루션입니다. Ubuntu 14.04에서 PHP5-cli에 대한 Xdebug 지원을 제거했습니다.

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

sudo rm 20-xdebug.ini

이제 PHP5-cli에서 더 이상 Xdebug 경고가 없습니다.


2
sudo phpdismod xdebug짐승의 선호하는 방법이 될 것입니다rm
제프 퍼켓
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.