xdebug.mode=off
でない限り、Xdebug 拡張機能をロードせずに CLI プロセスを再起動します。
元々はcomposer/composerの一部として書かれていましたが、現在は抽出され、スタンドアロンのライブラリとして利用できるようになりました。
従来の 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
を受け取ります。これは大文字でデフォルトの基本値の前に追加され、2 つの異なる環境変数を作成します。上記の例では、以下の使用が可能になります。
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 がサブプロセスに読み込まれないように、永続的な設定を使用して再起動を構成します。
アプリケーションが 1 つ以上の 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 プロセスを呼び出すための 2 つの戦略を提供します。これは、アプリケーションが PHP サブプロセスを呼び出す場合にのみ重要であることに注意してください。
コマンドライン オプションを使用して、新しいプロセスからのみ Xdebug を削除します。
新しいプロセスが PHP サブプロセスを呼び出す場合、Xdebug はそのサブプロセスにロードされます (xdebug-handler を実装していない限り、その場合は再度再起動が行われます)。
これは、再起動で使用されるデフォルトの戦略です。
環境変数を使用して、新しいプロセスから Xdebug を削除し、これらの設定をサブプロセスに永続化します。
PHP_INI_SCAN_DIR
は空の文字列に設定されます。これは、PHP に追加の inis をスキャンしないように指示します。PHPRC
一時的な ini に設定されます。新しいプロセスが PHP サブプロセスを呼び出す場合、Xdebug はそのサブプロセスにロードされません。
この戦略は、再起動時に setPersistent() を呼び出すことで使用できます。
PhpConfig
ヘルパー クラスを使用すると、再起動の有無に関係なく、PHP サブプロセス (Xdebug のロードの有無に関係なく) を簡単に呼び出すことができます。
その各メソッドは、(コマンドラインに追加する) 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 が定義されている場合はステータス メッセージをSTDERR
に出力します。各メッセージにはxdebug-handler[pid]
プレフィックスが付けられます。ここで、 pid はプロセス識別子です。
XDEBUG_HANDLER_DEBUG=2
上記と同様ですが、追加で一時 ini ファイルを保存し、ステータス メッセージでその場所を報告します。
API は、@internal アノテーションが付けられていないクラスとそのアクセス可能な要素によって定義されます。メイン クラスには、追加機能を提供するためにオーバーライドできる 2 つの保護されたメソッドがあります。
デフォルトでは、Xdebug がロードされ、 xdebug.mode=off
で実行されていない場合、プロセスは再起動されます。このメソッドを拡張すると、アプリケーションはブール値 (または同等の値) を返すことで決定できるようになります。これは、 MYAPP_ALLOW_XDEBUG
が空の場合にのみ呼び出されるため、再起動されたプロセス (この変数に内部データが含まれる場合) または再起動がオーバーライドされた場合には呼び出されません。
必要に応じて、setMainScript() セッターと setPersistent() セッターをここで使用できることに注意してください。
アプリケーションはこれを拡張して、一時 ini ファイル ( tmpIni
プロパティで指定された場所) を変更できます。新しい設定は、 PHP_EOL
で終了するデータの末尾に安全に追加できます。
$command
パラメーターは、新しいプロセスに使用されるエスケープされていないコマンドライン引数の配列です。
忘れずにparent::restart($command)
で終了してください。
この例では、基本機能を拡張する 2 つの方法を示します。
新しいプロセスを起動するオーバーヘッドを回避するために、単純なヘルプ コマンドが要求された場合、再起動はスキップされます。
アプリケーションは 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
ディレクトリには、さまざまなシナリオでの内部動作を示すコマンド ライン スクリプトが含まれています。 「機能テスト スクリプト」を参照してください。
combos/xdebug-handler は MIT ライセンスに基づいてライセンスされています。詳細については、LICENSE ファイルを参照してください。