استخدام Memcached لتخزين بيانات PHP مؤقتاً في ServBay
تُعد ServBay بيئة تطوير ويب محلية قوية تأتي مُزودة مسبقاً بحزمة Memcached عالية الأداء (خادم Memcached) بالإضافة إلى إضافة PHP الخاصة بها، مما يُسهل على المطورين تفعيل خاصية التخزين المؤقت للبيانات داخل تطبيقات PHP بشكل فعال، وبالتالي تحسين أداء التطبيق بشكل ملحوظ.
سيوضح هذا الدليل بالتفصيل كيفية التأكد من تفعيل واستخدام Memcached والإضافة الخاصة بها للـ PHP ضمن ServBay.
لمحة عن Memcached
Memcached هو نظام قوي لتخزين كائنات البيانات مؤقتاً في الذاكرة بنمط موزع. يقوم بتخزين البيانات مؤقتاً (كنتائج استعلامات قواعد البيانات، استجابات API، أجزاء صفحات، إلخ) داخل الذاكرة لتقليل عمليات الوصول إلى مصادر البيانات الخلفية مثل قواعد البيانات، مما يرفع من سرعة الاستجابة وسعة معالجة تطبيقات الويب الديناميكية.
أبرز الميزات
- أداء عالي: التخزين في الذاكرة سريع جداً في القراءة والكتابة.
- نظام موزع: يدعم بناء تجمعات تخزين مؤقت عبر خوادم متعددة، ما يسهّل التوسّع.
- سهولة الاستخدام: بروتوكول بسيط، مكتبات عميلة متعددة، وسهولة التكامل.
- تخفيف الضغط عن قاعدة البيانات: يقلل بشكل فعال من استعلامات قاعدة البيانات، ما يُفيد بشكل خاص في حالات الحمل العالي.
الفرق بين إضافتي memcache
و memcached
للـ PHP
هناك إضافتان شائعتان في PHP للاتصال بخادم Memcached: وهما memcache
وmemcached
. على الرغم من تشابه أسمائهما، لكل واحدة منهما ميزات وواجهات متنوعة:
- إضافة
memcache
:- إضافة أقدم للـ PHP.
- تقدم واجهة برمجة إجراءاتية (مثل:
memcache_connect()
,memcache_set()
، إلخ). - توفر أساسيات التعامل، ولا تدعم ميزات متقدمة مثل التجزئة المتسقة (رغم وجود دعم جزئي في بعض المكتبات).
- إضافة
memcached
:- إضافة أحدث (مدعومة بمكتبة libmemcached).
- تقدم واجهة برمجة كائنية (باستخدام الفئة
Memcached
). - تدعم العديد من الميزات المتقدمة مثل التجزئة المتسقة، بروتوكول ثنائي، مصادقة SASL، وخيارات تسلسل بيانات مرنة.
- عادةً ما يُوصى باستخدام إضافة
memcached
لأنها أكثر تطوراً ويجري تحديثها باستمرار.
افتراضياً، توفر ServBay إضافة memcached
للـ PHP وتوصي باستخدامها.
حزمة وبرمجية Memcached وإضافتها في ServBay
لا تقوم ServBay بتجهيز خادم Memcached كحزمة قابلة للإدارة فقط، بل تقوم أيضاً بتثبيت وتفعيل إضافة memcached
لجميع نسخ PHP المدمجة معها افتراضياً.
هذا يعني أنك غالباً، فور تثبيت ServBay، تجد كل من خادم Memcached وإضافة PHP الخاصة بها جاهزين للاستخدام، دون الحاجة لأي عملية تجميع أو ضبط إضافي.
التحقق من حالة حزمة Memcached:
يمكنك العثور على حزمة Memcached
والتحقق من حالتها (أنها "قيد التشغيل") من الواجهة الرئيسية أو من لوحة إدارة الحزم في ServBay. إذا لم تكن قيد التشغيل، يمكنك محاولة تفعيلها يدوياً.
التحقق من تحميل إضافة memcached
في PHP:
أسهل طريقة للتحقق من تحميل إضافة memcached في نسخة PHP معينة هي عبر استعمال دالة phpinfo()
:
أنشئ ملف PHP جديد في مجلد الجذر لموقعك ضمن ServBay (عادةً:
/Applications/ServBay/www
)، وليكن اسمه مثلًاinfo.php
.أضف إليه الكود التالي:
php<?php phpinfo(); ?>
1
2
3قم بزيارة هذا الملف عبر عنوان الموقع المحلي المعد في ServBay (مثال: إذا كان نطاق موقعك هو
servbay.demo
، انتقل إلىhttp://servbay.demo/info.php
).في صفحة
phpinfo
الظاهرة، ابحث عن كلمة "memcached". إذا وجدت قسماً يحمل اسم "memcached" ومعروض فيه معلومات الإعداد والنسخة، فهذا يعني أن الإضافة تم تحميلها بنجاح وجاهزة للاستعمال.
كيفية الاستفادة من Memcached في PHP
بعد التأكد من تشغيل خادم Memcached وتحميل إضافة memcached
للـ PHP، يمكنك استخدام فئة Memcached في سكربت PHP للاتصال بالخادم وإجراء العمليات التخزينية.
عادةً يعمل خادم Memcached على المنفذ الافتراضي 11211
على localhost
.
مثال برمجي
فيما يلي مثال برمجي بسيط يوضح كيفية الاتصال مع خادم Memcached المحلي وحفظ واسترجاع بيانات عبر فئة Memcached
:
احفظ الشيفرة التالية ضمن مجلد موقعك في ServBay كملف PHP (مثلاً: /Applications/ServBay/www/memcached_test.php
):
<?php
// معلومات خادم Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// إنشاء كائن عميل Memcached
$memcached = new Memcached();
// إضافة الخادم إلى تجمع الاتصال
// تُعيد دالة addServer() قيمة منطقية تدل على نجاح إضافة العنوان، ولا تعني بالضرورة نجاح الاتصال
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// ملاحظة: فشل الإضافة غالباً بسبب الإعداد، وليس وجود مشكلة في الاتصال بالخادم
die("تعذر إضافة خادم Memcached إلى قائمة الاتصال. الرجاء مراجعة إعدادات المضيف والمنفذ.");
}
// اختبار الاتصال بمحاولة جلب مفتاح غير موجود (اختياري، لكنه موصى به)
// تعيد get() false أو مصفوفة فارغة إذا كان المفتاح غير موجود أو في حال وجود مشكلة بالاتصال
// يمكن استخدام Memcached::getResultCode() لمعرفة حالة أدق
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // محاولة جلب مفتاح غير موجود
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// إذا لم يكن NOTFOUND أو SUCCESS، قد يشير لمشكلة في الاتصال
// ملاحظة: قد تعود SUCCESS عند جلب قيمة فارغة
// تحقق الاتصال بدقة أكبر قد يتطلب منطق إضافي أو تبعاً لسلوك العميل المستخدم
// غالباً في بيئة التطوير المحلية، إذا نجح addServer ولم تحدث أخطاء لاحقاً فيعد الاتصال سليماً
echo "تنبيه: قد تكون هناك مشكلة في الاتصال بخادم Memcached. رمز النتيجة: " . $result_code . "<br>";
// بالإمكان تنفيذ معالجة أخطاء أعمق في التطبيقات الحقيقية
} else {
echo "تم الاتصال بنجاح مع خادم Memcached ({$memcached_host}:{$memcached_port})<br>";
}
// --- مثال على عمليات التخزين المؤقت ---
// البيانات المراد تخزينها مؤقتاً
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // مدة انتهاء التخزين المؤقت بالثواني (هنا: ساعة واحدة)
// تعيين البيانات في التخزين المؤقت
// تُعيد set() قيمة منطقية تدل إن تمت العملية بنجاح
if ($memcached->set($key, $data, $expiration)) {
echo "تم حفظ البيانات مؤقتاً بنجاح بالمفتاح '{$key}' ولمدة {$expiration} ثانية.<br>";
} else {
echo "فشل حفظ البيانات في التخزين المؤقت!<br>";
// بالإمكان معرفة سبب الفشل عبر getResultCode()
echo "رمز النتيجة: " . $memcached->getResultCode() . "<br>";
}
// محاولة استرجاع البيانات من التخزين المؤقت
echo "محاولة جلب البيانات من التخزين المؤقت...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // تعيد get() false في حال عدم وجود البيانات أو وقوع خطأ
echo "تم جلب البيانات من التخزين المؤقت بنجاح:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "لم يتم العثور على البيانات أو فشلت عملية الجلب، المفتاح '{$key}'.<br>";
echo "رمز النتيجة: " . $memcached->getResultCode() . "<br>";
}
// مثال على انتهاء صلاحية البيانات (في حال مرور الوقت)
// عادة في التطبيقات الحقيقية يتم التحقق مما إذا كان $cachedData يساوي false وعندها تُعاد البيانات من المصدر الأساسي (مثلاً قاعدة البيانات) ثم تحفظ مجدداً في cache.
// مثال حذف البيانات من التخزين المؤقت
/*
echo "محاولة حذف البيانات من التخزين المؤقت...<br>";
if ($memcached->delete($key)) {
echo "تم حذف البيانات بنجاح من التخزين المؤقت، المفتاح '{$key}'.<br>";
} else {
echo "فشل حذف البيانات من التخزين المؤقت!<br>";
echo "رمز النتيجة: " . $memcached->getResultCode() . "<br>";
}
// محاولة جلب البيانات بعد الحذف
echo "محاولة جلب البيانات المحذوفة...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "تم جلب بيانات (الحذف لم ينجح):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "البيانات لم تعد متوفرة في التخزين المؤقت (وهذا أمر متوقع).<br>";
echo "رمز النتيجة: " . $memcached->getResultCode() . "<br>";
}
*/
// مثال على إفراغ كل البيانات المخزنة مؤقتاً (استخدمه بحذر!)
/*
echo "محاولة إفراغ كل التخزين المؤقت...<br>";
if ($memcached->flush()) {
echo "تم إفراغ جميع بيانات التخزين المؤقت.<br>";
} else {
echo "فشل إفراغ التخزين المؤقت!<br>";
echo "رمز النتيجة: " . $memcached->getResultCode() . "<br>";
}
*/
?>
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
عبر زيارة ملف memcached_test.php
من خلال الموقع المحلي في ServBay سترى عرضاً لحالة الاتصال ونتائج تنفيذ عمليات التخزين والجلب.
ملاحظات هامة
- تأكد من أن خدمة Memcached في ServBay هي قيد التشغيل.
- عادةً ما يستمع Memcached على العنوان الافتراضي
127.0.0.1
(أوlocalhost
) والمنفذ11211
، ولا حاجة للتعديل غالباً. - إذا فشلت عملية الاتصال من PHP، تحقق من أن خدمة Memcached تعمل، وكذلك من عدم وجود جدار حماية يمنع الاتصال المحلي.
- دالة
addServer
تخص فئةMemcached
تضيف الخادم فقط ضمن مجموعة الخوادم المعرّفة، لكنها لا تقوم بفتح اتصال فوري أو التحقق من استجابة الخادم تلقائياً. عمليات الاتصال تُنفذ فعلياً عند استخدام دوال مثلget
وset
. يمكنك التحقق من نجاح العمليات عبر نتائج هذه الدوال أو عبر دالةgetResultCode()
.
الخلاصة
تمنحك بيئة ServBay طريقة ميسّرة جداً لاستخدام Memcached. بفضل حزمة Memcached المدمجة فيها إضافة إلى إضافة memcached
المثبتة والمفعلة للـ PHP بشكل افتراضي، لن تحتاج لأي إعدادات مُعقدة أو تثبيتات يدوية، وباستطاعتك فوراً الاستفادة من مزايا التخزين المؤقت عالي الكفاءة للبيانات أثناء تطوير تطبيقات PHP عالية الأداء على بيئتك المحلية.