تغییرات جدید نسخه 8 زبان PHP چیست؟ (قسمت دوم)

What's New in PHP 8? - Part 2

09 مرداد 1399
تغییرات جدید نسخه ی 8 زبان PHP چیست؟ (قسمت دوم)

در قسمت اول از مجموعه مقالات بررسی تغییرات نسخه 8 زبان PHP با تعاریف opcode و machine code آشنا شدیم و چهار مرحله اصلی اجرای هر اسکریپت PHP را بررسی کردیم که شامل Lexing/Tokenizing و Parsing و Compilation و Interpretation می ‌شوند. همچنین برایتان توضیح دادم که زبان برنامه نویسی PHP یک زبان تفسیری (interpreted language) می ‌باشد و این مسئله بدین معنی است که هر اسکریپت در هر درخواست دوباره کامپایل می ‌شود که باعث هدر رفتن و درگیر شدن بیهوده CPU سرور ما می ‌شود. برای جلوگیری از این موضوع از نسخه 5.5 زبان PHP قابلیتی به نام OPcache به این زبان اضافه شده است که باعث می ‌شود اسکریپت شما فقط در دفعه اول کامپایل شود و کدهای کامپایل شده در مموری ذخیره شوند تا در زمان نیاز بدون کامپایل شدن اجرا شوند.

سوال: چطور بفهمیم که OPcache برای ما فعال است؟

پاسخ: بستگی به محیط کاری شما دارد. اگر از وبسایت ‌های میزبانی (hosting) استفاده می‌ کنید باید به مشخصات سرورها نگاه کنید. شرکت ‌های میزبانی معتبر معمولا مشخص می‌کنند که OPcache فعال است یا خیر (معمولا به صورت پیش ‌فرض و بدون هزینه اضافی فعال است) اما اگر چیزی پیدا نکردید با ایجاد تیکت در پشتیبانی از آن‌ ها سوال کنید. اگر سرورهای خودتان را دارید یا سروری اختصاصی را به صورت کامل اجاره کرده ‌اید باید از تابع ()phpinfo یا فایل php.ini استفاده کنید و به دنبال اطلاعات Opcode Caching باشید.

نمایش opcache در موتور zend
نمایش opcache در موتور zend

همچنین تمام اطلاعات و پیکربندی‌ های مربوط به OPcache در وبسایت رسمی PHP موجود است.

اگر یادتان باشد در جلسه قبل بحث از سه مبحث اصلی بود:

  • افزونه OPcache چیست؟
  • preloading چیست؟
  • درک بهتر JIT

تا اینجای کار OPcache را بررسی کرده‌ایم و حالا باید با preloading آشنا شویم.

Preloading چیست؟

preloading یکی از قابلیت ‌های جدید در OPcache است که در نسخه 7.4 از زبان PHP ارائه شده است، بنابراین یک ویژگی نسبتا جدید محسوب می ‌شود (RFC در سال 2018 ایجاد شده است). این قابلیت به شما اجازه می دهد که قبل از اجرا شدن کدهای برنامه، چند اسکریپت خاص و دستچین شده توسط خودتان را وارد مموری OPcache کنید اما معمولا برای وبسایت‌های عادی آنچنان تغییری را حاصل نمی‌کند.

ایده preloading توسعه ایده OPcache است. زبان PHP از انواع و اقسام سیستم‌های کش برای opcode های خود استفاده می‌کند که OPcache یکی از آن‌ها است (مثال های دیگر عبارت اند از: APC و MMCache) اما این سیستم های caching، مشکل هدر رفتن منابع را به صورت 100 در 100 حل نمی کنند. چرا؟ فرض کنید درخواستی را به یک برنامه ارسال کرده ایم که چند اسکریپت دارد. برای استفاده از OPcache باید فایل مورد نظر را که در مموری کش شده است از خود مموری دریافت کنیم و به اسکریپتی بدهیم که به عنوان وابستگی از آن استفاده می‌کند. علاوه بر این باید بررسی کنیم که آیا فایل تغییر کرده است یا خیر؟ آیا نیاز به کامپایل کردن دوباره کدها داریم؟ همچنین باید قسمتی از کلاس ها یا توابع را از مموری اشتراکی (shared memory - محل ذخیره OPcache) دریافت کرده و به processing memory (مموری در حال پردازش) بدهیم. همچنین OPcache قابلیت تشخیص وابستگی ها (dependency) را ندارد بنابراین در هر درخواست باید وابستگی کلاس ها به هم یا فایل ها به هم را دوباره تشخیص داده و آن‌ها را به هم لینک کنیم. تمام این فرآیند ها نیاز به منابع و زمان دارد بنابراین با اینکه OPcache کمک بسیار بزرگی است، اما هنوز جای پیشرفت دارد.

اینجاست که preloading وارد کار می‌شود و به ما اجازه می دهد منابع اصلی (مانند فریم ورک یا library ها) را در زمان راه اندازی سرور، قبل از اجرای هر کد دیگری و به صورت کش شده در مموری قرار بدهیم. با این کار زیرساخت برنامه ما همیشه کش شده است و سرعت اجرای برنامه بالاتر می رود.

JIT قدم بعدی در OPcache

با اینکه opcode ها کدهایی میانی و سطح پایین (low-level) هستند (یعنی به زبان کامپیوتر یا machine code نزدیک تر هستند و تبدیل آن‌ ها به machine code زمان کمتری می برد) هنوز هم برای اجرا باید به machine code تبدیل شوند بنابراین هنوز هم یک میانجی داریم که باید کامپایل شود و طبیعتا این فرآیند زمان خواهد برد. تکنولوژی JIT به جای اینکه یک میانجی دیگر (معمولا به این میانجی ها Intermediate Representation می گوییم) ایجاد کند، با استفاده از DynASM (مخفف Dynamic Assembler for code generation engines) کدهای native را مستقیما از bytecode های PHP تولید می‌کند. به زبان ساده تر JIT کدهای میانی را مستقیما به machine code تبدیل می‌کند و با دور زدن فرآیند compilation می تواند در سرعت و مصرف منابع سرور تاثیر بسزایی بگذارد.

آقای Zeev Surasky (از نویسندگان پروپوزال JIT) در ویدیویی در کانال یوتیوب خود تاثیر JIT در برخی از محاسبات خاص را نشان داده است:

مثالی که در ویدیوی بالا از آقای Zeev Surasky می بینید یک حالت خاص است به همین دلیل برای ما این سوال پیش می آید که آیا JIT در وبسایت های عادی یا وبسایت های وردپرسی نیز موثر خواهد بود؟ در RFC مربوط به JIT گفته شده است که JIT به طور کلی سرعت PHP را بالاتر خواهد برد و تست های اولیه نیز نشان می دهند که JIT در عملیات هایی که نیاز شدیدی به CPU دارند، تاثیر بسزایی دارد. البته RFC این هشدار را به همه داده است که:

like the previous attempts – it currently doesn’t seem to significantly improve real-life apps like WordPress (with opcache.jit=1235 326 req/sec vs 315 req/sec). It’s planned to provide additional effort, improving JIT for real-life apps, using profiling and speculative optimizations.

در واقع در تست های قبلی تفاوت چشم گیری در برنامه هایی مانند وردپرس برای استفاده از JIT نداشتیم (326 درخواست بر ثانیه با JIT و 315 درخواست بر ثانیه بدون JIT) البته در آینده بهینه سازی هایی ارائه خواهد شد تا شاید این تفاوت بیشتر شود.

یعنی زمانی که JIT فعال باشد، کدها به جای اجرا شدن توسط Zend VM، توسط خود CPU اجرا خواهند شد و طبیعتا این مسئله باعث افزایش سرعت محاسبات خواهد شد اما برنامه هایی مانند وردپرس به غیر از پردازش و محاسبات به فاکتورهای دیگری مانند بهینه سازی های پایگاه داده و درخواست های HTTP و غیره نیز وابسته اند. بنابراین JIT باعث ارتقاء شدید سرعت در برنامه شما نمی ‌شود اما هنوز هم مزایای خود را دارد، مانند:

  • ارتقاء شدید سرعت در کدهای عددی
  • بالاتر رفتن سرعت برنامه های عادی PHP (هر چند کم)
  • امکان انتقال کد از زبان C به PHP با توجه به افزایش سرعت

امیدوارم در این جلسه درک خوبی نسبت به JIT به دست آورده باشید. در جلسه آینده، ویژگی های دیگر PHP 8 را بررسی خواهیم کرد.


سایر قسمت‌های این مبحث را در لینک‌های زیر مطالعه کنید:

تغییرات جدید نسخه 8 زبان PHP (قسمت اول)
تغییرات جدید نسخه 8 زبان PHP (قسمت سوم)
تغییرات جدید نسخه 8 زبان PHP (قسمت چهارم)
تغییرات جدید نسخه 8 زبان PHP (قسمت پنجم)
تغییرات جدید نسخه 8 زبان PHP (قسمت ششم)

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.