DEV Community

Cover image for How to Connect Redis with PHP Using Docker Compose
Hòa Nguyễn Coder
Hòa Nguyễn Coder

Posted on

How to Connect Redis with PHP Using Docker Compose

Now I share with everyone how we can use Redis in PHP. We know what Redis is, right? In Programming, you've probably seen it somewhere before.

I just learned it recently and wanted to share a bit of knowledge with you. I'll save it here, sometimes we need it
Subscribe to Hòa Nguyễn Coder's YouTube channel
Demo :

Set up Redis from Docker Compose

# Đị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.
Enter fullscreen mode Exit fullscreen mode

In the Docker Compose code above, you see where you configured the app and redis, it must configure the environment variables to match each other, and it must be on the same network.

To run the docker-compose.yml file, you can run the following command:

docker-compose up --build 
\\or
docker-compose up --d

Enter fullscreen mode Exit fullscreen mode

Install the predis/predis library
After running docker-compose.yml, you will get a list of containers as follows:

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
Enter fullscreen mode Exit fullscreen mode

If you look above you will see the container names Redis, MySQL and Nginx, app. To execute into the Redis environment, use the following:

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>
Enter fullscreen mode Exit fullscreen mode

You see ping -> PONG means success
AUTH 12345678, I entered the password for it. you can set a password for it with the following command:
127.0.0.1:6379> CONFIGURATION SETTINGS request pass "12345678"

Using Redis in PHP
We need to install the library:

composer require predis/predis
Enter fullscreen mode Exit fullscreen mode

To install the above library, you need to run into the container containing your php source: see cmd below for easy visualization.

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

Enter fullscreen mode Exit fullscreen mode

After installing the library, you can proceed to use Redis in PHP

Create redis.php file

/*
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();
}

Enter fullscreen mode Exit fullscreen mode

Result of executing Redis.php file

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
Enter fullscreen mode Exit fullscreen mode

The article : How to Connect Redis with PHP Using Docker Compose

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

Top comments (0)