Mulai ulang proses CLI tanpa memuat ekstensi Xdebug, kecuali xdebug.mode=off
.
Awalnya ditulis sebagai bagian dari komposer/komposer, sekarang diekstraksi dan tersedia sebagai perpustakaan yang berdiri sendiri.
Menghapus dukungan untuk versi PHP lama dan menambahkan deklarasi tipe.
Dukungan jangka panjang untuk versi 2 (PHP 5.3.2 - 7.2.4) mengikuti kebijakan Komposer 2.2 LTS.
Instal versi terbaru dengan:
$ composer require composer/xdebug-handler
use Composer XdebugHandler XdebugHandler ;
$ xdebug = new XdebugHandler ( ' myapp ' );
$ xdebug -> check ();
unset( $ xdebug );
Konstruktor mengambil satu parameter, $envPrefix
, yang menggunakan huruf besar dan ditambahkan ke nilai dasar default untuk membuat dua variabel lingkungan yang berbeda. Contoh di atas memungkinkan penggunaan:
MYAPP_ALLOW_XDEBUG=1
untuk mengesampingkan restart otomatis dan mengizinkan XdebugMYAPP_ORIGINAL_INIS
untuk mendapatkan lokasi file ini dalam proses yang dimulai ulang File ini sementara dibuat dari file ini yang dimuat (dan dipindai), dengan referensi apa pun ke ekstensi Xdebug dikomentari. Pengaturan ini saat ini digabungkan, sehingga sebagian besar pengaturan ini yang dibuat pada baris perintah atau oleh aplikasi disertakan (lihat Batasan)
MYAPP_ALLOW_XDEBUG
diatur dengan data internal untuk ditandai dan digunakan saat restart.MYAPP_ALLOW_XDEBUG
tidak disetel.Lihat Contoh untuk informasi lebih lanjut.
Penanganan sinyal asinkron secara otomatis diaktifkan jika ekstensi pcntl dimuat. SIGINT
disetel ke SIG_IGN
dalam proses induk dan dikembalikan ke SIG_DFL
dalam proses yang dimulai ulang (jika tidak ada penangan lain yang disetel).
Mulai PHP 7.4 di Windows, penanganan CTRL+C
dan CTRL+BREAK
secara otomatis diaktifkan dalam proses yang dimulai ulang dan diabaikan dalam proses induk.
Ada beberapa hal yang perlu diperhatikan saat menjalankan proses yang dimulai ulang.
Metode statis ini memberikan informasi dari proses saat ini, terlepas dari apakah proses tersebut telah dimulai ulang atau belum.
Mengembalikan array lokasi file ini asli. Gunakan ini alih-alih memanggil php_ini_loaded_file
dan php_ini_scanned_files
, yang akan melaporkan nilai yang salah dalam proses yang dimulai ulang.
use Composer XdebugHandler XdebugHandler ;
$ files = XdebugHandler:: getAllIniFiles ();
# $ files [ 0 ] always exists , it could be an empty string
$ loadedIni = array_shift ( $ files );
$ scannedInis = $ files ;
Lokasi ini juga tersedia di variabel lingkungan MYAPP_ORIGINAL_INIS
. Ini adalah string yang dipisahkan jalur yang terdiri dari lokasi yang dikembalikan dari php_ini_loaded_file
, yang bisa kosong, diikuti dengan lokasi yang diurai dari pemanggilan php_ini_scanned_files
.
Mengembalikan array pengaturan yang dapat digunakan dengan sub-proses PHP, atau null jika proses tidak dimulai ulang.
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 )
*/
Mengembalikan string versi Xdebug yang dilewati saat restart, atau string kosong jika tidak ada restart (atau Xdebug masih dimuat, mungkin oleh kelas perluasan yang memulai ulang karena alasan selain menghapus Xdebug).
use Composer XdebugHandler XdebugHandler ;
$ version = XdebugHandler:: getSkippedVersion ();
# $version : ' 3.1 . 1 ' ( for example ) , or an empty string
Mengembalikan nilai benar jika Xdebug dimuat dan berjalan dalam mode aktif (jika mendukung mode). Mengembalikan false jika Xdebug tidak dimuat, atau dijalankan dengan xdebug.mode=off
.
Metode ini mengimplementasikan antarmuka yang lancar dan harus dipanggil sebelum metode check()
utama.
Mengaktifkan output pesan status ke logger PSR3 eksternal. Semua pesan dilaporkan dengan level log DEBUG
atau WARNING
. Misalnya (menampilkan level dan pesan):
// 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: ...)
Pesan status juga dapat dikeluarkan dengan XDEBUG_HANDLER_DEBUG
. Lihat Pemecahan Masalah.
Menetapkan lokasi skrip utama untuk dijalankan saat restart. Ini hanya diperlukan dalam kasus penggunaan yang lebih esoteris, atau jika lokasi argv[0]
tidak dapat diakses. Nama skrip --
didukung untuk input standar.
Mengonfigurasi restart menggunakan pengaturan persisten, sehingga Xdebug tidak dimuat di sub-proses apa pun.
Gunakan metode ini jika aplikasi Anda memanggil satu atau lebih sub-proses PHP dan ekstensi Xdebug tidak diperlukan. Hal ini menghindari overhead penerapan strategi sub-proses tertentu.
Sebagai alternatif, metode ini dapat digunakan untuk menyiapkan lingkungan default bebas Xdebug yang dapat diubah jika sub-proses memerlukan Xdebug, kemudian dipulihkan setelahnya:
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 ();
}
Pustaka menawarkan dua strategi untuk menjalankan proses PHP baru tanpa memuat Xdebug, menggunakan pengaturan standar atau persisten . Perhatikan bahwa ini hanya penting jika aplikasi memanggil sub-proses PHP.
Menggunakan opsi baris perintah untuk menghapus Xdebug dari proses baru saja.
Jika proses baru memanggil sub-proses PHP, Xdebug akan dimuat dalam sub-proses tersebut (kecuali jika proses tersebut mengimplementasikan xdebug-handler, dalam hal ini akan ada restart lagi).
Ini adalah strategi default yang digunakan saat restart.
Menggunakan variabel lingkungan untuk menghapus Xdebug dari proses baru dan mempertahankan pengaturan ini ke sub-proses apa pun.
PHP_INI_SCAN_DIR
disetel ke string kosong. Ini memberitahu PHP untuk tidak memindai inis tambahan.PHPRC
diatur ke ini sementara.Jika proses baru memanggil subproses PHP, Xdebug tidak akan dimuat di subproses tersebut.
Strategi ini dapat digunakan saat restart dengan memanggil setPersistent().
Kelas pembantu PhpConfig
memudahkan untuk memanggil sub-proses PHP (dengan atau tanpa memuat Xdebug), terlepas dari apakah telah terjadi restart.
Masing-masing metodenya mengembalikan serangkaian opsi PHP (untuk ditambahkan ke baris perintah) dan menyiapkan lingkungan untuk strategi yang diperlukan. Metode getRestartSettings() digunakan secara internal.
useOriginal()
- Xdebug akan dimuat dalam proses baru.useStandard()
- Xdebug tidak akan dimuat dalam proses baru - lihat pengaturan standar.userPersistent()
- Xdebug tidak akan dimuat dalam proses baru - lihat pengaturan persistenJika tidak ada restart, array opsi kosong dikembalikan dan lingkungan tidak diubah.
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 = ''
Pengaturan lingkungan berikut dapat digunakan untuk memecahkan masalah perilaku yang tidak terduga:
XDEBUG_HANDLER_DEBUG=1
Mengeluarkan pesan status ke STDERR
, jika ditentukan, terlepas dari logger PSR3 mana pun. Setiap pesan diawali dengan xdebug-handler[pid]
, dengan pid sebagai pengidentifikasi proses.
XDEBUG_HANDLER_DEBUG=2
Seperti di atas, tetapi juga menyimpan file ini sementara dan melaporkan lokasinya dalam pesan status.
API ditentukan oleh kelas dan elemennya yang dapat diakses yang tidak dianotasi sebagai @internal. Kelas utama memiliki dua metode terlindungi yang dapat ditimpa untuk menyediakan fungsionalitas tambahan:
Secara default proses akan dimulai ulang jika Xdebug dimuat dan tidak berjalan dengan xdebug.mode=off
. Memperluas metode ini memungkinkan aplikasi untuk memutuskan, dengan mengembalikan nilai boolean (atau setara). Ini hanya dipanggil jika MYAPP_ALLOW_XDEBUG
kosong, sehingga tidak akan dipanggil dalam proses restart (dimana variabel ini berisi data internal), atau jika restart telah ditimpa.
Perhatikan bahwa setter setMainScript() dan setPersistent() dapat digunakan di sini, jika diperlukan.
Suatu aplikasi dapat memperluas ini untuk memodifikasi file ini sementara, lokasinya diberikan di properti tmpIni
. Pengaturan baru dapat ditambahkan dengan aman ke akhir data, yaitu PHP_EOL
dihentikan.
Parameter $command
adalah array argumen baris perintah yang tidak lolos yang akan digunakan untuk proses baru.
Ingatlah untuk menyelesaikan dengan parent::restart($command)
.
Contoh ini menunjukkan dua cara untuk memperluas fungsionalitas dasar:
Untuk menghindari overhead dalam menjalankan proses baru, restart akan dilewati jika perintah bantuan sederhana diminta.
Aplikasi memerlukan akses tulis ke file phar, sehingga akan memaksa restart jika phar.readonly
disetel (terlepas dari apakah Xdebug dimuat) dan mengubah nilai ini di file ini sementara.
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 );
}
}
Direktori testsApp
berisi skrip baris perintah yang menunjukkan cara kerja internal dalam berbagai skenario. Lihat Skrip Uji Fungsional.
composer/xdebug-handler dilisensikan di bawah Lisensi MIT, lihat file LISENSI untuk detailnya.