افزایش سرعت php با فعالسازی اکستنشن کش OpCache

image post

افزایش سرعت php با فعالسازی اکستنشن کش OpCache

با فعالسازی اکستنشن کش OpCache در فایل php.ini، میتونید سرعت بارگذاری فایلهای PHP رو افزایش بدید.
این اکستنشن با یکبار ذخیره OpCode تولید شده اسکریپت های PHP در حافظه shared memory از تفسیر و تولید مجدد OpCode جلوگیری میکنه، و همیشه همون OpCode ذخیره شده رو مصرف میکنه. در نتیجه اسکریپت با سرعت بیشتری پردازش میشه.
ویندوز

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.validate_timestamps=0

لینوکس

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.validate_timestamps=0

ین اکستنشن داخل پکیج PHP 5.5 و جدیدتر موجوده اما برای PHP 5.4 و قدیمی تر باید دانلودش کنید:
http://windows.php.net/downloads/pecl/releases/opcache/7.0.3/
https://pecl.php.net/package/ZendOpcache
 نکته: از اکستنشن OpCache بهتره فقط در محیط production (سرور واقعی) استفاده بشه، و نه در محیط development/برنامه نویسی.
 توجه: درصورتی که از اکستنشن xdebug استفاده می کنید، اکستنشن opcache باید قبل از اکستنشن xdebug قرار بگیره.
 توجه 2: اگر از دیگر سیستمهای کش مثل APC, XCache, Eaccelerator استفاده می کنید، باید برای همیشه اونها رو غیر فعال کنید!
 توجه 3: اگر از وبسرور IIS استفاده می کنید بهتره از اکستنشن WinCache استفاده کنید و نه OpCache.


 تفاوت دستور DIR با دستور getcwd() در این هست که دستور DIR به دایرکتوری فایل درحال اجرا اشاره میکنه اما دستور getcwd() به دایرکتوری شروع کل اسکریپت درحال اجرا اشاره میکنه.
نکته: دستور DIR برابر دستور dirname(FILE) هستش.

 dirname(__FILE__) ==  __DIR__ 

نها تفاوت بین دستور set_time_limit() و ini_set('max_execution_time', 60) در این هست که set_time_limit هنگام مشکل خطا برمیگردونه اما max_execution_time فقط FALSE برمیگردونه.
نکته: در وضعیت safe mode این دستورات عمل نمی کنن.


 با نصب و فعالسازی اکستنشن xDebug میتونید امکان remote debugging، آنالیز کد و code profiling رو در PHP فراهم کنید. برای اینکار:
 ابتدا پکیج اکستنشن xDebug متناسب با PHP تون رو دانلود کنید.
 توجه: هنگام دانلود اکستنشن xDebug دقت کنید که نسخه و معماری هماهنگ با PHP تون دانلود کنید! (نسخه 5.6 یا 7 با معماری 64bit یا 32bit)
 سپس فایل اکستنشن DLL یا SO دانلود شده رو داخل دایرکتوری ext پی اچ پی تون بریزید و تنظیمات زیر رو در آخرین خط فایل php.ini تون کپی کنید:

zend_extension = "C:/PHP/ext/php_xdebug.dll"
xdebug.default_enable = 1
xdebug.force_display_errors = 1
xdebug.force_error_reporting = 1

جای مسیر بالا در zend_extension، مسیر سیستم خودتون که اکستنشن xDebug داخلش قرار داره رو بنویسید.
 توجه: در صورتی که از اکستنشن OpCache استفاده می کنید، باید اکستنشن xDebug بعد از اکستنشن OpCache لود و فعال بشه.
 توجه 2: اکستنشن xDebug با دیگر اکستنشن هایی مثل Zend Optimizer, DBG, APD سازگار نیست و نباید در کنار هم نصب و فعال باشن!
 نکته: اگر از این اکستنشن در PHP 5.3 به قبل استفاده می کنید، درصورت ThreadSafe بودن PHP باید واژه zend_extension رو به zend_extension_ts تغییر بدید.
 نکته 2: ویندوز: برای استفاده از این اکستنشن در PHP 5 نیاز به نصب پکیج VC++ Runtime 2012 دارید اما در PHP 7 نیاز به نصب پکیج VC++ Runtime 2015 دارید.


 نکته جزیی: وظیفه نوشتن کدهای تست برای Unit Testing بعهده فرد برنامه نویس هستش نه فرد Tester! زیرا:
- بدلیل حفظ مالیکت کدها/پروژه، Tester نباید به سورس پروژه دسترسی داشته باشه.
- بدلیل مسایل امنیتی و کاهش تهدیدها، Tester نباید به داخل کدها و مکانیزم سیستم دسترسی داشته باشه.
- همچنین Tester قادر نیست به همه ابزارها، سبکها و زبانهای مختلفی که در پروژه استفاده شده مسلط بشه و test case طراحی کنه.
- تنها برنامه نویس هستش به کدهایی که پیاده سازی کرده مسلطه و test case رو در کمترین زمان با بالاترین کیفیت تولید میکنه.


 مفهوم Loose Coupling و Tight Coupling
- مفهوم Loose Coupling یعنی عدم وجود وابستگی در دسته ای از کلاس متصل به هم. یعنی اتصالات مستقل. یعنی افزایش flexibility و re-usability کد. یعنی استقلال در حین وابستگی. یعنی استقلال در روابط بین کلاس ها.
- مفهوم Tight Coupling یعنی وجود وابستگی سخت/تودرتو در دسته ای از کلاس. یعنی اتصالات به هم وابسته. یعنی کاهش flexibility و re-usability کد. یعنی وابستگی در روابط بین کلاسها.

دنیس ریچی : یونیکس بسیار ساده هست، تنها یک نابغه باید باشید تا بتوانید سادگی آن را درک کنید.