زمانی که به ذخیره سازی در اپلیکیشن های تحت وب فکر می کنیم, اولین چیزی که به ذهنمان می آید, معمولا یک دیتابیس سنتی مثل MySQL است.
استفاده از MySQL برای ذخیره سازی طولانی مدت و آنالیز داده ها بسیار عالی است, اما گزینه بهتری برای کوتاه مدت وجود دارد که Memcached است.
Memcached گزینه فوق العاده ای برای ذخیره بیت اطلاعات بین درخواست های صفحه و افزایش کارایی اپلیکیشن است. کش ها بر دو نوع Disk Cache و Memory Cache هستند که memcached از نوع کش در حافظه است.
memcached مقادیر (value) ها را به همراه کلید (key) ذخیره و مقادیر را به همراه کلید حتی بدون parse کردن کویری دیتابیس و منتظر ماندن برای آن همه فرایند, دریافت می کند. برای همین memcached باعث افزایش سرعت دریافت پاسخ (response) صفحات وب می شود و یک تجربه کاربری عالی را ایجاد می کند.
در این آموزش php قصد داریم به آموزش کار با Memcached در PHP و نحوه استفاده از آن برای افزایش عملکرد (Performance) اپلیکیشن های تحت وب بپردازیم
مقدمه کار با Memcached در PHP
Memcached بطور ساده یک سرور به همراه رابط (interface) است که به شما اجازه ذخیره اطلاعات را در حافظه (memory) می دهد.
این ابزار می تواند روی همان سروری که کدها اجرا می شود, به عنوان وب سرور اجرا شود, اما مقیاس پذیری را در صورتی بوجود می آید که نمونه ها را بین سرورهای چندگانه توزیع کنیم.
تنها چیزی که نیاز داریم, اجرای Memcached و همچنین PHP برای ارایه یک اینترفیس ساده با کتابخانه PECL است.
بر روی سیستم لینوکس Debian-based نصب آن با اجرای دستورات زیر قابل انجام است:
1 2 3 4 |
$ sudo apt-get install memcached $ sudo service memcached start $ sudo pecl install memcached $ sudo service httpd restart |
روی سرور و هاستینگ های مختلف Memcached نصب و فعال است که می توانید از طریق اجرا phpinfo()
متوجه این موضوع بشوید.و نیازی به دستورات بالا نیست (البته در یک هاست اشتراکی معمولا دسترسی شل رو هم ندارد.)
حالا نیاز است اشاره کنیم که عملا دو کتابخانه PHP برای کار با Memcached در PHP وجود دارد.
نام کتابخانه قدیمی تر “memcache” است که یک سری قابلیت ها را ندارد. کتابخانه جدید “memcached” است که از libmemcached استفاده می کند و ترجیح می دیم از آن استفاده کنیم.
این اولین قدم در PHP برای اتصال به سرور است. کانکشن ها حین ارسال درخواست ها, همچنان برقرار خواهند بود که خب برای عملکرد برنامه نیاز است.
بعد لیست سرور های مورد نیاز را اضافه می کنیم. در این مثال ما از لوکال هاست و پورت پیش فرض memcached استفاده می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function get_memcached() { // Set a persistent connection ID $mc = new Memcached('webapp'); // Set a short timeout (in milliseconds) so if the server goes down // it doesn't take down our site with it $mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000); if ( !$mc->getServerList() ) { if ( !$mc->addServer('localhost', 11211) ) { error_log('Could not add memcached server.'); return false; } } return $mc; } |
حالا می توانید متغیرهای PHP را داخل memcached با توابع ساده مبتنی بر کلیدهایی (keys
) که تعریف کردید, بخوانید (read
) و رایت کنید. این مقادیر بصورت خودکار سریال شده و مجددا از حالت کد شده خارج می شوند.
شما نمی توانید ریسورس ها را همانند کانکشن دیتابیس رایت کنید, اما می توانید آن ها را بصورت آرایه تبدیل و ذخیره کنید.
1 2 |
$mc->set('list', array(1, 2, 3)); $list = $mc->get('list'); |
ذخیره اطلاعات (Data)
فرض کنید می خواهید که لیست URL های بازدیدی اخیر را به ازای هر کاربر لاگین شده ذخیره کنید.
می توانستیم از سیشن (Session) ها بهره ببریم اما این داده ها بین دیوایس های مختلف در دسترس نخواهند بود و همچنین با پاک شدن session , این اطلاعات هم از بین می روند.
حتی می توانیم از دیتابیس استفاده کنیم اما برای این نوع داده ها که برای سیستم و یا اپ ما آنقدرا هم حیاتی و مهم نیستند, زیادی کند است.
بنابراین در این شرایط ما از memcached در PHP بهره می بریم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$user_id = 123; // The current user's ID $recents = array(); if ($mc = get_memcached()) { // Get any stored in memcached $recents = $mc->get("recents-$user_id"); if (!$recents) { $recents = array(); } $recents[] = $_SERVER['REQUEST_URI']; $recents = array_unique($recents); $mc->set("recents-$user_id", $recents); } print_r($recents); |
کش کردن
حالا زمان آن است که سرعت نتایج دیتابیس را با کش کردن در اپلیکیشن تحت وب, تقویت کنیم.
کویری های دیتابیس معمولا از بزرگترین مشکلات در فرایند پردازش سرور است, بنابراین برای جلوگیری از اجرای کویری های تکراری, با کش کردن نتایج آن ها در مموری می توانیم به یک کارایی (performance) بسیار بزرگی در اجرای برنامه دست یابیم !
ساده ترین روش, کویری زدن و ذخیره آن فقط با کلید اصلی (primary
) است. معمولا بهتر است مقادیر (value
) کش شده بعد از هربار آپدیت شدن آن رکورد, حذف شوند که باعث می شود که دیگر کاربران مقادیر قدیمی را به جای مقادیر جدید نبینند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function store_product($id, $name, $price) { // Create or update the product in the database $db = get_db(); $qry = $db->prepare('REPLACE INTO product (id, name, price) VALUES (:id, :name, :price)'); $qry->bindParam(':id', $id); $qry->bindParam(':name', $name); $qry->bindParam(':price', $price); $qry->execute(); // Remove outdated values from cache if it's there if ($mc = get_memcached()) { $mc->delete("product-$id"); } } function get_product($id) { $product = null; // First check the cache if ($mc = get_memcached()) { $product = $mc->get("product-$id"); } if (!$product) { // Not in the cache; check the db $qry = $db->prepare('SELECT * FROM product WHERE id = $id'); $qry->bindParam(':id', $id); if ($qry->execute()) { $product = $qry->fetch(); // Cache for future use if ($mc) { $mc->set("product-$id", $product); } } } return $product; } |
هشدارهای کار با Memcached در PHP
همانند هر تکنولوژی دیگری, اینجا هم یک سری محدودیت ها و باقی موارد وجود دارد که نیاز به توجه دارد :
- حداکثر طول یک کلید (
key
) برابر ۲۵۰ بایت است. نام کلیدها را ساده و کوتاه قرار بدید. - حداکثر مقدار (
value
) پیش فرض حدود ۱مگابایت است. پس اینجا محل مناسبی برای ذخیره مقادیر بزرگ نیست. - محل ذخیره سازی Memcached برای خواندن(
read
) و نوشتن(write
) قفل نیست درحالی که امکان قفل کردن رکوردهای دیتابیس وجود دارد (با محدود کردن privilege) . فقط آگاه باشید که هر درخواست در هر زمان می تواند این مقادیر را آپدیت کند. - اطمینان حاصل کنید که سرورهای Memcached شما فضای رم کافی برای ذخیره سازی را دارند.
مراحل بعدی کار با Memcached در PHP
کارهای بیشتری می توانید با memcached انجام بدید:
- مقادیر کش شده می توانند timeout داشته باشند. این مورد زمانی کاربردی است که داده ها بعد از یک مدت زمانی بصورت اتوماتیک حذف شوند (بسیار مهم)
- متدهای ساده
increment
وdecrement
برای نگهداری شمارنده های سریع بین درخواست ها کاربرد دارند. - با پیکربندی صحیح memcached می توانید داده را بین اپلیکشن های ساخته شده با زبان های دیگر مثل اپ های اندروید و IOS به اشتراک بگذارید.
حتما کار با Memcached در PHP را یاد بگیرید و از آموزش بالا نهایت استفاده را ببرید. در یک سناریوی درست, Memcached برای افزایش حداکثری کارایی وب اپلیکیشن, واقعا بسیار مفید است.البته سیستم های کش کردن مثل apc و redis هم وجود دارند که از قدیمی ترین ها Memcached است که عالی جواب می دهد.
امیدوارم از آموزش کار با Memcached در PHP استفاده مفید را برده باشید.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
خیلی مفید بود ممنون واقعا
خوشحالیم که مفید واقع شده.
موفق باشید.