أعد تشغيل عملية CLI دون تحميل ملحق Xdebug، ما لم يكن xdebug.mode=off
.
تمت كتابته في الأصل كجزء من الملحن/الملحن، وتم الآن استخراجه وإتاحته كمكتبة قائمة بذاتها.
تمت إزالة الدعم لإصدارات 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
لتجاوز إعادة التشغيل التلقائي والسماح بـ XdebugMYAPP_ORIGINAL_INIS
للحصول على مواقع ملفات ini في عملية مُعاد تشغيلها يتم إنشاء ملف ini مؤقت من ملفات ini المحملة (والممسوحة ضوئيًا)، مع التعليق على أي إشارات إلى ملحق Xdebug. يتم دمج إعدادات ini الحالية، بحيث يتم تضمين معظم إعدادات ini التي تم إجراؤها في سطر الأوامر أو بواسطة التطبيق (راجع القيود)
MYAPP_ALLOW_XDEBUG
مع البيانات الداخلية لوضع علامة عليها واستخدامها في إعادة التشغيل.MYAPP_ALLOW_XDEBUG
.انظر الأمثلة لمزيد من المعلومات.
يتم تمكين معالجة الإشارات غير المتزامنة تلقائيًا إذا تم تحميل ملحق pcntl. يتم تعيين SIGINT
على SIG_IGN
في العملية الأصلية ويتم استعادته إلى SIG_DFL
في العملية المعاد تشغيلها (إذا لم يتم تعيين معالج آخر).
بدءًا من PHP 7.4 على نظام التشغيل Windows، يتم تمكين معالجة 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 الفرعية، أو يُرجع قيمة فارغة إذا لم يتم إعادة تشغيل العملية.
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 وتشغيله في الوضع النشط (إذا كان يدعم الأوضاع). يُرجع خطأ إذا لم يتم تحميل Xdebug، أو كان قيد التشغيل مع xdebug.mode=off
.
تطبق هذه الطرق واجهة سلسة ويجب استدعاؤها قبل طريقة 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 ();
}
تقدم المكتبة استراتيجيتين لاستدعاء عملية PHP جديدة دون تحميل Xdebug، وذلك باستخدام الإعدادات القياسية أو المستمرة . لاحظ أن هذا مهم فقط إذا كان التطبيق يستدعي عملية PHP فرعية.
يستخدم خيارات سطر الأوامر لإزالة Xdebug من العملية الجديدة فقط.
إذا كانت العملية الجديدة تستدعي عملية PHP فرعية، فسيتم تحميل Xdebug في تلك العملية الفرعية (ما لم يتم تنفيذ معالج xdebug، وفي هذه الحالة ستكون هناك عملية إعادة تشغيل أخرى).
هذه هي الإستراتيجية الافتراضية المستخدمة في إعادة التشغيل.
يستخدم متغيرات البيئة لإزالة 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
يُخرج رسائل الحالة إلى STDERR
، إذا تم تعريفها، بغض النظر عن أي مسجل PSR3. تكون كل رسالة مسبوقة xdebug-handler[pid]
، حيث pid هو معرف العملية.
XDEBUG_HANDLER_DEBUG=2
كما هو مذكور أعلاه، ولكنه بالإضافة إلى ذلك يحفظ ملف ini المؤقت ويبلغ عن موقعه في رسالة الحالة.
يتم تعريف واجهة برمجة التطبيقات (API) من خلال الفئات وعناصرها التي يمكن الوصول إليها والتي لم يتم شرحها كـ @internal. تحتوي الفئة الرئيسية على طريقتين محميتين يمكن تجاوزهما لتوفير وظائف إضافية:
افتراضيًا، ستتم إعادة تشغيل العملية إذا تم تحميل Xdebug وعدم تشغيله مع xdebug.mode=off
. يتيح توسيع هذه الطريقة للتطبيق اتخاذ القرار من خلال إرجاع قيمة منطقية (أو ما يعادلها). يتم استدعاؤه فقط إذا كان MYAPP_ALLOW_XDEBUG
فارغًا، لذلك لن يتم استدعاؤه في عملية إعادة التشغيل (حيث يحتوي هذا المتغير على بيانات داخلية)، أو إذا تم تجاوز إعادة التشغيل.
لاحظ أنه يمكن استخدام أدوات ضبط setMainScript() وsetPersistent() هنا، إذا لزم الأمر.
يمكن للتطبيق توسيع هذا لتعديل ملف ini المؤقت، وموقعه محدد في خاصية tmpIni
. يمكن إلحاق الإعدادات الجديدة بأمان بنهاية البيانات، والتي يتم إنهاؤها بواسطة 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، راجع ملف الترخيص للحصول على التفاصيل.