البحث في الموقع
المحتوى عن 'memcache'.
-
يزداد نمو المواقع يومًا بعد يوم، ومنه إلى ازديار في نسبة مرور البيانات (traffic)، الأمر الّذي من شأنه أن يزيد من الضغط على قواعد البيانات، وباعتبار أنّ قواعد البيانات هي عنق الزجاجة لأداء أي موقع، فعليه يجب أنّ يتمّ إعدادها بشكل مُناسب لِتتولّى الضغط العالي بشكل يُلائم مُتطلّبات العمل.يُمكن اعتبار تقنيّة memcached أحد الطّرق العمليّة في رفع معدّل تخبئة الكائنات في ذاكرة النظام، فهي نظام يعمل على تخزين البيانات وبشكلٍ مؤقّت في الذّاكرة على أن يتمّ استدعائها من الذّاكرة بدلًا من قاعدة البيانات، بحيث تكون هذه البيانات جاهزةً إلى الطلب التّالي ومن الذّاكرة، الأمر الّذي يزيد من سرعة الاستجابة وبشكلٍ ملحوظ. سيتناول هذا الشرح كيفيّة تنصيب وإعداد الذّاكرة المُخبّئة على الخادوم Ubuntu 14.04، ومناقشة ما يلزم من تفاصيل. مُتطلّبات العملقبل بدء العمل، يجب توفّر مُستخدِم ذو صلاحيات وصول عالية، لتطبيق مُحتويات هذه الدليل. تنصيب Memcached وباقي المُقَوِّمات المطلوبةيُمكن تنصيب كافة المُقَوِّمات (components) اللازمة لبدأ العمل من مستودعات أبونتو حيثُ أنّه يوفّرها جميعها. سيتمّ أولًا تحديث الحزم المحلّيّة، ومن ثمّ تنصيب باقي البرامج سيتمّ تنصيب memcached، بالإضافة إلى قواعد البيانات MySQL، ولغة PHP لتتولّى عمليّة الوساطة مع قواعد البيانات، وكما سيتمّ الحاجة إلى تنصيب تَوْسِعَة/إضافة (extension) للغة PHP لِتتولّى عمليّة الربط مع الذّاكرة المُخبّئة (memcached): sudo apt-get update sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcachedيجب الانتباه هنا إلى توفّر توسعتان من الذّاكرة المخبّئة الخاصّة بلغة PHP، تحمل الأولى الاسم php5-memcache، وتحميل الثّانية الاسم php5-memcached، -حرف “d” الإضافي في الثّانية-سيتمّ الاعتماد على الإضافة الثّانية في هذا الشرح بسبب استقرارها، وتقديمها إلى مساحة أكبر من الخيارات والمزايا. إنّ لم تكن قواعد البيانات منصّبة من قبل، فإن المُنصب سيَطلب اختيار وتأكيد كلمة مرور حساب المُدير. ويكون بهذا قد تمّ تنصيب ما سيتمّ الحاجة له خلال الشرح. اختبار تنصيب الذّاكرة المُخبّئةقد يبدو الأمر صعب التصديق، ولكن بهذا الإعداد البسيط فإن الذّاكرة المُخبئة أصبحت جاهزة للعمل، ويُمكن اختبارها بطرقٍ عدّة. تُعتبر الطريقة الأولى سهلة إلى حدٍّ ما، حيث من المُمكن فقط سؤال PHP إن كانت تعلم حول تَوْسِعَة memcached، وفيما إذا كانت مُفعّلة أو لا، وذلك عبر إنشاء صفحة PHP info المعروفة. سيتمّ إنشاء ملف بالاسم info.php في المسار الجذر لخادوم الوب، والّذي سيكون /var/www/html على اعتبار أنّ خادوم الوب هو Apache: sudo nano /var/www/html/info.phpسيتمّ كتابة السطور التّالية في هذا الملفّ، والّتي من شأنها استدعاء دالّة (PHP function)، والّتي من شأنها أنّ تجمع وتطبع معلومات حول الخادوم بصفحة ويب مُنسقة بشكل مقروء ومُبسّط. <?php phpinfo(); ?>يُمكن الآن زيارة خادوم الوب متبوعًا بـ /info.php، وبعد التدرّج في الصفحة إلى القسم الخاص بـ “memcached”، سيكون هناك معلومات مُشابهة إلى التّالي: http://server_domain_name_or_IP/info.php تشير المعلومات السابقة إلى أنّ تَوْسِعَة memcached مُفعّلة، وقد تمّ ربطها مع خادوم الوب. يُمكن أيضًا اختبار فيما إذا كانت خدمة memcached تعمل عن طريقة ترشيح العمليات الحاليّة باستخدام الأداة grep: ps aux | grep memcachedيعرض الأمر السابق معلومات على الشكل التّالي: memcache 6584 0.0 0.0 327448 3004 ? Sl 14:07 0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 demouser 6636 0.0 0.0 11744 904 pts/0 S+ 14:29 0:00 grep --color=auto memcachedوكما هو الأمر دائمًا مع خدمات أنظمة لينكس فيمكن إيقاف، تشغيل، أو إعادة تشغيل أي خدمة، فالإعادة تشغيل خدمة memcached يُمكن تنفيذ الأمر التّالي: sudo service memcached restartاختبار الذّاكرة المُخبّئةبعد أن تمّ التأكّد من عمل الذّاكرة المُخبّئة، وأن تَوْسِعَة PHP مُتصلة بها ومُفعّلة، فمن المُمكن تجربة استخدامها في تخبئة/تخزين بعض البيانات. سيتمّ كتابة شيفرة/سكريبت PHP آخر لذلك، وسيكون أكثر تعقيدًا من سابقه: sudo nano /var/www/html/cache_test.phpسيتمّ تغليف الشيفرة بوسم PHP: <?php ?>سيتمّ إنشاء حالة/نموذج (instance) من كائن Memcached، وتخزينه في مُتغيّر، ومن ثُمّ سيتمّ تعريف المَوضع الّذي يُمكّن هذا الكائن من الاتصال بخدمة memcache، والّتي تعمل على المنقذ 11211 بالإعداد الافتراضيّ. <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); ?>سيتمّ في الخطوة التّالية إخبار حالة Memcached، المُنشئة في الخطوة السابقة، بالاستعلام (query) عن مفتاح (key) من *التخبئة (cache)، يُمكن أنّ يكون اسم المُفتاح اعتباطيًا باعتبار أنّه لم ينشئ بعد، وليكن “test”، وستُخزّن نتيجة هذا الطلب في المتغيّر $result: <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); $result = $mem->get("test"); ?>سيتمّ في الخطوة التّالية اختبار فيما إذا تمّ الحصول على أي عائد: فلو وجدت memcached مفتاحًا بالاسم “test”، سيتمّ طباعته مع قيمته.أما لو لم تجد مفتاحًا مُطابقًا، سيتمّ طباعة رسالة تُشير إلى ذلك.يجب بعد ذلك تعيين قيمة للمفتاح، ليكون حاضرًا عند السؤال عن البيانات/القيمة في المرّة القادمة، ستجد memcached البيانات/القيمة المُعيّنة له. <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); $result = $mem->get("blah"); if ($result) { echo $result; } else { echo "No matching key found. I will add that now"; $mem->set("blah", "I am data! I am held in memcached") or die("Couldn't save anything to memcached..."); } ?>أصبحت الشيفرة/السكريبت جاهزةً في هذه المرحلة، وبزيارة الصّفحة باستخدام المُتصفّح، سيتمّ رؤية التّالي: http://server_domain_name_or_IP/cache_test.phpستظهر النتيجة على الشكل التّالي في الزيارة الأولى، والّتي تُشير إلى عدم وجود مُفتاح مُطابق، على أنّ تتم إضافته إلى حين الطلب اللّاحق: وستكون النتيجة على الشكل التّالي في الزيارة التّالية: يُوضّح المثال السابق، كيف استطاعت خدمة memcached على تخبئة المعلومات المُعيّنة كما هو مُبرمجٌ لها أن تفعل. اختبار تخبئة قيم قواعد البيانات بشكل مؤقّت (Caching Database Values)أصبح الآن من المُمكن تخزين البيانات في الذّاكرة المُخبئة، ومن المُمكن توضيح المزيد من الأمثلة الواقعيّة، وذلك بالتّطرّق إلى تخبئة النتائج المُستعلمة من قواعد البيانات بشكل مؤقّت في الذّاكرة. إنشاء عيّنة بيانات في MySQLسيتمّ إعداد قواعد البيانات بشكلٍ مُلائم أولًا، وذلك قبل أنّ يتمّ إنشاء هذه العيّنة سيتمّ الاتصال بقواعد البيانات كمُستخدِم مُدير مع إدخال كلمة المرور المُعيّنة خلال تنصيب MySQL، ليتمّ استحضار موجّه الأوامر الخاصّ بـ MySQL: mysql -u root -pسيتمّ إنشاء قاعدة بيانات ليتمّ الاختبار عليها، وبعد ذلك البدء في استخدامها: CREATE DATABASE mem_test; USE mem_test;سيتمّ إنشاء مُستخدِم بالاسم “test”، وبكلمة مرور “testing”، وبصلاحيات وصول إلى القاعدة الّتي تمّ إنشاؤها: GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123';سيتمّ بعد ذلك إنشاء جدول يحتوي على سجل وحيد، سيحمل الجدول الاسم “sample_data”، مُحتويًا على عمودان، نصيّ وعددي. CREATE TABLE sample_data (id int, name varchar(30)); INSERT INTO sample_data VALUES (1, "some_data");تمّ بذلك إنشاء بنية قاعدة البيانات اللازمة، وأصبح بالإمكان الخروج من موجّه الأوامر الخاصّ بـ MySQL: exitكتابة شيفرة PHP لتخبئة بيانات MySQLأصبح من المُمكن كتابة شيفرة تُحاكي بيئة عمل تطبيق حقيقي في البيئة الحيّة، وذلك بعد أنّ أصبحت قواعد البيانات مجهّزة بشكل مُناسب. ستقوم الشيفرة بالبحث عن البيانات في الذّاكرة المُخبّئة والعودة بالبيانات المُتوفّرة، ولكن عند عدم إيجاد أي بيانات، سيتمّ الاستعلام من قواعد البيانات نفسها، ومن ثمّ تخزين النتائج في الذّاكرة المخبّئة من أجل الاستعلامات المُستقبليّة. سيتمّ كتابة الشيفرة في المسار الجذر الخاصّ بخادوم الوب، وسيحمل الملفّ الّذي يحتوي هذه الشيفرة الاسم database_test.php: sudo nano /var/www/html/database_test.phpستبدأ سُطور الشيفرة بشكل مُشابه إلى الشيفرة السابقة، وذلك بإنشاء حالة وإخبارها بمكان خدمة memcached على الخادوم، كما تمّ الأمر في المثال السابق: <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); ?>ستكون الخطوة التّالية هي تحديد كيف لـ PHP الاتصال بقواعد بيانات MySQL، وذلك بتمرير بيانات الاعتماد/الدخول الخاصّة بالمُستخدِم المُنشئ سابقًا، ومن ثُمّ تحديد أيًا من قواعد البيانات يجب استخدامها: <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("mem_test") or die(mysql_error()); ?>سيتوجّب في الخطوة التّالية بناء الاستعلام، الّذي وظيفته جلب البيانات الموجودة في جدول قاعدة البيانات، وتخزينه في المُتغيّر $query. سيتمّ بعد ذلك إنشاء مُتغيّر $querykey ليخزّن المفتاح الذي ستستخدمه memcached لاسترجاع المعلومات سيتمّ بناء هذا المُفتاح بالجمع بين الكلمة “KEY”، وبعثرة (hashing) من نوع md5، ويضمن ذلك أن كلَّ مُفتاح هو مُفتاح فريد عن الآخر، فعندما يتمّ استخدام هذا الأسلوب مع مجموعة كبيرة من البيانات، وليس كما هو حال هذا المثال المُبسّط، سيضمن ذلك أن أي استعلام مُماثل سيُنتج نفس المُفتاح للطلبات المُستقبليّة. <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("mem_test") or die(mysql_error()); $query = "SELECT ID FROM sample_data WHERE name = 'some_data'"; $querykey = "KEY" . md5($query); ?>سيتمّ في الخطوة التّالية إنشاء المُتغيّر querykey، ليتمّ تعيينه إلى المُتغيّر $result في حال توفّره. <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("mem_test") or die(mysql_error()); $query = "SELECT name FROM sample_data WHERE id = 1"; $querykey = "KEY" . md5($query); $result = $mem->get($querykey); ?>سيتمّ عمل اختبار منطقي (جملة شرطيّة)، والّذي من شأنه أن يُحدّد ماذا سيحدث عند وجود نتائج (جواب الشرط true) في الذّاكرة المُخبّئة، وفي حال ذلك سيتمّ طباعة البيانات المسحوبة، وإخبار المُستخدم أنه قد تمّ استدعاء البيانات من الذّاكرة المُخبّئة بشكل مُباشر: <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("mem_test") or die(mysql_error()); $query = "SELECT name FROM sample_data WHERE id = 1"; $querykey = "KEY" . md5($query); $result = $mem->get($querykey); if ($result) { print "<p>Data was: " . $result[0] . "</p>"; print "<p>Caching success</p><p>Retrieved data from memcached!</p>"; } ?>سيتمّ في الخطوة التّالية كتابة الحالة البديلة، وستكون عند عدم وجود نتائج (جواب الشرط false)، ولذلك يجب استخدام الاستعلام الذي تمّت صياغته سابقًا لسؤال MySQL عن البيانات، ومن ثمّ تخزينها داخل المُتغيّر $result، والذي سيكون على شكل مصفوفة (array). أصبح من المُمكن بعد ذلك إضافة النتائج إلى الذّاكرة المُخبّئة، بعد توفّر نتيجة الاستعلام، لتكون هذه البيانات مُخبّئة للطلب التّالي، ولذلك سيتمّ تمرير ثلاثة مُعاملات لتعيين الذّاكرة المُخبّئة: المفتاح الّذي سيتمّ استخدامه كإشارة مرجعيّة للبيانات، وهو نفس المُفتاح المُنشئ بالمُتغيّر $querykey.البيانات نفسها، وهي مخزّنة في المُتغيّر $result بعد إجراء استعلام MySQL.مُدّة التخبئة بالثانية.سيتمّ تخزين التخبئة لمُدّة ثوانٍ قليلة، في البيئة الحقيقية، سيكون من المُفيد تخبئة المُحتوى لمدّة أطول، ربما دقائق عدّة، خاصّة إذا كان المُحتوى لا يتغيّر بشكل كبير، ولكن لأغراض التجربة، سيتمّ الالتزام بهذه الثواني بدلًا من إعادة تشغيل خدمة memcached لتكملة الاختبار. بعد ذلك، سيتمّ طباعة رسالة بنتائج الاستعلام، مع إخبار المُستخدِم بطريقة الحصول على البيانات: <?php $mem = new Memcached(); $mem->addServer("127.0.0.1", 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("mem_test") or die(mysql_error()); $query = "SELECT name FROM sample_data WHERE id = 1"; $querykey = "KEY" . md5($query); $result = $mem->get($querykey); if ($result) { print "<p>Data was: " . $result[0] . "</p>"; print "<p>Caching success</p><p>Retrieved data from memcached!</p>"; } else { $result = mysql_fetch_array(mysql_query($query)) or die(mysql_error()); $mem->set($querykey, $result, 10); print "<p>Data was: " . $result[0] . "</p>"; print "<p>Data not found in memcached.</p><p>Data retrieved from MySQL and stored in memcached for next time.</p>"; } ?>اكتملت الشيفرة بهذا الشكل، وبالمُختصر ما سيحدث هو مُحاولة الحصول على البيانات من الذّاكرة المُخبّئة، واستعراضها عند توفرها، وفي حال الفشل في الحصول على البيانات من الذّاكرة المُخبّئة، سيتمّ التوجّه مُباشرةً لاستعلام قواعد البيانات، ومن ثُمّ تخزين النتائج للطلب التّالي ولفترة ثواني معدودة. اختبار الشيفرةتمّ الانتهاء من كتابة الشيفرة، وأصبح بالإمكان اختبارها، وذلك عبر التوجّه إلى المُتصفّح واستعراض ملفّ الشيفرة: http://server_domain_name_or_IP/database_test.phpيجب أنّ تكون المُخرجات في الزيارة الأولى على الشكل التّالي: ما أن يتمّ تحديث الصفحة، وقبل انقضاء الثواني العشر، حتّى تَعرض الصفحة رسالة مُختلفة كما في التّالي: ما إنّ تنقضي الثواني العشر، ستنتهي صلاحيّة المُحتوى المُخبّئ، وسيُحذف من الذّاكرة المُخبّئة (memcached)، وستُعرض الرسالة الأولى الّتي تُشير إلى أنّ البيانات قد تمّ استدعاؤها من قاعدة البيانات بدلًا من الذّاكرة المُخبّئة. كلمات أخيرةيُفترض الآن وبعد الانتهاء من هذا الشرح الحصول على فهم كامل لكيفيّة إعداد الذّاكرة المُخبّئة، وكيف من المُمكن الحفاظ على أداء خادوم الوب، بتجنيبه من إجراء استعلامات مٌتكرّرة على قواعد البيانات للحصول على نفس المُحتوى. يجب الانتباه إلى أنّ الشيفرة المُستخدمة في هذا الدليل هي فقط لأغراض الشرح، ولتُعطي فكرة واضحة عن آلية العمل وكيفيّة بناء منظومة كاملة وصحيحة تعتمد على الذّاكرة المُخبئة، واستعلام قواعد البيانات في حال فشلها. ترجمة – وبتصرّف – للمقال How To Install and Use Memcache on Ubuntu 14.04 لصاحبه Justin Ellingwood.
- 1 تعليق
-
- 1
-
- الذاكرة المخبئة
- memcached
-
(و 2 أكثر)
موسوم في: