用PHP Memcached库缓存MySQL数据

Memcached是一种分布式内存缓存系统,可以用来提高web应用程序的速度。Memcached作为一个高速数据存储层工作,因为它利用了服务器的RAM(随机访问内存),它甚至比最快的SSD(固态驱动器)快好几倍,今天和大家一起学习用PHP Memcached库缓存MySQL数据

mysql

当客户机第一次连接到我们的web应用程序时,Memcached将连接到主存储位置,并将数据缓存到key-value内存中,以便更快地为未来的数据请求提供服务。这减少了磁盘I/O操作,使Memcached成为缓存数据的最佳应用程序之一。

在本文中,我们将使用PHP -memcache库在Ubuntu 20.04上使用PHP缓存和检索MySQL数据。然后,我们将以JSON (JavaScript对象表示法)格式输出数据,这对于机器和人来说很容易读写。

安装php-memcache库

首先,SSH到服务器并安装php-memcache库。这是一个PHP模块,允许我们在PHP代码中使用Memcached功能。

$ sudo apt update

$ sudo apt install -y php-memcache

重新启动Apache web服务器以加载php-memcache库。

$ sudo systemctl restart apache2

设置一个test_db数据库

接下来,以root用户连接到MySQL服务器。

$ sudo mysql -u root -p

然后,输入MySQL服务器的root密码,按ENTER键继续。得到mysql>提示符后,运行下面的命令创建test_db数据库。

mysql> CREATE DATABASE test_db;

为MySQL服务器创建一个非根用户test_db_user。记住用强值更改EXAMPLE_PASSWORD。我们将使用这些凭据用PHP连接到MySQL。

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服务器作为MySQL的临时替代品,请将上面的命令更改为下面的语法,以创建test_db_user用户。

MariaDB> GRANT ALL PRIVILEGES on test_db.* TO 'test_db_user'@'localhost' identified by 'EXAMPLE_PASSWORD';

切换到test_db数据库。

mysql> USE test_db;

接下来,创建一个products表。该表将在MySQL数据库中持久存储数据。由于MySQL数据将数据存储到服务器的磁盘中,当我们添加数以千计的产品或web应用程序像病毒一样传播,并且几个用户同时访问数据库服务器时,它可能会随着时间的推移而变慢。在本指南的后面部分,我们将在一个PHP文件中使用Memcached服务器为该表创建一个缓存。

现在,只设置products表。

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

用一些记录填充products表。

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');

对products表运行一个SELECT语句,以确保数据就位。

mysql> SELECT       product_id,       product_name,       retail_price       FROM products;

确保所有项目都显示如下所示。

+------------+------------------+--------------+| 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命令行。

mysql> QUIT;

我们已经定义了一个数据库,创建了一个示例表,并使用一些数据填充了它。现在,我们将创建一个连接到服务器的PHP脚本,以获取和显示JSON格式的数据。

创建一个PHP文件

使用nano在web服务器的根目录下创建一个新的/var/www/html/products.php文件。

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

接下来,打开一个新的php标记并添加Content-Type:application/json以通知web客户机以json格式处理从该文件返回的数据。

<?php header("Content-Type:application/json");

然后,打开一个新的try {..阻塞并声明数据库变量。将数据库变量与我们在本指南前面创建的数据库名称、用户和密码匹配。

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

接下来,启动一个新的Memcache类并调用addServer方法连接到端口11211上的Memcached服务器。

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

然后定义一个SELECT SQL语句。我们将使用这个命令查询products表并检索存储在MySQL服务器中的项。

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

接下来,通过在md5函数中传递SQL语句的值,为Memcached键创建一个新名称。这创建了一个小键,在出现问题时更容易排除故障。

    $key = md5($sql);

接下来,键入下面的代码片段,检查Memcached服务器是否包含与上面生成的名称相同的键。如果键不包含空值(!= null),从Memcached服务器返回缓存的数据。然后,使用$response['Memcache Data']语句标记数据,以便知道脚本何时从缓存返回数据。

$cached_data = $memcache->get($key);     $response = [];     if ($cached_data != null) {         $response['Memcache Data'] = $cached_data;

否则,使用下面的代码使用PDO库从MySQL服务器检索数据。第一次从MySQL数据库中检索数据后,使用$memcache->set($key, $response, false, 5);命令缓存数据5秒。我们可以根据业务逻辑增加实际价值。然后,使用$response['MySQL Data']语句来标记从MySQL服务器返回的数据。

  } 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;     }

最后,从MySQL或Memcached缓存回显JSON编码的数据。在任何PDO错误的情况下,捕获它并显示它。

  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文件中时,它应该类似于以下内容。

<?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,然后按Y和ENTER。继续下一步,查看文件是否按预期工作。

测试Memcached数据

调用product .php文件两次以检查返回的输出。为此,运行下面的curl命令。

$ curl http://localhost/products.php

当我们第一次请求数据时,它应该来自MySQL服务器(“MySQL data”[…]),如下所示。

  {    "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键过期之前再次运行相同的命令。

$ curl http://localhost/products.php

这一次,我们的数据应该来自Memcache("Memcache data ":[…])。

  {    "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        }    ]  }

从上面的输出可以看到,PHP文件按照预期工作,并且可以使用Memcached服务器缓存数据。

在本教程中,我们已经使用PHP PHP -memcache库在Ubuntu 20.04服务器上以JSON格式缓存和显示MySQL数据。我们可以使用这个指南中的缓存逻辑来加速使用MySQL作为后端服务器的web应用程序或动态网站。

未经允许不得转载:便宜VPS网 » 用PHP Memcached库缓存MySQL数据