اکستنشن OpCache
OpCache اکستنشنی در PHP هست که برای بهبود پرفورمنس و سرعت پردازش فایلهای PHP ایجاد شده.
این اکستنشن با ذخیره کردن OpCode تولید شده فایلهای PHP در قسمت shared memory حافظه، از بارگذاری و تفسیر مجدد اسکریپت ها در هر درخواست جلوگیری میکنه. و همیشه همون OpCode ذخیره شده رو مصرف میکنه. در نتیجه اسکریپت با سرعت بیشتری پردازش میشه.
در حال حاضر سریعترین، کاملترین و قوی ترین سیستم cache برای PHP اکستنشن opcache هستش که هم optimization و هم caching رو فراهم میکنه.
فهرست مندرجات:
- الزامات و نیازمندیها
- فعالسازی
- نکات
- تنظیم محیط گرافیکی
- رفع مشکلات
- الزامات و نیازمندیها
این اکستنشن بصورت پیشفرض داخل پکیج PHP 5.5 و جدیدتر موجوده اما برای PHP 5.4 و قدیمی تر باید دانلودش کنید:
http://windows.php.net/downloads/pecl/releases/opcache/7.0.3/
https://pecl.php.net/package/ZendOpcache
توجه: اگر از وبسرور IIS استفاده می کنید بهتره از اکستنشن WinCache استفاده کنید و نه OpCache. و دلیل اصلی آن بهینهسازی و پایداری بهتر WinCache برای پلتفرم Windows و IIS هستش.
- فعالسازی
; ویندوز
zend_extension=php_opcache.dll
opcache.enable=1
opcache.cli_enable=1
opcache.memory_consumption=128 # MB
opcache.max_accelerated_files=10000 # maximum = 100000
opcache.max_wasted_percentage=10
opcache.use_cwd=1
opcache.validate_timestamps=0
opcache.error_log = "C:/ProgramData/php/logs/opcache.txt"
; لینوکس
zend_extension=php_opcache.so
opcache.enable=1
opcache.cli_enable=1
opcache.memory_consumption=128 # MB
opcache.max_accelerated_files=10000 # maximum = 100000
opcache.max_wasted_percentage=10
opcache.use_cwd=1
opcache.validate_timestamps=0
opcache.error_log = "/var/log/php/opcache.txt"
پس از انجام تنظیمات، نرم افزار وبسرور رو Restart کنید تا تغییرات اعمال بشن.
نکته: درصورتی که از اکستنشن xdebug استفاده می کنید، اکستنشن opcache باید قبل از اکستنشن xdebug قرار بگیره و load بشه.
توجه: اگر از دیگر سیستمهای کش مثل APC, XCache, Eaccelerator استفاده می کنید، باید برای همیشه اونها رو غیرفعال کنید.
- نکات
- از اکستنشن OpCache بهتره فقط در محیط production(سرور واقعی) استفاده بشه، و نه در محیط development/توسعه.
- اگر تنظیم opcache.validate_timestamps فعال و به تنظیم opcache.revalidate_freq هم مقدار داده بشه، درصورت تغییر فایلهای PHP تون، سیستم OpCache اونهارو تازه (invalidate) قلمداد میکنه و کش قدیمی مربوط به اون فایلهای تغییر یافته رو در قسمت shared memory حافظه(shm)، کهنه علامت گذاری میکنه. اما متاسفانه سیستم OpCache کشهای کهنه(invalid) رو از حافظه shared memory تخلیه نمیکنه و فقط اونهارو wasted(تلف شده) علامت گذاری میکنه! و تنها زمانی که سیستم OpCache ریستارت بشه به میزان تنظیم opcache.memory_consumption حافظه shared memory تخلیه میشه، اون هم به 3 شرط:
تجاوز از مقدار opcache.max_accelerated_files || مقدار opcache.memory_consumption && رسیدن به مقدار opcache.max_wasted_percentage. (به || && دقت کنید)
هنگامی که کش wasted در حافظه به بیش از حد مجاز(opcache.max_wasted_percentage) برسه، OpCache خودکار ریستارت میشه، حافظه shared memory قفل میشه، segment کامل تخلیه میشه و نهایتاً قفل باز میشه. در این حالت وب سرور بکمک پروسس PHP بشدت مشغول تولید OpCode و cache کردن میشه تا حدی که پرفورمنس سرور افت میکنه یا حتی لحظاتی از دسترس خارج میشه و گاهاً cache slam رو بوجود میاره!
بنابراین باید طوری OpCache رو تنظیم کنید و فایلهای PHP رو تغییر بدید که هرگز ظرفیت shared memory تون پر نشه... (مثلاً هنگام آپدیت کدها وب سرور رو خاموش کنید، از تابع opcache_reset()
استفاده کنید یا کدهارو باهم و یکجا آپدیت کنید و...)
نکته: عمل allocation فضای کش در shared memory هنگامی انجام میشه که موتور PHP شروع به کار میکنه، پس اکستنشن OpCache سریعاً به میزان تنظیم opcache.memory_consumption فضایی رو در قسمت shared memory سیستم عامل رزرو میکنه(به مگابایت).
- درصورتی که از annotation در نرم افزارهایی مثل Doctrine, Zend Framework 2 یا PHP Unit استفاده می کنید باید مقدار تنظیم opcache.load_comments و opcache.save_comments در فایل php.ini رو 1 کنید.
- مقدار تنظیم opcache.max_wasted_percentage در فایل php.ini تعیین کننده حداکثر درصد کش/داده waste شده در حافظه shared memory از کل مقدار opcache.memory_consumption هستش که هنگام رسیدن به اون درصد، سیستم OpCache رو برای تخلیه حافظه ریستارت کنه.
- برای تنظیم بهتر مقدار تنظیم opcache.memory_consumption در فایل php.ini (برای استفاده شخصی) میتونید دستور opcache_get_status(TRUE)
رو در آخرین فایل سورس پروژه تون اجرا و نسبت به خروجی(memory_consumption
) داده شده تنظیمش کنید...
نکته: این مقدار در سرور واقعی باید روی چند گیگابایت تنظیم بشه.
توجه: درصورتی که از code generator یا سیستم کش مبتنی بر فایل PHP استفاده می کنید(مثل Symfony, Doctrine Annotations یا FLOW3) باید بیش از مقدار مورد نظرتون opcache.memory_consumption رو تنظیم کنید.
- درصورت خالی گذاشتن مقدار opcache.preferred_memory_model در فایل php.ini، موتور PHP مدل مموری mmap رو برای map کردن opcache در shared memory انتخاب میکنه.
- همیشه در محیط production مقدار تنظیم opcache.validate_timestamps در فایل php.ini رو 0 قرار بدید.
توجه: درصورت تغییر فایلهای PHP در سرور(محیط production) باید وبسرور رو ریستارت کنید تا تغییرات اعمال بشن.
- همیشه در محیط development مقدار تنظیم opcache.revalidate_freq در فایل php.ini رو 0 قرار بدید. تا opcache در هر درخواست/request، کش سورسهای شمارو update کنه و تغییرات جدید رو اعمال کنه. (این تنظیم درواقع زمان expire شدن cache رو مشخص میکنه)
توجه: با غیرفعال کردن تنظیم opcache.validate_timestamps در فایل php.ini، مقدار تنظیم opcache.revalidate_freq هم نادیده گرفته خواهد شد.
- تنظیم محیط گرافیکی
برای تنظیم محیط گرافیکی نظارت بر OPcache میتونید از اسکریپتهای آماده استفاده کنید. توسط اسکریپت OpCacheGUI و opcache-gui میتونید آمار و گزارش وضعیت OpCache سیستم رو بصورت بصری/گرافیکی مشاهده کنید.
https://github.com/PeeHaa/OpCacheGUI
https://github.com/amnuts/opcache-gui
https://github.com/rlerdorf/opcache-status
توجه: جهت امنیت سرور، توصیه میشه دسترسی به این ابزار رو محدود کنید، مثلاً با تنظیم محدودیتهای IP یا اضافه کردن رمز عبور به مسیر URL مربوطه.
- رفع مشکلات
- ویندوز: درصورت استفاده از سیستم کش OpCache و بروز خطای 500 internal error یا Base address marks unusable memory region یا خاموش شدن وب سرور یکی از راه های زیر رو انجام بدید:
- مقدار تنظیم
opcache.mmap_base
در فایل php.ini رو 0x20000000 قرار بدید. - یا کش روی فایل رو فعال کنید: (PHP 7 به بعد)
opcache.file_cache="C:\Windows\temp\php_opcache"
opcache.file_cache_fallback=1
- برای رفع مشکل Fatal Error Unable to create file mapping با OpCache باید مقدار تنظیم opcache.memory_consumption در فایل php.ini رو کاهش بدید.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.