How to Connect Redis with PHP Using Docker Compose

Hòa Nguyễn Coder

Published in Web Developer · Đã đăng vào tháng 12 1, 2024 11:41 PM

Nay mình chia sẻ với mọi người cách chúng ta có thể sử dụng Redis trong PHP. Chúng ta biết Redis là gì rồi đúng không nào, trong Lập trình thì ae chắc cũng đã gặp nó ở đâu rồi.

Mình cũng mới tìm hiểu gần đây, thấy hay chia sẻ kiến thức nhỏ nhỏ lại với ae , sẵn để đây đôi khi cần tới 

Demo : 

 

Setup Redis từ Docker Composer

Dưới đây là file docker-compose.yml mà mình vừa triển khai các project của mình, thấy chạy cũng khá ổn, ae cài Docker xong rồi, thì sử dụng nó thử xem nha 


# Định nghĩa phiên bản của Docker Compose. 
# Phiên bản 3.8 hỗ trợ các tính năng mới nhất (tương thích với Docker Engine hiện đại).
version: '3.8'  
services: # Chứa định nghĩa của từng dịch vụ.
  app: # chạy PHP (với Dockerfile được xây dựng tùy chỉnh)
    build:
      args:
        user: thanhhoa # Truyền các biến user và uid vào Dockerfile (sử dụng trong lệnh ARG).
        uid: 1000
      context: .                   # Chỉ định thư mục hiện tại làm chứa Dockerfile
      dockerfile: DockerfileV2     # Xây dựng image PHP từ Dockerfile
    working_dir: /var/www/html     #Thiết lập thư mục làm việc trong container là /var/www/html
    volumes: 
      - .:/var/www/html    # Gắn thư mục mã nguồn từ máy host (.) vào container tại /var/www/html
      - ./php-config/conf:/usr/local/etc/php/conf.d/  # Đồng bộ cấu hình PHP từ máy host
    environment:                 # Thiết lập các biến môi trường cho kết nối MySQL
      DB_HOST: db  # Tên của dịch vụ cơ sở dữ liệu (db)
      DB_DATABASE: db_hoanguyencoder
      DB_USERNAME: hoanguyencoder
      DB_PASSWORD: 12345678
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: 12345678
    networks:
      - networkHoaCoder # Kết nối dịch vụ này vào mạng , ví dụ : networkHoaCoder
    depends_on:
      - redis

  db:  
    platform: linux/amd64    # Đảm bảo sử dụng kiến trúc amd64 (trong Mac M1)
    image: mysql:5.7         # Sử dụng hình ảnh MySQL 5.7
    restart: always          # Tự động khởi động lại nếu container gặp sự cố. 
    environment:
      MYSQL_ROOT_PASSWORD: 12345678       # Mật khẩu cho tài khoản root
      MYSQL_DATABASE: db_hoanguyencoder   # Tạo cơ sở dữ liệu khi khởi động
      MYSQL_USER: hoanguyencoder          # Tài khoản người dùng
      MYSQL_PASSWORD: 12345678            # Mật khẩu cho tài khoản người dùng
    ports:
      - "3306:3306"                # Map cổng 3306 (cổng mặc định của MySQL) trên container với máy host
    volumes:
      - 'db-mysql:/var/lib/mysql'  # db-mysql: Volume lưu trữ dữ liệu MySQL.
      # Tệp db_hoanguyencoder.sql từ máy host sẽ được nạp khi container khởi động (đặt vào /docker-entrypoint-initdb.d/).
      - ./db_hoanguyencoder.sql:/docker-entrypoint-initdb.d/db_hoanguyencoder.sql  
    networks:
      - networkHoaCoder   # Kết nối dịch vụ vào mạng networkHoaCoder
  redis:
    image: redis:latest  # Sử dụng hình ảnh Redis mới nhất từ Docker Hub.
    container_name: redis # Đặt tên container là redis.
    restart: always   # Đảm bảo container tự động khởi động lại nếu bị dừng (do lỗi hoặc restart hệ thống).
    ports:
      - "6379:6379"  #  Map cổng 6379 của máy host sang container. Đây là cổng mặc định Redis sử dụng
    volumes:
      - /redis/dаta:/root/redis 
      - /redis/redis.conf:/usr/local/etc/redis/redis.conf 
    environment:
      - REDIS_PASSWORD=12345678
      - REDIS_PORT=6379
      - REDIS_DATABASES=16
    networks:
      - networkHoaCoder

  nginx:  # Máy chủ web xử lý các yêu cầu HTTP và chuyển tiếp đến PHP (FPM)
    image: nginx:latest  # Sử dụng phiên bản mới nhất của Nginx.
    ports:
      - "8080:80"               # Map cổng 80 trong container với cổng 8080 trên máy host
    volumes:
      - .:/var/www/html  # Gắn thư mục mã nguồn (.) vào /var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf  # Gắn tệp cấu hình Nginx từ máy host vào container tại /etc/nginx/nginx.conf
    depends_on: 
      - app  # Đảm bảo dịch vụ app khởi động trước khi Nginx chạy.
    networks:
      - networkHoaCoder  # Kết nối dịch vụ này vào mạng networkHoaCoder.

networks: 
  networkHoaCoder:
    driver: bridge  # driver: bridge: Tạo một mạng kiểu bridge, cho phép các container trong mạng này giao tiếp với nhau.
volumes:
    db-mysql:
        driver: local  # driver: local: Volume lưu trữ dữ liệu MySQL để không bị mất khi container dừng.

Trong đoạn code Compose trên bạn xem chổ mình cấu hình app và redis , nó phải cấu hình các biến môi trường cho phù hợp với nhau, đồng thời nó nằm cùng một network 

Để chạy được file docker-compose.yml bạn có thể chạy lệnh sau:


docker-compose up --build 

hoặc 


docker-compose up --d

Cài đặt thư viện predis/predis

Sau khi chạy docker-compose.yml xong bạn sẽ được một danh sách các container như sau : 


E:\FullStackDeveloper\PHP Tips and Tricks (main -> origin)
λ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS       PORTS                               NAMES
1756a775b2d9   nginx:latest           "/docker-entrypoint.…"   2 hours ago   Up 2 hours   0.0.0.0:8080->80/tcp                phptipsandtricks-nginx-1
4ed4b74c8b4b   phptipsandtricks-app   "docker-php-entrypoi…"   2 hours ago   Up 2 hours   9000/tcp                            phptipsandtricks-app-1
33605e421bed   redis:latest           "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6379->6379/tcp              redis
63b478befc6b   mysql:5.7              "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   phptipsandtricks-db-1

Bạn xem bên trên sẽ thấy được của tên container Redis, MySQL và Nginx, app. Để exec vào trong môi trường của Redis, bạn sử dụng như sau:


E:\FullStackDeveloper\PHP Tips and Tricks (main -> origin)    
λ docker exec -it redis sh                                    
# redis-cli                                                   
127.0.0.1:6379> AUTH 12345678                                 
OK                                                            
127.0.0.1:6379> ping                                          
PONG                                                          
127.0.0.1:6379> 

Bạn thấy ping -> PONG , có nghĩa là thành công nha 
AUTH 12345678 , mình nhập password cho nó , ah nếu bạn mặt định là không "password", thì có thể set password cho nó bằng câu lệnh sau:
127.0.0.1:6379> CONFIG SET requirepass "12345678"

Sử dụng Redis trong PHP 

Chúng ta cần cài đặt thư viện : 


composer require predis/predis

Để cài đặt thư viện trên, bạn cần chạy vào container chứa source php của bạn : bạn xem cmd bên dưới dễ hình dung


E:\FullStackDeveloper\PHP Tips and Tricks (main -> origin)
λ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS       PORTS                               NAMES
1756a775b2d9   nginx:latest           "/docker-entrypoint.…"   2 hours ago   Up 2 hours   0.0.0.0:8080->80/tcp                phptipsandtricks-nginx-1
4ed4b74c8b4b   phptipsandtricks-app   "docker-php-entrypoi…"   2 hours ago   Up 2 hours   9000/tcp                            phptipsandtricks-app-1
33605e421bed   redis:latest           "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6379->6379/tcp              redis
63b478befc6b   mysql:5.7              "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   phptipsandtricks-db-1

E:\FullStackDeveloper\PHP Tips and Tricks (main -> origin)
λ docker exec -it  phptipsandtricks-app-1 sh
/var/www/html # ls
Dockerfile                           QuyTrinhThietKe                      docker-compose-multiple-site.yml     index.php                            test
DockerfileV2                         README.md                            docker-compose-run-multiple-service  nginx.conf                           vendor
DockerfileV3                         composer.json                        docker-compose.yml                   origin)
Note-Docker-Compose.txt              composer.lock                        example                              php-config
Note.txt                             db_hoanguyencoder.sql                github.txt                           redis
/var/www/html # composer require predis/predis

Sau khi cài đặt thư viện xong, bạn có thể tiến hành sử dụng Redis trong PHP rồi 

Tạo file redis.php


<?php
/* 
Using Redis on Docker (docker-compose.yml) in PHP
Install : 
composer require predis/predis

Docker Compose : 

*/
require '../../vendor/autoload.php';
try {
    // Kết nối Redis
    $redis_host = getenv('REDIS_HOST') ?: 'default_host';
    $redis_port = getenv('REDIS_PORT') ?: 6379;
    $redis_pass = getenv('REDIS_PASSWORD') ?: null;
    $redis = new \Predis\Client([
        'scheme' => 'tcp',
        'host' => $redis_host, // Lấy biến môi trường từ file .env
        'port' => $redis_port, // Nếu cần sử dụng port,
        'password' => $redis_pass // Nếu cần sử dụng password
    ]);
    // Ví dụ:
    $key = "hoanguyencoder_dev";
    $ttl = 10; // thời gian sống của khóa (key) là 10 giây
    // Kiểm tra key, nếu không có ta set key cho nó
    $check = $redis->exists($key);
   
    // Nếu khóa (key) tồn tại
    if ($check) {
        // Kiểm tra thời gian sống của khóa (key)
        $ttl = $redis->ttl($key);
        echo $ttl ."\n";
        // Nếu khóa (key) còn thời gian sống
        if ($ttl > 0) {
            echo "Khóa $key tồn tại \n";
            echo $redis->get($key) ."\n";
        } 
        // Nếu khóa (key) đã hết thời gian sống
        else {
            echo "Khóa $key không có thời gian sống\n";
            // Xóa khóa (key)
            $redis->del($key);
            echo "Đã xóa khóa $key \n";
        }
    } 
    // Nếu khóa (key) không tồn tại
    else {
        echo "Lần đầu! \n";
        echo "Khóa $key không tồn tại \n";
        echo "Và khóa $key sẽ được tạo  \n";
        $redis->set($key, "Hoa Nguyen Coder");
        echo "Cài đặt thời gian $ttl giây  \n";
        $redis->expire($key, $ttl);
    }
   
    
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

Kết quả thực thi tệp Redis.php 


Lần đầu!
Khóa hoanguyencoder_dev không tồn tại
Và khóa hoanguyencoder_dev sẽ được tạo
Cài đặt thời gian 10 giây


7
Khóa hoanguyencoder_dev tồn tại
Hoa Nguyen Coder

Github : https://github.com/skipperhoa/php-tips-and-tricks/blob/main/example/app/redis.php

Github : https://github.com/skipperhoa/php-tips-and-tricks/blob/main/docker-compose.yml

Nếu bạn thấy đem lại kiến thức bổ ích, hãy Click xem quảng cáo trên trang website của mình nhé! 🚀