Ubuntu 20.04

نحوه راه اندازی یک شمارنده بازدید وب سایت با Redis و PHP در اوبونتو 20.04

معرفی

شمارنده ضربه برنامه‌ای است که تعداد بازدیدهایی را که صفحه وب شما دریافت کرده است را ثبت و نشان می‌دهد. شمارنده از 1 شروع می شود و هر بار که از یک صفحه وب بازدید می شود یک بار افزایش می یابد.

برای پیگیری بازدیدها، برنامه آمارگیری ضربه به شکلی از پایگاه داده نیاز دارد. در حالی که سیستم های مدیریت پایگاه داده مبتنی بر دیسک مانند MySQL می توانند کار کنند، یک پایگاه داده در حافظه از نظر سرعت، عملکرد، مقیاس پذیری، سادگی و سهولت استفاده بهتر است. اینجاست که سرور Redis وارد عمل می شود. Redis داده ها را به جای ضربه زدن به دیسک هر بار که یک عملیات ورودی/خروجی انجام می دهید، در رم کامپیوتر شما ذخیره می کند. این باعث افزایش قابل توجهی می شود.

برای ردیابی بازدیدهای سایت خود، به یک نقشه هش Redis نیاز دارید. این یک ساختار داده است که یک جفت کلید-مقدار را پیاده سازی می کند. نقشه هش یک جدول هش ارائه می دهد که کلیدها را به مقادیر نگاشت می کند. هنگامی که کاربر از صفحه وب شما بازدید می کند، کلیدی را بر اساس آدرس IP عمومی یا نام کاربری (برای کاربران تأیید شده) ایجاد می کنید و سپس تعداد بازدیدهای او را به مقدار 1 مقداردهی می کنید. سپس، هر بار که کاربر مجدداً از صفحه وب شما بازدید می کند. کل بازدیدهای آنها را از نقشه هش Redis بر اساس آدرس IP/نام کاربری آنها بررسی می کنید و مقدار را افزایش می دهید.

 

پیش نیازها

برای دنبال کردن این راهنما، مطمئن شوید که موارد زیر را دارید:

  • یک سرور اوبونتو 20.04 که با استفاده از راه اندازی اولیه سرور با راهنمای اوبونتو 20.04 پیکربندی شده است.
  • یک کاربر غیر ریشه با امتیازات sudo..
  • آپاچی و پی اچ پی.
  • سرور Redis

مرحله 1 – نصب برنامه افزودنی PHP Redis

در این مرحله، یک پسوند Redis را نصب می‌کنید که به PHP اجازه می‌دهد با سرور Redis صحبت کند. همچنین یک صفحه وب آزمایشی ایجاد خواهید کرد که نقشه هش Redis را برای ردیابی بازدیدهای وب پیاده سازی می کند.

قبل از نصب برنامه افزودنی Redis، فهرست اطلاعات بسته Ubuntu خود را بازخوانی کنید:

sudo apt update

سپس دستور زیر را برای نصب php-redis اجرا کنید. برنامه افزودنی یک API برای برقراری ارتباط با ذخیره‌سازی کلید ارزش سرور Redis ارائه می‌کند:

sudo apt install -y php-redis

برای بارگیری افزونه جدید، آپاچی را مجددا راه اندازی کنید:

sudo systemctl restart apache2

اکنون یک پسوند PHP نصب کرده اید که با سرور Redis شما صحبت می کند. در مرحله بعد، یک صفحه وب test.php در زیر فهرست اصلی وب سرور آپاچی ایجاد خواهید کرد. این فقط یک فایل نمونه است که بازدیدکنندگان هنگام بازدید از وب سایت شما با مرورگر درخواست می کنند. در زیر سرپوش، فایل صفحه test.php یک اسکریپت hit_counter.php را بارگیری می کند که بعداً برای پیگیری بازدید از صفحه با استفاده از سرور Redis ایجاد خواهید کرد.

در یک سناریوی واقعی، وب سایت شما ممکن است ده ها یا حتی صدها صفحه وب داشته باشد. برای این راهنما، شما یک صفحه وب واحد را برای اهداف نمایشی راه اندازی خواهید کرد.

در پنجره ترمینال خود، از nano برای ایجاد یک فایل test.php جدید در زیر پوشه اصلی وب سرور خود /var/www/html/ استفاده کنید:

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 برای اهداف ویرایش باز کنید:

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 جدید ایجاد کنید:

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

سپس اطلاعات زیر را در فایل وارد کنید. رمز عبور صحیح سرور Redis را جایگزین EXAMPLE_PASSWORD کنید:

/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 به عنوان $visitor => $totalVisits) { برای حلقه و نمایش آدرس IP بازدیدکنندگان و تعداد بازدیدهایی که از سایت شما داشته اند استفاده می کنید. شما از دستور Redis HGETALL برای بازیابی تمام فیلدها (آدرس IP) و مقادیر (کل بازدیدها به ازای هر آدرس IP) از نقشه siteVisitsMap استفاده می کنید.

اکنون یک صفحه آزمایشی، یک اسکریپت شمارنده ضربه و یک صفحه گزارش برای بررسی آمار سایت خود دارید. در مرحله بعد، عملکردهای شمارنده آمار خود را آزمایش خواهید کرد و خواهید دید که آیا همه چیز کار می کند یا خیر.

مرحله 4 – تست شمارشگر ضربه Redis

در این مرحله، کل منطق را برای شمارنده ضربه خود آزمایش خواهید کرد. به آدرس زیر در مرورگر وب خود بروید. IP-server-IP خود را با آدرس IP عمومی یا نام دامنه سرور خود جایگزین کنید.

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

برای ایجاد آمار کافی، صفحه را چندین بار با استفاده از دستگاه های مختلف بازخوانی کنید.

سپس، از URL زیر دیدن کنید تا گزارش بازدید از سایت خود را در جدول HTML نمایش دهید

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

اکنون باید گزارشی مشابه خروجی زیر مشاهده کنید.

شمارنده ضربه شما اکنون همانطور که انتظار می رود کار می کند.

نتیجه

در این راهنما، شما یک وب سایت با Redis و PHP روی سرور اوبونتو 20.04 خود راه اندازی کرده اید.

همانطور که در ابتدای این راهنما ذکر شد، استفاده از یک سیستم مدیریت پایگاه داده رابطه‌ای ممکن است همچنان کار کند، اما شما هزاران کد برای درج و به‌روزرسانی داده‌ها در جداول زیرین می‌نویسید. علاوه بر این، پایگاه‌های داده مبتنی بر دیسک ممکن است هنگام رشد سایت شما با مشکلات مقیاس‌پذیری مواجه شوند.


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/