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.
Çok işime yaradı hocam teşekkür ederim.
Yıllardır bu tür yazılımları öğrenmek istemisimdir. İhtiyacım olan bigiyi sizlerden aldım teşekkür ederim