Skip to content

MySQL Verilerini PHP Memcached Ile Önbelleğe Alımı

Mr.Mirket
2022-10-04 02:44:22 96 views
[ATTACH type="full"]68[/ATTACH]
Giriş

Memcached, web uygulamalarınızı hızlandırmak için kullanabileceğiniz dağıtılmış bir bellek önbelleğe alma sistemidir. Memcached, en hızlı SSD’den (Katı Hal Sürücüsü) bile birkaç kat daha hızlı olan sunucunuzun RAM’ini (Random Access Memory) kullandığı için yüksek hızlı bir veri depolama katmanı olarak çalışır.

İstemciler web uygulamanıza ilk kez bağlandıklarında, Memcached birincil depolama konumunuza bağlanır ve gelecekteki veri isteklerine daha hızlı hizmet vermek için verileri bir anahtar-değer belleğinde önbelleğe alır. Bu, disk G / Ç işlemlerini azaltır ve Memcached’i verileri önbelleğe almak için en iyi uygulamalardan biri yapar.

Bu kılavuzda, Ubuntu 20.04’te PHP ile MySQL verilerini önbelleğe almak ve almak için php-memcache kitaplığını kullanacaksınız. Daha sonra, verileri makinelerin ve insanların okuması ve yazması kolay olan JSON (JavaScript Object Notation) biçiminde çıktı alacaksınız.

Önkoşullar

Bu kılavuzu takip etmek için, aşağıdaki gereksinimleri karşıladığınızdan emin olun:

Bir Ubuntu 20.04 sunucusu.
Bir sudo kullanıcısı.
LAMP Yığını.
Memcached Sunucu.
php-memcache

Kitaplığı Kurun


Önce
SSH

sunucunuza ve
php-memcache

kitaplığı kurun . Bu, Memcached işlevlerini PHP kodunuz içinde kullanmanıza izin veren bir PHP modülüdür.
$ sudo apt update
$ sudo apt install -y php-memcache

php-memcache

Kitaplığı yüklemek için Apache web sunucusunu yeniden başlatın .
$ sudo systemctl restart apache2

test_db

Veritabanı Kurun


Ardından, MySQL sunucunuza bir kök kullanıcı olarak bağlanın.
$ sudo mysql -u root -p

Ardından MySQL sunucunuzun kök şifresini girin ve ENTERdevam etmek için tuşuna basın .
mysql>

İstemi aldığınızda , bir
test_db

veritabanı oluşturmak için aşağıdaki komutu çalıştırın .
mysql> CREATE DATABASE test_db;

test_db_user

MySQL sunucunuz için root olmayan bir kullanıcı oluşturun.
EXAMPLE_PASSWORD

Güçlü bir değerle değişmeyi unutmayın . MySQL’e PHP ile bağlanmak için bu kimlik bilgilerini kullanacaksınız.
mysql> CREATE USER 'test_db_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'EXAMPLE_PASSWORD';
mysql> GRANT ALL PRIVILEGES ON test_db.* TO 'test_db_user'@'localhost';
mysql> FLUSH PRIVILEGES;

MariaDB sunucusunu MySQL’in yerine geçme olarak kullanıyorsanız,
test_db_user

kullanıcıyı oluşturmak için yukarıdaki komutu aşağıdaki sözdizimine değiştirin .
MariaDB> GRANT ALL PRIVILEGES on test_db.* TO 'test_db_user'@'localhost' identified by 'EXAMPLE_PASSWORD';

test_db

Veritabanına geçin .
mysql> USE test_db;

Ardından bir
products

tablo oluşturun . Bu tablo, verileri MySQL veritabanınızda kalıcı olarak saklayacaktır. MySQL verileri, verileri sunucunuzun diskinde depoladığından, binlerce ürün eklediğinizde veya web uygulamanız viral hale geldiğinde ve birkaç kullanıcı aynı anda veritabanı sunucusuna girdiğinde zamanla yavaşlayabilir. Bu kılavuzun ilerleyen kısımlarında, bir PHP dosyasında Memcached sunucusunu kullanarak bu tablo için bir önbellek oluşturacaksınız.

Şimdilik sadece
products

masayı kur .
mysql> CREATE TABLE products
       (
           product_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
           product_name VARCHAR(50),
           retail_price DOUBLE
       ) ENGINE = InnoDB;

products

Tabloyu bazı kayıtlarla doldurun .
mysql> INSERT INTO products(product_name, retail_price) VALUES ('LEATHER JACKET', '99.95'😉;
mysql> INSERT INTO products(product_name, retail_price) VALUES ('LED MOUSE', '22.65'😉;
mysql> INSERT INTO products(product_name, retail_price) VALUES ('MOUSE PAD', '4.95'😉;
mysql> INSERT INTO products(product_name, retail_price) VALUES ('PURE COTTON BUDS', '2.85'😉;

Verilerin yerinde olduğundan emin olmak için tabloya
SELECT

karşı bir ifade çalıştırın
products

mysql> SELECT
       product_id,
       product_name,
       retail_price
       FROM products;

Tüm öğelerin aşağıda gösterildiği gibi görüntülendiğinden emin olun.
+------------+------------------+--------------+
| product_id | product_name     | retail_price |
+------------+------------------+--------------+
|          1 | LEATHER JACKET   |        99.95 |
|          2 | LED MOUSE        |        22.65 |
|          3 | MOUSE PAD        |         4.95 |
|          4 | PURE COTTON BUDS |         2.85 |
+------------+------------------+--------------+
4 rows in set (0.00 sec)

MySQL komut satırı arayüzünden çıkın.
mysql> QUIT;

Bir veritabanı tanımladınız, örnek bir tablo oluşturdunuz ve onu bazı verilerle doldurdunuz. Şimdi, verileri JSON biçiminde almak ve görüntülemek için sunucunuza bağlanan bir PHP betiği oluşturacaksınız.

Bir PHP Dosyası Oluşturun


Web sunucunuzun kök dizininde
nano

yeni bir
/var/www/html/products.php

dosya oluşturmak için kullanın .
$ sudo nano /var/www/html/products.php

Ardından, yeni bir
<?php

etiket açın ve
Content-Type:application/json

web istemcilerini bu dosyadan döndürülen verileri JSON biçiminde ele almaları konusunda bilgilendirmek için bir ekleyin .
<?php

header("Content-Type:application/json"😉;

Ardından, yeni bir
try {..

blok açın ve veritabanı değişkenlerini bildirin. Veritabanı değişkenlerini bu kılavuzda daha önce oluşturduğunuz veritabanı adı, kullanıcı ve parolayla eşleştirin.
try {

    $db_name     = 'test_db';
    $db_user     = 'test_db_user';
    $db_password = 'EXAMPLE_PASSWORD';
    $db_host     = 'localhost';

Ardından, yeni bir Memcache sınıfı
addServer

başlatın ve Memcached sunucunuza bağlantı noktasından bağlanmak için yöntemi çağırın
11211

   $memcache = new Memcache();
    $memcache->addServer("127.0.0.1", 11211);

Ardından bir
SELECT

SQL ifadesi tanımlayın .
products

Tabloyu sorgulamak ve MySQL sunucunuzda depolanan öğeleri almak için bu komutu kullanacaksınız .
   $sql = 'SELECT
            product_id,
            product_name,
            retail_price
            FROM products
           ';

Ardından, SQL ifadenizin değerini bir
md5

işlevde ileterek Memcached anahtarınız için yeni bir ad oluşturun . Bu, bir sorun durumunda giderilmesi daha kolay olan küçük bir anahtar oluşturur.
    $key = md5($sql);

Ardından, Memcached sunucusunun yukarıda oluşturduğunuz ada sahip bir anahtar içerip içermediğini kontrol etmek için aşağıdaki kod parçacığını yazın. Anahtarın boş bir değer (
!= null

) içermemesi durumunda, önbelleğe alınan verileri Memcached sunucusundan döndürün. Ardından,
$response['Memcache Data']

verilerinizi işaretlemek için ifadeyi kullanın, böylece komut dosyası önbellekten ne zaman döndüğünü bilirsiniz.
    $cached_data = $memcache->get($key);

    $response = [];

    if ($cached_data != null) {

        $response['Memcache Data'] = $cached_data;

Aksi takdirde, PDO Kitaplığını kullanarak MySQL sunucusundan veri almak için aşağıdaki kodu kullanın. Verileri MySQL veritabanından ilk kez aldıktan sonra
$memcache->set($key, $response, false, 5);

, verileri
5

saniyeler boyunca önbelleğe almak için komutu kullanın . İş mantığınıza bağlı olarak bu değeri yaşama süresini artırabilirsiniz. Ardından,
$response['MySQL Data']

MySQL sunucusundan döndürüldüğünde verileri işaretlemek için ifadeyi kullanın.
  } else {

        $pdo = new PDO("mysql:host=" . $db_host  . ";dbname=" . $db_name, $db_user, $db_password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        $stmt = $pdo->prepare($sql);
        $stmt->execute();

        $products = [];

        while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
            $products[] = $row;
        }

        $memcache->set($key, $products, false, 5);

        $response['MySQL Data'] =  $products;

    }

Son olarak, JSON kodlu verileri MySQL veya Memcached Cache’den yankılayın. Herhangi bir PDO hatası durumunda, onu yakalayın ve görüntüleyin.
    echo json_encode($response, JSON_PRETTY_PRINT) . "\n";

} catch(PDOException $e) {
    $error = [];
    $error['message'] = $e->getMessage();
    echo json_encode($error, JSON_PRETTY_PRINT) . "\n";
}

/var/www/html/products.php

Dosyanıza her şeyi girdiğinizde , aşağıdaki içeriğe benzer olmalıdır.
<?php

header("Content-Type:application/json"😉;

try {

    $db_name     = 'test_db';
    $db_user     = 'test_db_user';
    $db_password = 'EXAMPLE_PASSWORD';
    $db_host     = 'localhost';

    $memcache = new Memcache();
    $memcache->addServer("127.0.0.1", 11211);

    $sql = 'SELECT
            product_id,
            product_name,
            retail_price
            FROM products
           ';

    $key = md5($sql);

    $cached_data = $memcache->get($key);

    $response = [];

    if ($cached_data != null) {

        $response['Memcache Data'] = $cached_data;

    } else {

        $pdo = new PDO("mysql:host=" . $db_host  . ";dbname=" . $db_name, $db_user, $db_password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        $stmt = $pdo->prepare($sql);
        $stmt->execute();

        $products = [];

        while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
            $products[] = $row;
        }

        $memcache->set($key, $products, false, 5);

        $response['MySQL Data'] =  $products;

    }

    echo json_encode($response, JSON_PRETTY_PRINT) . "\n";

} catch(PDOException $e) {
    $error = [];
    $error['message'] = $e->getMessage();
    echo json_encode($error, JSON_PRETTY_PRINT) . "\n";
}

CTRL+ X, Ardından Yve tuşlarına basarak işiniz bittiğinde dosyayı kaydedin ve kapatın ENTER. Dosyanın beklendiği gibi çalışıp çalışmadığını görmek için bir sonraki adıma geçin.

Memcached Verilerini Test Edin


products.php

Döndürülen çıktıyı kontrol etmek için dosyayı iki kez çağırın . Bunu yapmak için
curl

aşağıdaki komutu çalıştırın .
$ curl http://localhost/products.php

Verileri ilk kez talep ettiğinizde,
"MySQL Data" [...]

aşağıda gösterildiği gibi MySQL sunucusundan ( ) gelmelidir .
  {
    "MySQL Data": [
        {
            "product_id": 1,
            "product_name": "LEATHER JACKET",
            "retail_price": 99.95
        },
        {
            "product_id": 2,
            "product_name": "LED MOUSE",
            "retail_price": 22.65
        },
        {
            "product_id": 3,
            "product_name": "MOUSE PAD",
            "retail_price": 4.95
        },
        {
            "product_id": 4,
            "product_name": "PURE COTTON BUDS",
            "retail_price": 2.85
        }
    ]
}

Memcached anahtarının süresi dolmadan önce aynısını tekrar çalıştırın.
$ curl http://localhost/products.php

Bu sefer, verileriniz Memcache’den (
"Memcache Data": [...]

) gelmelidir .
 {
    "Memcache Data": [
        {
            "product_id": 1,
            "product_name": "LEATHER JACKET",
            "retail_price": 99.95
        },
        {
            "product_id": 2,
            "product_name": "LED MOUSE",
            "retail_price": 22.65
        },
        {
            "product_id": 3,
            "product_name": "MOUSE PAD",
            "retail_price": 4.95
        },
        {
            "product_id": 4,
            "product_name": "PURE COTTON BUDS",
            "retail_price": 2.85
        }
    ]
  }

Yukarıdaki çıktılardan da görebileceğiniz gibi, PHP dosyanız beklendiği gibi çalışıyor ve verileri Memcached sunucusuyla önbelleğe alabiliyorsunuz.

Sonuç


Bu eğiticide,
php-memcache

MySQL verilerini Ubuntu 20.04 sunucusunda JSON biçiminde önbelleğe almak ve görüntülemek için PHP kitaplığını kullandınız . Web uygulamalarınızı veya MySQL’i arka uç sunucusu olarak kullanan dinamik web sitelerinizi hızlandırmak için bu kılavuzdaki önbelleğe alma mantığını kullanabilirsiniz.