كيفية إعداد عداد زيارات الموقع باستخدام Redis و PHP على Ubuntu 20.04

اختار المؤلف مؤسسة مؤسسة برمجيات أباتشي لتلقي تبرع كجزء من برنامج الكتابة من أجل التبرعات.

مقدمة

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 العامة للزوار لتتبع زياراتهم.

المتطلبات المسبقة

لمتابعة هذا الدليل، تأكد من وجود العناصر التالية:

الخطوة 1 — تثبيت امتداد PHP Redis

في هذه الخطوة، ستقوم بتثبيت امتداد Redis الذي يسمح لـ PHP بالتحدث مع خادم Redis. ستقوم أيضًا بإنشاء صفحة ويب اختبارية تنفذ خريطة Redis لتتبع زيارات الويب.

قبل تثبيت امتداد Redis، قم بتحديث فهرس معلومات الحزم في أوبونتو الخاص بك:

  1. sudo apt update

ثم، قم بتشغيل الأمر التالي لتثبيت php-redis. الامتداد يوفر واجهة برمجة التطبيقات للتواصل مع خادم Redis لتخزين مفاتيح القيمة:

  1. sudo apt install -y php-redis

أعد تشغيل Apache لتحميل الامتداد الجديد:

  1. sudo systemctl restart apache2

لقد قمت الآن بتثبيت امتداد PHP يتحدث مع خادم Redis الخاص بك. فيما يلي، ستقوم بإنشاء صفحة ويب test.php تحت الدليل الجذري لخادم الويب Apache. هذا ملف عينة يطلبه الزوار عند زيارة موقع الويب الخاص بك باستخدام متصفح. في الخلفية، يقوم ملف الصفحة test.php بتحميل سكريبت hit_counter.php الذي ستقوم بإنشائه لتتبع زيارات الصفحة باستخدام خادم Redis.

في سيناريو الحياة الحقيقية، قد يحتوي موقع الويب الخاص بك على عشرات أو حتى مئات من الصفحات الويب. لهذا الدليل، ستقوم بإعداد صفحة ويب واحدة فقط لأغراض العرض التوضيحي.

في نافذة الطرفية الخاصة بك، استخدم nano لإنشاء ملف test.php جديد تحت الدليل الجذري لخادم الويب الخاص بك /var/www/html/:

  1. sudo nano /var/www/html/test.php

ثم، أدخل المعلومات التالية في ملف 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 لأغراض التحرير:

  1. sudo nano /var/www/html/hit_counter.php

بعد إنشاء ملف hit_counter.php الآن، افتح علامة PHP جديدة <?php. ثم، داخل كتلة try { أدخل الكود التالي للاتصال بخادم Redis المحلي على المنفذ 6379. استبدل EXAMPLE_PASSWORD بكلمة مرور المصادقة لخادم Redis:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

بعد ذلك، قم بإعطاء خريطة التجزئة Redis($siteVisitsMap) اسمًا من اختيارك. يستخدم هذا الدليل siteStats لأغراض العرض:

/var/www/html/hit_counter.php

        $siteVisitsMap = 'siteStats';

بعد تحديد خريطة الهاش لـ Redis، ستقوم الآن بتهيئة مفتاح Redis فارغًا ($visitorHashKey). بعد ذلك، ستملأه بعناوين IP للزوار. ستستخدم قيمة متغير $visitorHashKey لتحديد هوية كل زائر يطلب صفحة الويب الخاصة بك:

/var/www/html/hit_counter.php


        $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 (...) {...}:

/var/www/html/hit_counter.php

        $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 مشابهًا للشيفرة التالية:

/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 جديد:

  1. sudo nano /var/www/html/log_report.php

ثم، أدخل المعلومات أدناه في الملف. قم بتبديل EXAMPLE_PASSWORD بكلمة المرور الصحيحة لخادم Redis:

/var/www/html/log.php

<!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 ذات الذاكرة، اتبع الدلائل أدناه:

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-website-hit-counter-with-redis-and-php-on-ubuntu-20-04