اختار المؤلف مؤسسة مؤسسة برمجيات أباتشي لتلقي تبرع كجزء من برنامج الكتابة من أجل التبرعات.
مقدمة
A hit counter is an application that records and indicates the number of visits your web page has received. The counter starts from 1 and is incremented once every time a web page is visited.
لتتبع الزيارات، يتطلب تطبيق عداد الزيارات نوعًا من قاعدة البيانات. في حين يمكن أن تعمل أنظمة إدارة قواعد البيانات المستندة إلى القرص مثل MySQL، إلا أن قاعدة بيانات الذاكرة الحية أفضل من حيث السرعة والأداء وقابلية التوسع والبساطة وسهولة الاستخدام. هنا تأتي دور خادم Redis. تخزن Redis البيانات في ذاكرة الوصول العشوائي (RAM) في جهاز الكمبيوتر الخاص بك بدلاً من ضرب القرص في كل مرة تقوم فيها بعملية الإدخال/الإخراج. يزيد ذلك من المعدل الكلي للإدخال/الإخراج بشكل كبير.
لتتبع زيارات موقعك، تحتاج إلى خريطة تجزئة Redis. هذه هي هيكلة البيانات التي تنفذ زوج المفتاح والقيمة. توفر خريطة التجزئة تابع تجزئة يقوم برسم الجدول التجزئة الذي يخرج المفاتيح إلى القيم. بمجرد زيارة المستخدم لصفحة الويب الخاصة بك، تنشئ مفتاحًا بناءً على عنوان IP العام الخاص بهم أو اسم المستخدم (بالنسبة للمستخدمين المصادق عليهم)، ثم تقوم بتهيئة زياراتهم الإجمالية إلى قيمة 1. ثم، في كل مرة يعيد فيها المستخدم زيارة صفحتك على الويب، تحقق من زياراتهم الإجمالية من خريطة تجزئة Redis بناءً على عنوان IP/اسم المستخدم الخاص بهم وتزيد القيمة.
في هذا الدليل، ستقوم بإعداد عداد زيارات الموقع باستخدام Redis و PHP على خادم Ubuntu 20.04 الخاص بك. تستخدم النصوص PHP في هذا الدليل عناوين IP العامة للزوار لتتبع زياراتهم.
المتطلبات المسبقة
لمتابعة هذا الدليل، تأكد من وجود العناصر التالية:
-
خادم Ubuntu 20.04 مكون باستخدام دليل إعداد الخادم الأولي مع Ubuntu 20.04.
-
مستخدم غير جذري مع امتيازات
sudo
. اتبع دليلنا كيفية إنشاء مستخدم جديد بتمكين Sudo على Ubuntu 20.04 [Quickstart] لإعداد مستخدم sudo غير جذري. -
Apache و PHP. لإعداد هذه العناصر، استخدم دليلنا كيفية تثبيت Linux، Apache، MySQL، PHP (LAMP) stack على Ubuntu 20.04. يمكنك تخطي الخطوة 2 — تثبيت MySQL و الخطوة 4 — إنشاء مضيف افتراضي لموقع الويب الخاص بك لأنك لا تحتاج إلى قاعدة بيانات MySQL أو مضيف افتراضي لاختبار هذا الدليل.
-
خادم Redis. اقرأ دليلنا كيفية تثبيت وتأمين ريديس على أوبونتو 20.04 [بدء سريع] لتثبيت وتأمين خادم Redis.
الخطوة 1 — تثبيت امتداد PHP Redis
في هذه الخطوة، ستقوم بتثبيت امتداد Redis الذي يسمح لـ PHP بالتحدث مع خادم Redis. ستقوم أيضًا بإنشاء صفحة ويب اختبارية تنفذ خريطة Redis لتتبع زيارات الويب.
قبل تثبيت امتداد Redis، قم بتحديث فهرس معلومات الحزم في أوبونتو الخاص بك:
ثم، قم بتشغيل الأمر التالي لتثبيت php-redis
. الامتداد يوفر واجهة برمجة التطبيقات للتواصل مع خادم Redis لتخزين مفاتيح القيمة:
أعد تشغيل Apache لتحميل الامتداد الجديد:
لقد قمت الآن بتثبيت امتداد PHP يتحدث مع خادم Redis الخاص بك. فيما يلي، ستقوم بإنشاء صفحة ويب test.php
تحت الدليل الجذري لخادم الويب Apache. هذا ملف عينة يطلبه الزوار عند زيارة موقع الويب الخاص بك باستخدام متصفح. في الخلفية، يقوم ملف الصفحة test.php
بتحميل سكريبت hit_counter.php
الذي ستقوم بإنشائه لتتبع زيارات الصفحة باستخدام خادم Redis.
في سيناريو الحياة الحقيقية، قد يحتوي موقع الويب الخاص بك على عشرات أو حتى مئات من الصفحات الويب. لهذا الدليل، ستقوم بإعداد صفحة ويب واحدة فقط لأغراض العرض التوضيحي.
في نافذة الطرفية الخاصة بك، استخدم nano
لإنشاء ملف test.php
جديد تحت الدليل الجذري لخادم الويب الخاص بك /var/www/html/
:
ثم، أدخل المعلومات التالية في ملف test.php
:
<?php
require_once 'hit_counter.php';
?>
<!DOCTYPE html>
<html>
<head>
<title>Sample Test Page</title>
</head>
<body>
<h1>Sample test page</h1>
<p>This is a sample test page.</p>
</body>
</html>
احفظ وأغلق الملف عندما تنتهي من التحرير. في هذه الخطوة، قمت بإنشاء صفحة ويب HTML بسيطة تحمل ملف hit_counter.php
عند الزيارة. فيما بعد، ستقوم بكتابة سكريبت hit_counter.php
لتتبع زيارات صفحة الاختبار.
الخطوة 2 — إنشاء سكريبت تتبع الزيارات في Redis
عند العمل في بيئة الإنتاج، من المعتاد جدًا فصل ملفات PHP قابلة لإعادة الاستخدام. يسمح لك هذا بتنفيذ المنطق في هذه الملفات على أجزاء مختلفة من المشروع فقط عن طريق تضمين مساراتها بدلاً من نسخ ولصق الكود. يجعل هذا الصيانة أسهل حيث تحتاج فقط إلى تحرير ملف واحد في حالة الحاجة إلى تغيير المنطق. هذا يوفر لك الكثير من الوقت.
سوف تطبق نفس الاستراتيجية في هذا الدليل. ستقوم بإنشاء ملف واحد hit_counter.php
يمكنك تضمينه في أي صفحة ويب تتطلب تتبع الزوار.
في هذا الملف، ستستخدم مكتبة php-redis
للاتصال بخادم Redis من PHP. ثم، ستقوم بإنشاء خريطة تجزئة Redis لتخزين عدد الزيارات التي قام بها زائر لموقعك. ستستخدم عناوين IP الفريدة للزوار كمفاتيح Redis لتمييز عدد الزيارات لكل زائر في خادم Redis.
في نافذة الطرفية الخاصة بك، افتح ملف hit_counter.php
جديد باستخدام nano
لأغراض التحرير:
بعد إنشاء ملف hit_counter.php
الآن، افتح علامة PHP جديدة <?php
. ثم، داخل كتلة try {
أدخل الكود التالي للاتصال بخادم Redis المحلي على المنفذ 6379
. استبدل EXAMPLE_PASSWORD
بكلمة مرور المصادقة لخادم Redis:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
بعد ذلك، قم بإعطاء خريطة التجزئة Redis($siteVisitsMap
) اسمًا من اختيارك. يستخدم هذا الدليل siteStats
لأغراض العرض:
$siteVisitsMap = 'siteStats';
بعد تحديد خريطة الهاش لـ Redis، ستقوم الآن بتهيئة مفتاح Redis فارغًا ($visitorHashKey
). بعد ذلك، ستملأه بعناوين IP للزوار. ستستخدم قيمة متغير $visitorHashKey
لتحديد هوية كل زائر يطلب صفحة الويب الخاصة بك:
$visitorHashKey = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$visitorHashKey = $_SERVER['REMOTE_ADDR'];
}
في هذا الكود، تستخدم عبارة PHP if
لتحديد عنوان IP للزائر عن طريق التحقق مما إذا كانت المتغيرات $_SERVER['HTTP_CLIENT_IP']
، $_SERVER['HTTP_X_FORWARDED_FOR']
، أو $_SERVER['REMOTE_ADDR']
ممتلئة.
بعد ذلك، قم بتهيئة متغير $totalVisits
لتخزين إجمالي الزيارات لكل عنوان IP وتعيين قيمة 0. ثم، استخدم عبارة PHP if (...) {...} else {...}
و $redis->hExists($siteVisitsMap، $visitorHashKey)
للتحقق مما إذا كان لدى عنوان IP أي إدخالات في خادم Redis.
ستستخدم العبارة if ($redis->hExists($siteVisitsMap، $visitorHashKey)) {...}
للتحقق مما إذا كان $visitorHashKey
موجودًا في خريطة تسمى $siteVisitsMap
.
في حال وجود الخريطة والمفتاح بعنوان IP المسمى في خادم Redis، استرجعها باستخدام البيان $visitorData = $redis->hMget($siteVisitsMap، array($visitorHashKey));
واستخدم $totalVisits = $visitorData[$visitorHashKey] + 1;
لزيادة متغير $totalVisits
. أنت تستخدم البيان $redis->hMget
للحصول على بيانات عدد الزيارات المرتبطة بعنوان IP. تقبل وظيفة hMget
اسم الخريطة ($siteVisitsMap
) ومصفوفة من المفاتيح التي تريد استرجاعها من خادم Redis. في هذه الحالة، لديك مفتاح واحد فقط ($visitorHashKey
)، ولكن يجب عليك تحويله إلى مصفوفة باستخدام البيان array($visitorHashKey)
.
في حال وجود عنوان IP للمرة الأولى في النص، ضبط متغير $totalVisits
على 1. وأخيرًا، استخدم $redis->hSet($siteVisitsMap، $visitorHashKey، $totalVisits);
لتعيين قيمة $visitorHashKey
وفقًا لنتائج البيان السابق if (...) {...} else {...}
. البيان $redis->hSet($siteVisitsMap، $visitorHashKey، $totalVisits)
ينشئ خريطة تجريبية $siteVisitsMap
في خادم Redis بمفتاح يحمل اسم $visitorHashKey
بقيمة $totalVisits
.
ثم، استقبل الزائر بطباعة إجمالي الزيارات وأغلق الكتلة } catch (...) {...}
:
$totalVisits = 0;
if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {
$visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
$totalVisits = $visitorData[$visitorHashKey] + 1;
} else {
$totalVisits = 1;
}
$redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
echo "Welcome, you've visited this page " . $totalVisits . " times\n";
} catch (Exception $e) {
echo $e->getMessage();
}
عند الانتهاء، يجب أن يكون ملفك /var/www/html/hit_counter.php
مشابهًا للشيفرة التالية:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
$siteVisitsMap = 'siteStats';
$visitorHashKey = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$visitorHashKey = $_SERVER['REMOTE_ADDR'];
}
$totalVisits = 0;
if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {
$visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
$totalVisits = $visitorData[$visitorHashKey] + 1;
} else {
$totalVisits = 1;
}
$redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
echo "Welcome, you've visited this page " . $totalVisits . " times\n";
} catch (Exception $e) {
echo $e->getMessage();
}
احفظ وأغلق الملف عند الانتهاء من التحرير. لقد قمت الآن بترميز سكريبت hit_counter.php
. في الخطوة التالية، ستقوم بإنشاء سكريبت PHP آخر يولد تقريرًا من البيانات التي تم جمعها في خريطة الهاش Redis.
الخطوة 3 — إنشاء سكريبت تقرير إحصائيات الموقع
بمجرد جمع البيانات في خريطة هاش Redis، قد لا يكون لديك أي معنى إذا لم تتمكن من استرجاع وتمثيل المعلومات في تقرير. في هذه الخطوة، ستقوم بإنشاء تقرير سجل لعرض الزوار المختلفين للموقع وإجمالي الزيارات التي قاموا بها على صفحة الويب التجريبية.
لإنشاء سكريبت تقرير السجل، قم بتشغيل nano
في نافذة الطرفية الخاصة بك وأنشئ ملف /var/www/html/log_report.php
جديد:
ثم، أدخل المعلومات أدناه في الملف. قم بتبديل EXAMPLE_PASSWORD
بكلمة المرور الصحيحة لخادم Redis:
<!DOCTYPE html>
<html>
<head>
<title>Site Visits Report</title>
</head>
<body>
<h1>Site Visits Report</h1>
<table border = '1'>
<tr>
<th>No.</th>
<th>Visitor</th>
<th>Total Visits</th>
</tr>
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
$siteVisitsMap = 'siteStats';
$siteStats = $redis->HGETALL($siteVisitsMap);
$i = 1;
foreach ($siteStats as $visitor => $totalVisits) {
echo "<tr>";
echo "<td align = 'left'>" . $i . "." . "</td>";
echo "<td align = 'left'>" . $visitor . "</td>";
echo "<td align = 'right'>" . $totalVisits . "</td>";
echo "</tr>";
$i++;
}
} catch (Exception $e) {
echo $e->getMessage();
}
?>
</table>
</body>
</html>
احفظ وأغلق الملف عند الانتهاء من التحرير. في النص أعلاه، أنت تتصل بخادم Redis وتستخدم البيان $redis->HGETALL($siteVisitsMap);
لاسترداد خريطة التجارب لزيارات صفحتك على الويب. ثم، أنت تستخدم البيان PHP foreach ($siteStats as $visitor => $totalVisits) {
للتكرار وعرض عناوين IP للزوار وعدد الزيارات التي قاموا بها إلى موقعك. أنت تستخدم أمر Redis HGETALL
لاسترداد جميع الحقول (عناوين IP) والقيم (إجمالي الزيارات لكل عنوان IP) من الخريطة siteVisitsMap
.
لديك الآن صفحة اختبار ونص سجل زيارات، وصفحة تقرير للتحقق من إحصائيات موقعك. بعد ذلك، ستقوم باختبار وظائف سجل الزيارات الخاص بك والتحقق مما إذا كان كل شيء يعمل.
الخطوة 4 — اختبار سجل الزيارات في Redis
في هذه الخطوة، ستقوم باختبار منطق سجل الزيارات بأكمله. انتقل إلى العنوان التالي على متصفح الويب الخاص بك. استبدل your-server-IP
بعنوان IP العام لخادمك أو اسم النطاق.
http://your-server-IP/test.php
قم بتحديث الصفحة عدة مرات باستخدام أجهزة مختلفة لتوليد إحصائيات كافية. بعد كل زيارة، يجب أن تتلقى النتيجة التالية.
ثم، قم بزيارة العنوان التالي لعرض تقرير زيارات موقعك في جدول HTML
http://your-server-IP/log_report.php
يجب أن ترى الآن تقريرًا مشابهًا للنتيجة التالية.
تعمل عداد الزيارات الخاص بك الآن كما هو متوقع.
الختام
في هذا الدليل، قمت بإعداد عداد زيارات لموقع الويب باستخدام Redis و PHP على خادم Ubuntu 20.04 الخاص بك.
كما يمكنك أن ترى من رمز المصدر العيني في هذا الدليل، يوفر Redis أساليب أنظف لإنشاء وتحديث الخرائط الهاش.
كما ذكر في بداية هذا الدليل، قد تعمل استخدام نظام إدارة قاعدة البيانات العلاقية ولكن ستكتب الكثير من الشفرة لإدراج وتحديث البيانات في الجداول الأساسية. بالإضافة إلى ذلك، قد تواجه قواعد البيانات المستندة إلى القرص مشكلات في التوسع عندما ينمو موقعك.
لمزيد من المعلومات حول استخدام قاعدة بيانات Redis ذات الذاكرة، اتبع الدلائل أدناه: