PHP 8 دارای ویژگی ها و تغییرات جدیدی است تا بتواند بهترین عملکرد را برای پروژه های وب شما فراهم کند. از آنجایی که این یک بروز رسانی اساسی است، به تمام کاربران پیشنهاد می گردد که به نسخه PHP جدید مهاجرت کنند تا با تغییرات جدیدی که در این مقاله ارائه شده است آشنا شوند.
چرا به PHP 8 نیاز دارید؟
آخرین نتایج، از تست های انجام شده توسط Phoronix نشان می دهد که php 8 ده درصد عملکرد بهتری نسبت به نسخه های قبلی دارد و این آمار آینده امیدوار کننده ای را برای وبسایت ها و برنامه هایی که مبتنی بر php نوشته شده اند نشان می دهد.
تصویر(1)
با این حال، این آزمایش هنوز با کامپایلر JIT که یک ویژگی جدید بهینه سازی با PHP 8 است انجام نشده است و در صورتی که موفق باشد، توسعه دهندگان می توانند انتظار عملکرد سریعتری از PHP 8 داشته باشند.
همچنین این نسخه ویژگی های جدید بسیاری را بکار میگیرد تا کدنویسی را سریع و تمیز انجام داده و فراوانی کد های اضافی را کاهش دهد. از آنجا که این بروز رسانی در نسخه PHP است، ممکن است وب سایت شما دچار تغییراتی شود و این تغییرات منجر به بروز اختلال یا خطا در سایت شما گردد. برای مهاجرت به نسخه جدید پیشنهاد می شود که ابتدا با ویژگی های PHP 8 در این مقاله آشنا شوید.
برخی از موارد جدید در PHP 8
در ورژن جدید php تغییرات بسیاری در کیفیت ایجاد شده و ویژگی های کاملا جدید بسیاری افزوده شده است که در این مقاله به برخی از آنها پرداخته شده است:
- (Just-in-Time) JIT کامپایلر
کامپایلر JIT یکی از جذاب ترین بروز رسانی ها در PHP 8 است. هدف این ویژگی کار با opcache برای بهبود عملکرد در اجرای اسکریپت است.
JIT چیست ؟
JIT یک تکنیک است که کد های نرم افزار را در زمان اجرا، کامپایل یا جمع آوری می کند. برای فهمیدن این مسئله و اینکه چگونه کار می کند، باید کمی با مراحل اجرای اسکریپت های PHP آشنا باشید:
- Lexical analysis : این مرحله جایی است که Zend Engine، مفسر PHP، کد را به نشانه های قابل خواندن توسط ماشین ترجمه می کند.
- Compilation : مفسر گره های AST را به opcode تبدیل می کند که یک دستورالعمل قابل خواندن برای ماشین است و به ماشین مجازی (Zend (VM می گوید چه عملیاتی را باید انجام دهد.
- Execution : مفسر opcode را به Zend VM تحویل می دهد، که opcode را برای اجرا در کد ماشین کامپایل می کند.
این فرایند مقدار قابل توجهی از منابع سرور را استفاده می کند، به خصوص اگر اسکریپت PHP درخواست های تکراری دریافت کند. به همین دلیل PHP 5.5 پسوند opcache را معرفی کرد که کد رمز را از مرحله تدوین ذخیره می کند. هنگامی که سرور درخواست جدیدی برای اجرای یک اسکریپت تکراری دریافت می کند، مفسر می تواند بلافاصله opcode را از opcache اجرا کند. به این ترتیب، دیگر نیازی به شروع مجدد فرآیند اجرا نیست. PHP 7.4 چندین سال بعد یک ویژگی پیش بارگیری را اضافه کرد تا اسکریپت های پیش کامپایل opcache را در هنگام راه اندازی در opcode داشته باشد. در نتیجه، هنگامی که سرور برای اولین بار درخواست اسکریپت را دریافت می کند، مفسر می تواند بلافاصله کد رمز را برای اجرا تحویل دهد.
با وجود این مزایا، نکات منفی دیگری نیز وجود دارد. باید در نظر داشت تا پایان روند پردازش، Zend VM هنوز قبل از اجرا نیاز به تبدیل opcode به کد ماشین دارد که می تواند زمان و منابع قابل توجهی را به خود اختصاص دهد. این همان جایی است که کامپایلر JIT وارد می شود، JIT در اولین اجرای خود opcode را در کد ماشین کامپایل می کند تا برای اجرای بعدی آماده شود.
هنگامی که درخواستی برای یک اسکریپت کامپایل شده توسط JIT ارسال می شود، PHP آن را مستقیماً به جای Zend VM توسط CPU اجرا می کند و در نتیجه عملکرد سریع تری دارد. مراحل اجرای اسکریپت و مقایسه نسخه های قبلی با PHP 8 به شرح زیر است:
تصویر(2)
به صورت کلی دو موتور تلفیقی برای JIT وجود دارد:
Function یا تابع
این روش بدون شناسایی اینکه کدام قسمتها فراخوانی شده است، یک تابع کامل را شناسایی و کامپایل می کند.
Tracing یا ردیابی
در Tracing engine ، فقط قسمت هایی که بیشتر در تابع استفاده شده است را تجزیه و تحلیل و کامپایل می کند تا باعث صرفه جویی در وقت و حافظه شود. این مورد، موتور پیش فرض در PHP 8 است.
JIT چه مزیتی دارد ؟
طبق گزارشات RFC، فعال کردن JIT مهمترین راه برای بهبود عملکرد PHP است. بنابراین، حذف این ویژگی ممکن است منجر به از دست دادن یک مزیت عمده شود. خوشبختانه آزمایشات اخیر نشان می دهد به صورت کلی اگر از Tracing engine استفاده می کنید کامپایلر JIT می تواند روند اجرای اسکریپت را بهبود ببخشد.
معیارهای ترکیبی PHP پس از فعال کردن Tracing mode، سه برابر افزایش سرعت را نشان می دهند و در برنامه های طولانی مدت، می توانید انتظار دو برابر بهبود عملکرد داشته باشید.
تصویر(3)
برای کاربران و توسعه دهندگان وردپرس، کامپایلر JIT می تواند یک افزایش سرعت جزئی نیز ایجاد کند، ولی ممکن است به اندازه قابل توجهی نباشد. شما باید TTFB را کاهش داده، پایگاه داده را بهینه کنید و تعداد درخواستهای HTTP را کاهش دهید تا بهترین عملکرد را داشته باشید. اگر می خواهید JIT را فعال کنید، از فعال بودن اکستنشن opcache اطمینان حاصل کنید.
برخی از ویژگی های جدید در PHP 8
در زیر برخی از ویژگی های جدید PHP 8 ذکر شده است که می توانید مطالعه کنید:
- ویرگول ها در لیست پارامترها. می توانید به جای فرم استاندارد و افقی، پارامترها را در قالب عمودی لیست کنید.
- ()str_contains. این تابع بررسی می کند که آیا یک زیر رشته در رشته اصلی وجود دارد یا خیر؟ بسته به درست یا غلط بودن شرط، مقدار بولین را برمی گرداند. ممکن است آن را به عنوان جایگزین خواناتری برای ()str_pos در نظر بگیرید.
- ()str_starts_with. این تابع بررسی می کند که آیا یک رشته با زیر رشته مشخصی شروع می شود یا خیر.
- ()str_ends_with. این تابع مشخص خواهد کرد که آیا یک رشته با یک زیر رشته مشخص پایان می یابد یا خیر.
- ()fdiv. در PHP 8 تقسیم بر صفر انجام می شود و به جای خطا، INF ، -INF یا NAN را برمی گرداند.
- ()get_debug_type. این تابع مشابه ()Gettype است، اگرچه نام ذاتی و نام کلاس را برمی گرداند. جدول مرجع زیر تفاوت این دو را نشان می دهد.
تصویر(4)
- ()get_resource_id. این تابع یک جایگزین مطمئن برای int) $resource) است. شناسه یک منبع خارجی مانند اتصال پایگاه داده را واکشی می کند.
- ()PhpToken::tokenize. این روش جایگزین تابع ()token_get_all خواهد شد. به جای بازگرداندن رشته ها یا آرایه هایی از مقادیر، آرایه ای از اشیا (objects) را برمی گرداند لذا اسکریپت بدست آمده کارایی بیشتری داشته و مصرف کمتری از حافظه خواهد داشت.
برخی ویژگی های منسوخ شده در PHP 8
- تابع ()enchant_broker_set_dict_path
- تابع ()enchant_broker_set_dict_path
- تابع ()enchant_broker_get_dict_path
- تابع ()enchant_dict_add_to_personal
- تابع ()enchant_dict_is_in_session
- تابع ()enchant_broker_free
- تابع ()enchant_broker_free_dict
- تابع ()libxml_disable_entity_loader
- تابع ()ReflectionFunction::isDisabled
- تابع ()ReflectionParameter::getClass
- تابع ()ReflectionParameter::isArray
- تابع ()ReflectionParameter::isCallable
برای اطلاعات بیشتر در مورد ویژگی های منسوخ شده، این منبع را بررسی کنید.
تغییرات ناسازگار برای بازگشت به نسخه های قبل در PHP 8
انتقال به PHP 8 تغییرات زیادی را ایجاد می کند که با نسخه های قدیمی PHP سازگار نیست. برخی از آنها عبارتند از:
- مقایسه رشته با عدد. مقایسه اعداد با رشته های غیر عددی که اکنون نادرست (false) برمی گردد.
به تصویر زیر توجه نمایید:
تصویر(5)
- امکان استفاده از فضای خالی در نامگذاری namespace وجود ندارد. به عنوان مثال، نام هایی مانند "Foo \ bar" قابل قبول نیستند و می توانید به جای آن از "Foo\bar" استفاده کنید.
- حذف پرچم های FILTER_FLAG_SCHEME_REQUIRED و FILTER_FLAG_HOST_REQUIRED. زیرا FILTER_VALIDATE_URL وقتی با تابع filter_var ترکیب شود از این پرچم به صورت پیش فرض استفاده می کند.
- E_ALL اکنون سطح پیشفرض گزارش خطا می باشد. در PHP 8 اخطارها (notices) ها و توابع منقضی (deprecated) در پیام های خطا وجود خواهند داشت.
می توانید برای دیدن سایر تغییرات ناسازگار بازگشت به عقب در PHP 8 ، مستندات رسمی را مطالعه نمایید.
وردپرس و PHP 8
وردپرس نسخه 5.6 به بالا با PHP 8 سازگار است. تیم توسعه دهنده وردپرس بسیاری از ویژگی های منسوخ شده را برای سازگاری بیشتر با PHP 8 حذف کرده است. با این وجود آنها نمی توانند ادعای سازگاری کامل نسخه های جدید وردپرس با PHP 8 را داشته باشند زیرا ممکن است بسیاری از پلاگین ها و قالب ها هنوز به صورت کامل از PHP 8 پشتیبانی نکنند.
اگر میخواهید نسخه PHP سایت خود را ارتقا دهید، ابتدا اطمینان حاصل کنید که هنگام ارتقا به نسخه بالاتر مشکلی در عملکرد سایت تان نخواهید داشت. در غیر اینصورت اگر با یک توسعه دهنده حرفه ای وب کار می کنید می توانید در این مورد از ایشان کمک بگیرید. اگر شما خودتان توسعه دهنده افزونه یا قالب هستید، وردپرس توصیه می کند که اسکریپت خود را با نسخه جدید PHP تطبیق دهید. به این ترتیب کاربران افزونه یا قالب شما در صورت ارتقا نسخه PHP در وبسایت خود دچار مشکل نخواهند شد.
در این مقاله تغییرات عمده ای که ممکن است توسعه دهندگان وردپرس با آن روبرو شوند بیان شده است. با این وجود توصیه می شود که مستندات وردپرس را مطالعه کنید تا بدانید که به کدام بخش ها باید توجه ویژه تری داشته باشید. به یاد داشته باشید که اگر مشکلات و ناسازگاری های زیادی وجود دارد می توانید نسخه PHP خود را به 7.4 تغییر دهید.
نتیجه گیری
PHP 8 تغییرات و بهبودهای هیجان انگیزی را برای توسعه دهندگان ایجاد کرده است. از کامپایلر JIT گرفته تا WeakMap، که انتظار می رود با این تغییرات کارایی وب سایت ها افزایش یافته و تجربه کد نویسی با PHP بهبود یابد. پیشنهاد می شود مستندات و RFC را به صورت کامل بررسی نمایید تا اطمینان حاصل کنید که پروژه شما با جدید ترین نسخه PHP سازگاری کامل دارد.