PDA

View Full Version : آموزش: طریقه استفاده از انواع سیستم های Caching در PHP



محسن شامحمدی
جمعه 11 دی 1394, 13:18 عصر
http://www.w3school.info/wp-content/uploads/2015/12/cached-file-example.jpg


با سلام دوستان
یکی از مباحث مهمی که همکاران برنامه نویس وب این روزا باهاش درگیرن بالا رفتن تعداد Request ها و ارتباط های متعدد با دیتابیسه
بعضی از عزیزان میان اینطوری بررسی می کنن که اگر زبان برنامه نویسی رو از x به y‌تغییر بدیم بهره وری دوبرابر می شه!
بعضی از عزیزان می گن بخاطر زبان نیست.تقصیر دیتابیسه که دیر جواب می ده!
ولی این عزیزان کلیدی ترین نکته رو فراموش می کنن.
صفحه ای که همه سایت های ما دارن و در اکثر مواقع دیتاش کاربر محور نیست و براش فرقی نداره چه کسی با چه تکنولوژی ای میاد داخل
نکته چیه؟
نکته اینه که هر کاربری که این صفحه رو باز می کنه یک درخواست سنگین به زبان برنامه نویسی و همچنین دیتابیس می زنه
راه حل چیه؟
به سادگی.در اولین درخواست اطلاعات رو از بانک بگیر و تجزبه تحلیل ها رو انجام بده و این اطلاعات باارزش قابل استفاده مجدد رو روی رم با فایل ذخیره کن (به مدت x ثانیه یا دقیقه) و توی درخواست های بعدی دیگه نیاز نیست این عملیات سنگین اجرا بشه.به سادگی همون اطلاعات رو حاضر و آماده بدون پردازش و یا کانکت زدن به دیتابیس لود می کنیم.حتی ممکنه کل صفحه html رو هم کش کنیم نه فقط بخشیش!!!!

پس تا اینجا کش ها به دو نوع اصلی Disk Cache,Memory Cache تقسیم می شن
مشخصا اگر رم قابل قبولی دارید و می تونه پاسخگوی کش بشه خب خیلی سریع تره.
کم هم باشه بازم می تونید ترکیبی استفاده کنید

-----------
سوال: اطلاعات صفحه اصلی من عمرش پنج ثانیه ست و بعد از 5 ثانیه باید اطلاعات تازه از دیتابیس خونده باشه.آیا از کش استفاده کنم؟
جواب اینه که شک نکن.اولا که توی سایت پربازدید توی 5 ثانیه چندین بازدید رخ می ده که صرفه جویی در منابعه.

سوال: برای ۱ ثانیه چطور؟
جواب: باز هم با ارزشه.فرض کنید همزمان 1000 درخواست در همون ثانیه به صفحه برسه.اولین درخواست از روی دیتابیس لود می شه و کش می شه و در 999 درخواست دیگه اطلاعات از روی کش خونده می شه! . اینطوری زیر فشار زیاد ابدا سایتتون نمی خوابه.حتی با DOS

-----------
اگر به CACHE علاقمند شدید.پست های بعدی رو دنبال کنید.
لطفا از ایجاد پست های تشکر خودداری کنید.

محسن شامحمدی
جمعه 11 دی 1394, 14:15 عصر
کش ها بر دو نوع Disk Cache,Memory Cache داریم
یک سری کش ها می تونن روی پورت خاصی گوش بدن و از سرورهای دیگه و سایت های دیگه اطلاعات بخونن و بنویسن.(البته با توجه به کندبودن ارتباط با سرور دیگه و بحث هدف اصلی کش فک نمی کنم معقول باشه)

کش های معروف PHP
XCache (https://xcache.lighttpd.net/),APC (http://php.net/manual/en/book.apc.php),Redis (http://redis.io/),Memcached (http://memcached.org/),OPCache (http://stackoverflow.com/questions/17224798/how-to-use-php-opcache),eAccelerator (http://eaccelerator.net/),ionCube (http://www.php-accelerator.co.uk/)


یک سری از کش ها قابلیت ذخیره اطلاعات بصورت کلید/مقدار رو به کاربر می دن
این مقدار می تونه رشته/json/list/array/object و هر چیز دیگه ای باشه

یک سری از کش ها هم در واقع کامپایلر php هستن.
php یک زبان مفسری هستش که در زمان اجرا بصورت خط به خط تبدیل به زبان های لایه پایین تر تبدیل می شه و در آخر اجرا می شه
قابلیتی که Asp.net داره ازش بهره می بره.واقعیت اینه که سرعت اجرای کد لایه پایین نسبت به زبان سطح بالا خیلی سریع تر اجرا می شه.چون عملیات کمتری داره تا رسیدن به زبان ماشین
این کش ها در واقع اسکریپت php شما رو تبدیل به زبان لایه پایین می کنن و مادامیکه که فایل رو تغییر ندید.به جای اینکه فایل php رو خط به خط اجرا کنه.از فایل تبدیل شده به لایه پایین اجرا می کنه.


یک سری کش ها هم مثل Apc این دوقابلیت رو همزمان دارن!

charcharkh
جمعه 11 دی 1394, 14:15 عصر
سلام
مطلب خیلی خوبی رو شروع نموده اید متشکرم. لطفا ادامه دهید تا دوستان برنامه نویس استفاده نمایند. بنده خودم ار apc استفاده میکنم . خیلی راحت هستش و واقعا کارا . توی سرور راحت فعال میشه و بسادگی میتونید ازش استفاده کنید البته memcache هم هست ولی من نتونستم خوب باهاش کار کنم (توی کار با توابعش به مشکل خوردم !!) ولی باز همون apc جواب کارمو داد. این کتاب هم خوبه.

pro_php_application_performance.pdf (http://pdf.th7.cn/down/files/1508/Pro%20PHP%20Application%20Performance.pdf)

البته ناگفته نمونه همه چیز هم توی سرعت لود سایت کش نیست. optimize کدهای css و js و image ها هم خیلی خیلی مهم هستش. البته یادتون باشه تو optimize کردن فایل js یه جوری compress کنید که بعدا بتونید بخونیدش یا لاقل یه فایل پشتیبان ساده فشرده نشده یه جایی نگهداری نمایید. تا مثل من بعدا گیر نیافتید:لبخندساده:

محسن شامحمدی
جمعه 11 دی 1394, 14:48 عصر
سوال: آیا کامپایل شدن کدهای php به زبان لایه پایین تر تاثیری توی سرعت اجرا داره؟
جواب: بله بسیار
برای مثال این همکارمون (http://stackoverflow.com/users/1356107/michael-dibbets) با opcache این کارو کرده و تجربه شو گفته

Without opcacheWhen using this script without opcache and I push 9000 requests in 2.8 seconds to the apache server it maxes out at 90-100% cpu for 70-80 seconds until it catches up with all the requests.
Total time taken: 76085 milliseconds(76 seconds)
With opcache enabled
With opcache enabled it runs at 25-30% cpu time for about 25 seconds and never passes 25% cpu use.
Total time taken: 26490 milliseconds(26 seconds)

محسن شامحمدی
جمعه 11 دی 1394, 14:54 عصر
برای کش کردن صفحه دو انتخاب داریم

full page caching
partial caching


وقتی تمام صفحه رو کش می کنیم که دیتای این صفحه به شکل عجیب غریبی از هزارجا و با هزارتا پردازش تولید شده باشه
وگرنه مثلا برای یک سایتی که یه تعداد پست داره و چپ و راست و بالا و پایینش html خام هستن.دلیلی نداره که اونا هم کش بشن.چون تولید اونها هیچ کار سختی برای سرور نداره
یک مثال می زنم که بررسی کنیم

138099

بهترین پست های این صفحه هر 10 روز یک بار باید رفرش بشن
پست های تصادفی هر روز باید تغییر کنن
و آخرین پست ها باید لحظه ای باشه

ساده ترین راه اینه که کل صفحه رو با عمر 5 ثانیه کش کنیم.(در بالا توضیح دادم که کش با این عمر کم چه فایده ای داره)
یک کار بهتر اینه که پست های تصادفی رو بصورت آرایه توی کشی با عمر 24 ساعت ذخیره کنیم
بهترین پست ها رو با عمر 10 روز و پست های صفحه رو با عمر 5 ثانیه.

-----------

مساله: هزاردرخواست در مدت 5 روز.چقدر سرور باید درگیر باشه
بدون کش:

هزاربار پست های تصادفی
هزار بار بهترین پست ها
هزار بار پست های آخری


با کش:

یک بار خواندن پست های تصادفی از دیتابیس و لود 999 بار از رم
5 بار خواندن بهترین پست ها و 995 بار خواندن از رم
500 بار خوندن پست ها از دیتابیس و 500 بار از رم


------------
تمام بخش سخت کار پیدا کردن نقاطی هستش که قابل کش کردنه و در واقع ارزش کش کردنش خیلی بیشتره.بعنوان مثال همین پست های تصادفی و بهترین پست ها.می بینید که چقدر به صرفه و با ارزش بود.
برای پیدا کردن فشار کار می تونید از سیستم های profiling مثل XDebug استفاده کنید

محسن شامحمدی
جمعه 11 دی 1394, 14:55 عصر
یکی از ساده ترین و قابل دسترس ترین سیستم های کشینگ APC هستش.
و کار باهاش واقعا سادس.
اولا که باید apc روی سیستم عامل نصب باشه که برای هر سیستم عامل و هر نسخه متفاوته.
توابع مهمش اینان

apc_store(key,value)
ذخیره مقدار در کش

apc_fetch(key)
دریافت مقدار قبلا ذخیره شده

apc_exists(key)
آیا این کلید موجود است


apc_delete(key)
حذف یک آیتم از کش

محسن شامحمدی
جمعه 11 دی 1394, 21:52 عصر
چندتا سناریو مطرح می کنم تا بدونید استفاده از کش شرایط عجیبی نداره و در کارهای روزمره ی ما کاملا قابل استفاده است.
بعنوان مثال:

لیست پست های تصادفی
لیست پست های امتیاز بالای ماه/هفته/سال
آرشیو ماهیانه/سالیانه
چک کردن وجود آیتم در دیتابیس (در یک حلقه خفن با چک کردن های فراوان می تونه life saver باشه)
پست های صفحه اول سایت
نتیجه جستجو
پیاده سازی سیستم های صف
سیستم های شمارشی (تعداد اشتباه زدن پسورد از این آیپی)
دیتای انقضادار(نگه داری این مورد تا n ثانیه/دقیقه)
ذخیره هر گونه اطلاعات موقتی


و هر استفاده ای که به ذهن شما می رسه

بعنوان مثال من روی سایت خودم اینا رو کش می کنم

لیست پست های تصادفی به مدت 10 ساعت
لیست پست های جدید به مدت 10 ساعت
صفحه جزئیات پست به مدت 10 دقیقه
کل صفحه ایندکس به مدت 5 دقیقه


و برای سیستم کراولرم هر آیتمی رو که می خوام چک کنم آیا وجود داره یا نه.بجای اینکه هر بار از دیتابیس بپرسم آیا وجود داره یا نه.از روی رم می خونم:)
و با همین نکات خیلی ریز سرعت پاسخ به http request به صفحات سایتم از یک و نیم ثانیه بدون کش رسیده به 300 میلی ثانیه.

این هم کش سایت من (http://s3.picofile.com/file/8230597692/apc.png)

محسن شامحمدی
جمعه 11 دی 1394, 22:00 عصر
http://bitflop.com/articles/benchmark-3-the-alternative-php-cache-apc.html
http://www.ricardclau.com/2013/03/apc-vs-zend-optimizer-benchmarks-with-symfony2/
http://infoheap.com/php-apc-setup-and-performance-benchmarks-ubuntu/
https://www.mcdruid.co.uk/content/installing-apc-on-ubuntu-linux-and-benchmarking-drupal-6-performance-improvement

محسن شامحمدی
یک شنبه 13 دی 1394, 18:42 عصر
دوستان خوشحال می شم شما هم تجاربتون در حوزه کشینگ بگید تا من هم از شما یاد بگیرم

mamad_za
سه شنبه 11 اسفند 1394, 09:29 صبح
از این کش به چه صورت می شه استفاده کرد؟ تو هاست های اشتراکی هم میشه استفاده کرد؟ آیا فعال هستن یا اینکه باید به پشتیبانی تیکت بزنیم که فعالشون کنن ؟ <br>یه سوال دیگه شما تو پستای بالا این نکته رو گفتین که میشه مثلا آخرین خبر رو هر 5 ثانیه .... تو این لینکایی که داده بودین من چنین چیزی ندیدم یه خورده در مورد نحوه کارکردو اینکه چطوری باید فعالشون کنیم اگه توضیح بیشتری بدید ممنون می شم

محسن شامحمدی
چهارشنبه 12 خرداد 1395, 14:55 عصر
تو هاست های اشتراکی هم میشه استفاده کرد؟

بله توی اکثرسرورها نصب و فعاله



از این کش به چه صورت می شه استفاده کرد؟




$bar = 'BAR';apc_store('foo', $bar);var_dump(apc_fetch('foo'));

tehro0n
دوشنبه 17 خرداد 1395, 22:52 عصر
یکی از ساده ترین و قابل دسترس ترین سیستم های کشینگ APC هستش.
و کار باهاش واقعا سادس.
اولا که باید apc روی سیستم عامل نصب باشه که برای هر سیستم عامل و هر نسخه متفاوته.
توابع مهمش اینان

apc_store(key,value)
ذخیره مقدار در کش

apc_fetch(key)
دریافت مقدار قبلا ذخیره شده

apc_exists(key)
آیا این کلید موجود است


apc_delete(key)
حذف یک آیتم از کش

این لینک مشکل داشت http://pdf.th7.cn/down/files/1508/Pro%20PHP%20Application%20Performance.pdf

و اینکه روی xampp با اینکه فایل dll رو گرفتم و extension کردم اما apc کار نمی کنه