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