التحميل المسبق في PHP 7.4

تم إعداد ترجمة هذه المقالة خاصة لطلاب دورة تطوير Backend PHP .



يضيف PHP 7.4 التحميل المسبق ، وهي ميزة يمكنها تحسين أداء الكود بشكل ملحوظ.

على التحميل المسبق باختصار.

  • لتحميل الملفات مسبقًا ، يلزمك كتابة نص PHP منفصل.
  • يتم تنفيذ هذا البرنامج النصي مرة واحدة عند بدء تشغيل الخادم.
  • جميع الملفات المحملة مسبقا متوفرة في الذاكرة لجميع الطلبات.
  • لن تعمل التغييرات التي تم إجراؤها على الملف المصدر حتى تقوم بإعادة تشغيل الخادم.

دعنا نتحدث عن الميزة الجديدة بمزيد من التفاصيل.


أكثر من Opcache


نعم ، يعتمد التحميل المسبق على opcache ، لكنه ليس بالضبط نفس الشيء. يأخذ Opcache ملفات مصدر PHP ، ويجمعها في شفرات شفرة ، ثم يحفظ الملفات المترجمة إلى القرص.

يمكن اعتبار الأكواد الشفرة تمثيلًا منخفض المستوى لرمزك يمكن تفسيره بسهولة في وقت التشغيل. وبالتالي ، يتيح لك opcache تخطي مرحلة ترجمة الملفات المصدر إلى ما يحتاجه مترجم PHP بالفعل في وقت التشغيل. وفورات ملحوظة!

ومع ذلك ، يمكنك حفظ أكثر. المترجمة مع ملفات opcash لا يعرفون أي شيء عن الملفات الأخرى. إذا كان لديك الفئة "أ" ، وهي امتداد للفئة "ب" ، فستظل بحاجة إلى الربط في وقت التشغيل. بالإضافة إلى ذلك ، يقوم opcache بالتحقق مما إذا كانت الملفات المصدر قد تغيرت ، وعند اكتشاف التغييرات سوف تبطل مخابئها.

وهنا يأتي التحميل المسبق للإنقاذ: فهو لا يقوم فقط بتجميع الملفات المصدر إلى رموز شفرة ، ولكنه يربط أيضًا بين الفئات والسمات والواجهات التابعة. يقوم بتخزين جزء "مترجم" من التعليمات البرمجية القابلة للتنفيذ (أي ، رمز يمكن لمترجم PHP استخدامه) في الذاكرة.

عند وصول طلب إلى الخادم ، يمكنه استخدام أجزاء من قاعدة الشفرة التي تم تحميلها بالفعل في الذاكرة ، دون أي وقت إضافي.

ما هي "أجزاء من قاعدة الكود" التي نتحدث عنها؟


ممارسة التحميل المسبق


للتحميل المسبق الصحيح ، يجب على المطور إخبار الخادم بالملفات التي يجب تنزيلها. يتم ذلك باستخدام برنامج نصي PHP بسيط ، لذلك لا يوجد شيء للخوف.

لا شيء معقد.

  • يمكنك تقديم برنامج نصي للتحميل المسبق وربطه في ملف php.ini الخاص بك باستخدام opcache.preload .
  • يجب تمرير كل ملف PHP الذي تريد opcache_compile_file() إلى opcache_compile_file() من البرنامج النصي للتحميل.

دعنا نقول أنك تريد تحميل نوع من الإطار مسبقًا. فليكن لارافيل. في هذه الحالة ، يجب أن ينظر البرنامج النصي في جميع ملفات PHP في دليل vendor/laravel وإضافتها واحدة في وقت واحد.

إليك كيفية تضمين هذا البرنامج النصي في php.ini:

 opcache.preload=/path/to/project/preload.php 


وهنا مثال على التنفيذ:

 $files = /*  ,      */; foreach ($files as $file) { opcache_compile_file($file); } 

بدلاً من opcache_compile_file يمكنك استخدام include . ومع ذلك ، يبدو أنه كان هناك خطأ هنا ، لأنه في وقت كتابة هذا التقرير لم يعمل الخيار الثاني.

تحذير من أنه لا يمكنك التحميل المسبق لفئة غير مرتبطة


هناك تحذير لا يمكن التحميل المسبق فئة غير مرتبطة ؟ الحقيقة هي أنه قبل تحميل الملفات مسبقًا ، تحتاج أيضًا إلى تحميل الكائنات التابعة لها مسبقًا - الواجهات والسمات وفئات الأصل.

إذا واجهت أي مشاكل مع التبعيات الصفية ، فسيتم تحذيرك من ذلك عند بدء تشغيل الخادم:

 Can't preload unlinked class Illuminate\Database\Query\JoinClause: Unknown parent Illuminate\Database\Query\Builder 

لاحظ أن opcache_compile_file() إلا إلى opcache_compile_file() الملف ، لكنه لن opcache_compile_file() . هذا يعني أنه إذا كان للفصل تبعيات لم يتم تحميلها مسبقًا ، فلا يمكن تحميل الفصل نفسه.

هذا ليس بالغ الأهمية: سيعمل الخادم كالمعتاد ، ولكن لن يكون لديك جميع الملفات التي تريد تحميلها مسبقًا تحت تصرفك.

هذا هو السبب في أنك تحتاج إلى تحديد الملفات بعناية للتحميل المسبق لتجنب مشاكل التبعية. يعد القيام بذلك يدويًا مهمة شاقة وتستغرق وقتًا طويلاً ، لذلك يعمل المطورون بالفعل على حلول تلقائية.

دعم الملحن


يتم إعداد الحل الآلي الواعد من قِبل مطوري الملحنين ، والذي يتم استخدامه بالفعل في معظم مشاريع PHP الحديثة.

الآن يعمل الرجال على القدرة على تكوين التحميل المسبق في composer.json ، والتي بدورها ستنشئ ملف التحميل المسبق بدلاً من أنت. مثل التحميل المسبق ، هذه الميزة لا تزال قيد التطوير. يمكنك متابعة تطور الأحداث هنا .
لحسن الحظ ، ليس عليك تكوين ملفات التحميل المسبق يدويًا إذا كنت لا تريد ذلك - يستطيع الملحن القيام بذلك نيابة عنك.

متطلبات الخادم


هناك نقطتان مهمتان أخريان يجب على المطور وضعهما في الاعتبار عند استخدام التحميل المسبق.

أنت تعلم بالفعل أنك بحاجة إلى إنشاء إدخال في php.ini حتى يعمل التحميل المسبق. هذا يعني أنه إذا كنت تستخدم استضافة مشتركة ، فلن تكون قادرًا على تكوين PHP كما تريد.

في الممارسة العملية ، ستحتاج إلى خادم مخصص (افتراضي) لتحسين الملفات المحملة مسبقًا لمشروع واحد. ضع هذا في الاعتبار.

تذكر أيضًا أنك ستحتاج إلى إعادة تشغيل الخادم (إذا كنت تستخدم php-fpm ، فهذا يكفي) في كل مرة تريد فيها إعادة تحميل الملفات في الذاكرة. بالنسبة لمعظم الناس ، هذا واضح ، لكن لن يكون من الضروري تذكره.

إنتاجية


الآن بالنسبة للسؤال الأكثر أهمية: هل يؤدي التحميل المسبق بالفعل إلى تحسين الأداء؟

بالطبع! شارك بن موريل نتائج الاختبارات المقارنة ، والتي يمكن العثور عليها في نفس الموضوع على الملحن ، والتي أشرنا إليها أعلاه.

وكذلك ، هذا مثير للاهتمام. إذا كنت ترغب في ذلك ، يمكنك التحميل المسبق فقط hot classes - الفئات التي غالبًا ما تستخدم في قاعدة الشفرة الخاصة بك. تُظهر اختبارات Ben Morel أن تحميل حوالي 100 من هذه الفئات يوفر زيادة في الأداء أعلى من تحميل كل شيء دفعة واحدة. في الحالة الأولى ، تزيد الإنتاجية بنسبة 17٪ ، في الحالة الثانية - بنسبة 13٪.

بالطبع ، يعتمد اختيار الفئات للتحميل المسبق على المشروع المحدد. من الحكمة أن تبدأ بمجرد التحميل المسبق قدر الإمكان. إذا كانت هذه الاختلافات القليلة في الأداء مهمة جدًا بالنسبة لك ، فسيتعين عليك التحكم في الكود في وقت التشغيل.

بالطبع ، يمكن أتمتة جميع هذه العمليات ، ومن المرجح أن يتم ذلك في المستقبل.

من المهم الآن إضافة دعم ما قبل التحميل إلى composer ، مما يلغي الحاجة لإنشاء ملفات له بنفسك. من السهل جدًا تكوين هذه الميزة على الخادم ، بشرط أن تكون تحت تصرفك الكامل.



هل ستستخدم التحميل المسبق في الإصدار الجديد من PHP 7.4؟ أي أفكار أو تعليقات؟ البريد الإلكتروني لي على تويتر أو البريد الإلكتروني .

تقليديًا ، نحن في انتظار تعليقاتك ومزاياك إذا وجدت المقال مثيرًا للاهتمام :-)

Source: https://habr.com/ru/post/ar463117/


All Articles