כיצד להגדיר מונה פגיעות אתר עם Redis ו-PHP על Ubuntu 20.04

הסופר בחר ב- Apache Software Foundation לקבל תרומה כחלק מתוכנית Write for Donations.

הקדמה

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 של המחשב שלך במקום להיכנס לדיסק בכל פעם שאתה מבצע פעולת קלט/פלט. זה מגביר את התפוקה באופן משמעותי.

כדי לעקוב אחר הביקורים באתר שלך, אתה צריך מפת רידיס. זהו מבנה נתונים שמיישם זוג מפתח-ערך. מפת רידיס מספקת טבלת גיבוב שממפה מפתחות לערכים. ברגע שמשתמש מבקר בדף האינטרנט שלך, אתה יוצר מפתח על פי כתובת ה-IP הציבורית שלהם או שם המשתמש (למשתמשים מאומתים), ואז אתה מאתחל את מספר הביקורים הכולל שלהם לערך של 1. לאחר מכן, בכל פעם שהמשתמש מבקר מחדש בדף האינטרנט שלך, אתה בודק את מספר הביקורים הכולל שלהם ממפת רידיס על פי כתובת ה-IP/שם המשתמש שלהם ומגדיל את הערך.

במדריך זה, תגדיר את סופר הפגיעות באתר עם רידיס ו-PHP על השרת שלך Ubuntu 20.04. התסריטים ב-PHP במדריך זה משתמשים בכתובות ה-IP הציבוריות של המבקרים כדי לעקוב אחר הביקורים שלהם.

דרישות מוקדמות

כדי לעקוב אחרי המדריך הזה, וודא שיש לך את הבאים:

שלב 1 — התקנת תוסף PHP Redis

בשלב זה, תתקינו את התוסף Redis שמאפשר ל־PHP לתקשר עם שרת Redis. תיצורו גם דף אינטרנט בדיקה שמיישם את ה־Redis hash map כדי לעקוב אחר ביקורים באתר.

לפני שתתקינו את התוסף Redis, רעננו את אינדקס מידע החבילות של Ubuntu:

  1. sudo apt update

אז, הפעל את הפקודה הבאה כדי להתקין php-redis. התוסף מספק API לתקשורת עם האחסון מפתח-ערך של שרת 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. לאחר מכן, תיצור מפת hash של 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');

לבסוף, הענק שם למפת ה-hash של Redis ($siteVisitsMap) לבחירתך. מדריך זה משתמש ב- siteStats למטרות הדגמה:

/var/www/html/hit_counter.php

        $siteVisitsMap = 'siteStats';

אחרי שהגדרת את מפת ה־hash של 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();
    }

שמור וסגור את הקובץ כאשר תסיים לערוך. עכשיו, קודם תיצר סקריפט 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); כדי לאחזר את מפת ההתקנות שלך בדף האינטרנט. לאחר מכן, אתה משתמש בהצהרת foreach ($siteStats as $visitor => $totalVisits) { ב-PHP כדי לערוך לולאה ולהציג את כתובות ה-IP של המבקרים ואת מספר הביקורים שעשו באתר שלך. אתה משתמש בפקודת HGETALL של Redis כדי לאחזר את כל השדות (כתובות ה-IP) והערכים (סך כל הביקורים לכל כתובת IP) מתוך המפת siteVisitsMap.

כעת יש לך עמוד בדיקה, סקר סקריפט ספירת היקום ועמוד דוח כדי לבדוק את סטטיסטיקות האתר שלך. לאחר מכן, תבדוק את הפונקציונליות של ספירת היקום שלך ותראה האם הכל עובד.

שלב 4 — בדיקת ספירת היקום של Redis

בשלב זה, תבדוק את הלוגיקה שלך עבור ספירת היקום. נווט לכתובת ה-URL הבאה בדפדפן האינטרנט שלך. החלף את כתובת-ה-IP-של-השרת-שלך בכתובת ה-IP הציבורית של השרת שלך או בשם הדומיין שלו.

http://your-server-IP/test.php

רענן את העמוד מספר פעמים באמצעות מכשירים שונים כדי לייצר סטטיסטיקות מספיקות. לאחר כל ביקור, אתה צריך לקבל את הפלט הבא.

בקר לאחר מכן בכתובת ה-URL הבאה כדי לקבל את הדוח על ביקורי האתר שלך מוצג בטבלת 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