#MySQL Verilerini PHP Memcached ile Önbelleğe Alımı




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

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-memcacheKitaplığı Kurun

Önce SSHsunucunuza ve php-memcachekitaplığı 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-memcacheKitaplığı yüklemek için Apache web sunucusunu yeniden başlatın .

$ sudo systemctl restart apache2

test_dbVeritabanı 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_dbveritabanı oluşturmak için aşağıdaki komutu çalıştırın .

mysql> CREATE DATABASE test_db;

test_db_userMySQL sunucunuz için root olmayan bir kullanıcı oluşturun. EXAMPLE_PASSWORDGüç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_userkullanı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_dbVeritabanına geçin .

mysql> USE test_db;

Ardından bir productstablo 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 productsmasayı kur .

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

productsTabloyu 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 SELECTkarşı 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 nanoyeni bir /var/www/html/products.phpdosya oluşturmak için kullanın .

$ sudo nano /var/www/html/products.php

Ardından, yeni bir <?phpetiket açın ve Content-Type:application/jsonweb 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ı addServerbaş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 SELECTSQL ifadesi tanımlayın . productsTabloyu 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 md5iş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 5saniyeler 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.phpDosyanı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";
}

CTRLX, 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.phpDöndürülen çıktıyı kontrol etmek için dosyayı iki kez çağırın . Bunu yapmak için curlaş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-memcacheMySQL 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.