xdebug.mode=off
아니면 Xdebug 확장을 로드하지 않고 CLI 프로세스를 다시 시작하세요.
원래 작곡가/작곡가의 일부로 작성되었으나 이제는 추출되어 독립 실행형 라이브러리로 제공됩니다.
레거시 PHP 버전에 대한 지원을 제거하고 유형 선언을 추가했습니다.
버전 2(PHP 5.3.2 - 7.2.4)에 대한 장기 지원은 Composer 2.2 LTS 정책을 따릅니다.
다음을 사용하여 최신 버전을 설치하십시오.
$ composer require composer/xdebug-handler
use Composer XdebugHandler XdebugHandler ;
$ xdebug = new XdebugHandler ( ' myapp ' );
$ xdebug -> check ();
unset( $ xdebug );
생성자는 두 개의 서로 다른 환경 변수를 생성하기 위해 대문자로 표시되고 기본 기본 값 앞에 추가되는 단일 매개 변수인 $envPrefix
사용합니다. 위의 예에서는 다음을 사용할 수 있습니다.
MYAPP_ALLOW_XDEBUG=1
자동 재시작을 무시하고 Xdebug를 허용합니다.MYAPP_ORIGINAL_INIS
다시 시작된 프로세스에서 ini 파일 위치를 얻습니다. 임시 ini 파일은 로드된(및 스캔된) ini 파일에서 생성되며 Xdebug 확장에 대한 참조는 주석 처리되어 있습니다. 현재 ini 설정이 병합되어 명령줄이나 응용 프로그램에서 수행한 대부분의 ini 설정이 포함됩니다(제한 사항 참조).
MYAPP_ALLOW_XDEBUG
는 다시 시작 시 플래그를 지정하고 사용하기 위한 내부 데이터로 설정됩니다.MYAPP_ALLOW_XDEBUG
설정되지 않았습니다.자세한 내용은 예제를 참조하세요.
pcntl 확장이 로드되면 비동기 신호 처리가 자동으로 활성화됩니다. SIGINT
는 상위 프로세스에서 SIG_IGN
으로 설정되고 다시 시작된 프로세스에서 SIG_DFL
로 복원됩니다(다른 핸들러가 설정되지 않은 경우).
Windows의 PHP 7.4부터 CTRL+C
및 CTRL+BREAK
처리는 다시 시작된 프로세스에서 자동으로 활성화되고 상위 프로세스에서는 무시됩니다.
다시 시작된 프로세스 내에서 실행할 때 주의해야 할 몇 가지 사항이 있습니다.
이러한 정적 메서드는 다시 시작되었는지 여부에 관계없이 현재 프로세스의 정보를 제공합니다.
원래 ini 파일 위치의 배열을 반환합니다. 다시 시작된 프로세스에서 잘못된 값을 보고하는 php_ini_loaded_file
및 php_ini_scanned_files
호출하는 대신 이를 사용하십시오.
use Composer XdebugHandler XdebugHandler ;
$ files = XdebugHandler:: getAllIniFiles ();
# $ files [ 0 ] always exists , it could be an empty string
$ loadedIni = array_shift ( $ files );
$ scannedInis = $ files ;
이러한 위치는 MYAPP_ORIGINAL_INIS
환경 변수에서도 사용할 수 있습니다. 이는 php_ini_loaded_file
에서 반환된 위치(비어 있을 수 있음)와 php_ini_scanned_files
호출에서 구문 분석된 위치로 구성된 경로로 구분된 문자열입니다.
PHP 하위 프로세스와 함께 사용할 수 있는 설정 배열을 반환하거나 프로세스가 다시 시작되지 않은 경우 null을 반환합니다.
use Composer XdebugHandler XdebugHandler ;
$ settings = XdebugHandler:: getRestartSettings ();
/**
* $ settings : array ( if the current process was restarted ,
* or called with the settings from a previous restart ) , or null
*
* ' tmp Ini ' = > the temporary ini file used in the restart ( string )
* ' scanned Inis ' = > if there were any scanned inis ( bool )
* ' scan Dir ' = > the original PHP _ INI _ SCAN _ DIR value ( false |string )
* ' phprc ' = > the original PHPRC value ( false |string )
* ' inis ' = > the original inis from get AllIniFiles ( array )
* ' skipped ' = > the skipped version from get SkippedVersion ( string )
*/
다시 시작하여 건너뛴 Xdebug 버전 문자열을 반환하거나, 다시 시작하지 않은 경우 빈 문자열을 반환합니다(또는 Xdebug 제거 이외의 이유로 다시 시작하는 확장 클래스로 인해 Xdebug가 여전히 로드됨).
use Composer XdebugHandler XdebugHandler ;
$ version = XdebugHandler:: getSkippedVersion ();
# $version : ' 3.1 . 1 ' ( for example ) , or an empty string
Xdebug가 로드되고 활성 모드에서 실행 중인 경우(모드를 지원하는 경우) true를 반환합니다. Xdebug가 로드되지 않았거나 xdebug.mode=off
로 실행 중인 경우 false를 반환합니다.
이러한 메소드는 유창한 인터페이스를 구현하며 기본 check()
메소드보다 먼저 호출되어야 합니다.
외부 PSR3 로거에 대한 상태 메시지 출력을 활성화합니다. 모든 메시지는 DEBUG
또는 WARNING
로그 수준으로 보고됩니다. 예를 들어(레벨과 메시지 표시):
// No restart
DEBUG Checking MYAPP_ALLOW_XDEBUG
DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=off
DEBUG No restart (APP_ALLOW_XDEBUG=0) Allowed by xdebug.mode
// Restart overridden
DEBUG Checking MYAPP_ALLOW_XDEBUG
DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=coverage,debug,develop
DEBUG No restart (MYAPP_ALLOW_XDEBUG=1)
// Failed restart
DEBUG Checking MYAPP_ALLOW_XDEBUG
DEBUG The Xdebug extension is loaded (3.1.0)
WARNING No restart (Unable to create temp ini file at: ...)
상태 메시지는 XDEBUG_HANDLER_DEBUG
사용하여 출력될 수도 있습니다. 문제 해결을 참조하세요.
다시 시작할 때 실행할 기본 스크립트의 위치를 설정합니다. 이는 좀 더 난해한 사용 사례나 argv[0]
위치에 액세스할 수 없는 경우에만 필요합니다. 스크립트 이름 --
표준 입력에 지원됩니다.
Xdebug가 하위 프로세스에 로드되지 않도록 영구 설정을 사용하여 다시 시작을 구성합니다.
애플리케이션이 하나 이상의 PHP 하위 프로세스를 호출하고 Xdebug 확장이 필요하지 않은 경우 이 방법을 사용하십시오. 이는 특정 하위 프로세스 전략을 구현하는 데 따른 오버헤드를 방지합니다.
또는 이 방법을 사용하여 하위 프로세스에 Xdebug가 필요한 경우 변경할 수 있는 기본 Xdebug 없는 환경을 설정한 다음 나중에 복원할 수 있습니다.
function SubProcessWithXdebug ()
{
$ phpConfig = new Composer XdebugHandler PhpConfig ();
# Set the environment to the original configuration
$ phpConfig -> useOriginal ();
# run the process with Xdebug loaded
. . .
# Restore Xdebug - free environment
$ phpConfig -> usePersistent ();
}
라이브러리는 표준 또는 영구 설정을 사용하여 Xdebug를 로드하지 않고 새로운 PHP 프로세스를 호출하는 두 가지 전략을 제공합니다. 이는 애플리케이션이 PHP 하위 프로세스를 호출하는 경우에만 중요합니다.
명령줄 옵션을 사용하여 새 프로세스에서만 Xdebug를 제거합니다.
새 프로세스가 PHP 하위 프로세스를 호출하는 경우 Xdebug는 해당 하위 프로세스에 로드됩니다(xdebug-handler를 구현하지 않는 한, 이 경우 다시 시작됩니다).
이는 다시 시작할 때 사용되는 기본 전략입니다.
환경 변수를 사용하여 새 프로세스에서 Xdebug를 제거하고 이러한 설정을 모든 하위 프로세스에 유지합니다.
PHP_INI_SCAN_DIR
빈 문자열로 설정됩니다. 이는 PHP가 추가 inis를 검색하지 않도록 지시합니다.PHPRC
임시 ini로 설정됩니다.새 프로세스가 PHP 하위 프로세스를 호출하면 Xdebug는 해당 하위 프로세스에 로드되지 않습니다.
이 전략은 setPercious()를 호출하여 다시 시작할 때 사용할 수 있습니다.
PhpConfig
도우미 클래스를 사용하면 다시 시작 여부에 관계없이 (Xdebug 로드 여부에 관계없이) PHP 하위 프로세스를 쉽게 호출할 수 있습니다.
각 메소드는 명령줄에 추가하기 위한 PHP 옵션 배열을 반환하고 필요한 전략에 대한 환경을 설정합니다. getRestartSettings() 메서드는 내부적으로 사용됩니다.
useOriginal()
- Xdebug가 새 프로세스에 로드됩니다.useStandard()
- Xdebug는 새 프로세스에 로드되지 않습니다 . 표준 설정을 참조하세요.userPersistent()
- Xdebug가 새 프로세스에 로드되지 않습니다 . 영구 설정을 참조하세요.다시 시작하지 않은 경우 빈 옵션 배열이 반환되고 환경은 변경되지 않습니다.
use Composer XdebugHandler PhpConfig ;
$ config = new PhpConfig ;
$ options = $ config -> useOriginal ();
# $options : empty array
# environment : PHPRC and PHP _ INI _ SCAN _ DIR set to original values
$ options = $ config -> useStandard ();
# $options : [ - n , - c , tmp Ini ]
# environment : PHPRC and PHP _ INI _ SCAN _ DIR set to original values
$ options = $ config -> usePersistent ();
# $options : empty array
# environment : PHPRC = tmpIni , PHP_INI_SCAN_DIR = ''
다음 환경 설정을 사용하여 예기치 않은 동작 문제를 해결할 수 있습니다.
XDEBUG_HANDLER_DEBUG=1
PSR3 로거와 관계없이 정의된 경우 STDERR
에 상태 메시지를 출력합니다. 각 메시지에는 xdebug-handler[pid]
접두사가 붙습니다. 여기서 pid는 프로세스 식별자입니다.
XDEBUG_HANDLER_DEBUG=2
위와 같지만 추가로 임시 ini 파일을 저장하고 상태 메시지에 해당 위치를 보고합니다.
API는 @internal이라는 주석이 붙지 않은 클래스와 액세스 가능한 요소로 정의됩니다. 기본 클래스에는 추가 기능을 제공하기 위해 재정의할 수 있는 두 가지 보호 메서드가 있습니다.
기본적으로 Xdebug가 로드되고 xdebug.mode=off
로 실행되지 않으면 프로세스가 다시 시작됩니다. 이 메서드를 확장하면 애플리케이션이 부울(또는 동등한) 값을 반환하여 결정할 수 있습니다. MYAPP_ALLOW_XDEBUG
비어 있는 경우에만 호출되므로 다시 시작된 프로세스(이 변수에 내부 데이터가 포함되어 있음)에서 호출되지 않거나 다시 시작이 재정의된 경우에는 호출되지 않습니다.
필요한 경우 여기서 setMainScript() 및 setPerpersist() 설정자를 사용할 수 있습니다.
애플리케이션은 이를 확장하여 tmpIni
속성에 지정된 위치인 임시 ini 파일을 수정할 수 있습니다. PHP_EOL
로 끝나는 데이터 끝에 새로운 설정을 안전하게 추가할 수 있습니다.
$command
매개변수는 새 프로세스에 사용될 이스케이프되지 않은 명령줄 인수의 배열입니다.
parent::restart($command)
로 마무리하는 것을 잊지 마세요.
이 예에서는 기본 기능을 확장하는 두 가지 방법을 보여줍니다.
새 프로세스를 가동하는 오버헤드를 피하기 위해 간단한 도움말 명령이 요청되면 다시 시작을 건너뜁니다.
애플리케이션에는 phar 파일에 대한 쓰기 액세스가 필요하므로 phar.readonly
설정된 경우(Xdebug 로드 여부에 관계없이) 강제로 다시 시작하고 임시 ini 파일에서 이 값을 변경합니다.
use Composer XdebugHandler XdebugHandler ;
use MyApp Command ;
class MyRestarter extends XdebugHandler
{
private $ required ;
protected function requiresRestart ( bool $ default ): bool
{
if (Command:: isHelp ()) {
# No need to disable Xdebug for this
return false ;
}
$ this -> required = ( bool ) ini_get ( ' phar.readonly ' );
return $ this -> required || $ default ;
}
protected function restart ( array $ command ): void
{
if ( $ this -> required ) {
# Add required ini setting to tmp Ini
$ content = file_get_contents ( $ this -> tmpIni );
$ content .= ' phar.readonly=0 ' . PHP_EOL ;
file_put_contents ( $ this -> tmpIni , $ content );
}
parent :: restart ( $ command );
}
}
testsApp
디렉토리에는 다양한 시나리오에서의 내부 작동을 보여주는 명령줄 스크립트가 포함되어 있습니다. 기능 테스트 스크립트를 참조하세요.
작곡가/xdebug-handler는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.