یوشا

دست نوشته ها و تجربیات شخصی

یوشا

دست نوشته ها و تجربیات شخصی

شهید دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم آنکس که تخصص ندارد و کاری را می پذیرد بی تقواست!

طبقه بندی موضوعی
تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران

اکستنشن 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 یا خاموش شدن وب سرور یکی از راه های زیر رو انجام بدید:

  1. مقدار تنظیم opcache.mmap_base در فایل php.ini رو 0x20000000 قرار بدید.
  2. یا کش روی فایل رو فعال کنید: (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 رو کاهش بدید.

۰۳/۱۲/۰۵

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">