Khi phát triển các dự án PHP, có thể mỗi dự án sẽ yêu cầu một phiên bản PHP khác nhau. Điều này là dễ hiểu vì tính chất của dự án dù là mã nguồn mở hay đóng. Ví dụ, Laravel 10 chỉ hỗ trợ PHP 8.1 trở lên, nhưng WordPress phiên bản từ 5.8 trở xuống thì lại không. Đương nhiên, bạn có thể cập nhật lên WordPress mới nhất để cả hai đều cùng vận hành trên PHP 8.1. Nhưng vấn đề không đơn giản như vậy? “Mà khoan, vụ này nó lại liên quan gì đến Devilbox vậy?!”.
Cả Laravel và WordPress đều là mã nguồn mở, việc nâng cấp về cơ bản khá là đơn giản vì đa phần chúng đều có tài liệu đầy đủ. Tuy nhiên, đối với các dự án PHP tự phát triển thì đều này là rất khó khăn. Thậm chí là không thể vì có một số tính năng chỉ hoạt động trên đúng phiên bản PHP đó.
Và đó chính là nội dung của bài viết này. Khi bạn phải quản lý nhiều dự án PHP với Devilbox nhưng mỗi dự án lại yêu cầu một phiên bản PHP khác nhau. Vậy thì làm thế nào để cấu hình với Devilbox khi mà mặc định chỉ được lựa chọn một phiên bản PHP duy nhất? Để trả lời câu hỏi này, trước tiên chúng ta hãy chuẩn bị một chút. “Giờ thấy vụ này liên quan tới Devilbox chưa chàng trai trẻ?!”.
Để bài hướng dẫn được đơn giản, tôi cũng sẽ sử dụng lại cấu trúc thư mục đã đề xuất trong các phần trước. Cụ thể như sau:
├── devilbox
├── projects
├── my_project -> myproject.dvl.to
| └── public
| └── index.php
├── php54 -> php54.dvl.to
| └── public
| └── index.php
└── php74 -> php74.dvl.to
└── public
└── index.php
Chúng ta sẽ tạo lần lượt ba dự án là my_project
, php54
và php74
tương ứng với các tên miền như trên. Trong đó, my_project
sẽ chạy phiên bản PHP mặc định khi khởi động là 8.1. Hai dự án còn lại sẽ tương tự như tên dự án lần lượt là 5.4 và 7.4.
Nội dung của tập tin index.php
chỉ đơn giản là hiển thị phiên bản PHP đang sử dụng để dễ kiểm chứng:
<?php
echo 'Current PHP version: ' . phpversion();
Đây là bảng tổng kết:
Dự án | Phiên bản PHP | Tên miền |
---|---|---|
my_project | 8.1 | my_project.dvl.to |
php54 | 5.4 | php54.dvl.to |
php74 | 7.4 | php74.dvl.to |
Lúc này, kết quả của cả ba dự án sẽ như sau:
OK, vậy là bước chuẩn bị đã thành công. Bây giờ chúng ta sẽ bắt đầu nội dung chính. Nhớ là hãy tạm dừng Devilbox trong giây lát:
docker compose down
docker-compose.override.yml-php-multi.yml
trong thư mục compose
ra thư mục chính và đổi tên thành docker-compose.override.yml
.cp compose/docker-compose.override.yml-php-multi.yml docker-compose.override.yml
Lúc này, tại thư mục chính sẽ có hai tập tin docker-compose
tương tự như sau:
├── docker-compose.override.yml
├── docker-compose.yml
docker compose up -d
.devilbox
. Bên trong thư mục này, tiếp tục tạo tập tin có tên là backend.cfg
. Cấu trúc của thư mục lúc này sẽ như sau:├── projects
├── php54
| ├── .devilbox
| | └── backend.cfg
| └── public
└── php74
├── .devilbox
| └── backend.cfg
└── public
backend.cfg
sẽ chứa nội dung là phần cấu hình phiên bản PHP mà bạn mong muốn. Định dạng về cơ bản sẽ như sau:conf:phpfpm:tcp:PHP_HOSTNAME:9000
Trong đó, PHP_HOSTNAME
sẽ tương ứng với tên phiên bản PHP. Ví dụ nếu sử dụng PHP 5.4 thì nội dung tương ứng sẽ là:
conf:phpfpm:tcp:php54:9000
Vậy làm sao tôi biết được chính xác PHP_HOSTNAME
là gì? Bạn hỏi đúng rồi đó. Dưới đây là danh sách các phiên bản PHP và hostname
mà Devilbox hỗ trợ đến thời điểm hiện tại:
PHP Version | Hostname | IP address |
---|---|---|
5.4 | php54 | 172.16.238.201 |
5.5 | php55 | 172.16.238.202 |
5.6 | php56 | 172.16.238.203 |
7.0 | php70 | 172.16.238.204 |
7.1 | php71 | 172.16.238.205 |
7.2 | php72 | 172.16.238.206 |
7.3 | php73 | 172.16.238.207 |
7.4 | php74 | 172.16.238.208 |
8.0 | php80 | 172.16.238.209 |
8.1 | php81 | 172.16.238.210 |
8.2 | php82 | 172.16.238.211 |
Dựa trên tập tin .env | php |
Mục IP address là thông tin thêm nếu bạn muốn đi sâu hơn vào địa chỉ mạng của từng phiên bản PHP trong Docker network của Devilbox.
Với thông tin này, tôi tin rằng bạn đã biết cấu hình cho dự án php74
như thế nào rồi phải không? Nội dung của tập tin backend.cfg lúc này sẽ phải là:
conf:phpfpm:tcp:php74:9000
Tuy nhiên, nếu bạn truy cập vào các dự án, nội dung vẫn sẽ như cũ vì lúc này cấu hình mới chưa được áp dụng. Do đó, chúng ta cần làm thêm một bước nữa.
watcherd
.Bây giờ hãy quay lại trình duyệt và thử truy cập lại vào các dự án. Bạn sẽ thấy phiên bản PHP đã được thay đổi.
Tadaaa, thành công rực rỡ!
Nói ngắn gọn thì watcherd
là công cụ sẽ lắng nghe các thay đổi bên trong thư mục được chỉ định của Devilbox mà thực thi các hành động tương ứng. Nếu thấy thú vị, bạn có thể tìm hiểu thêm tại đây.
Cấu hình Xdebug với Devilbox đã được tôi hướng dẫn chi tiết trước đó. Các bạn có thể tham khảo lại tại đây. Tuy nhiên, phần cấu hình đã đề cập chỉ có tác dụng với phiên bản PHP được cài đặt mặc định. Như trong ví dụ này là phiên bản 8.1. Để cho Xdebug trên hai dự án php54
và php74
cũng hoạt động bình thường. Bạn nên cấu hình thêm một chút như sau:
docker-compose.override.yml
. Với mỗi phiên bản cần cấu hình Xdebug, bạn hãy thêm đoạn cấu hình extra_hosts
như sau:php74:
...
hostname: php74
extra_hosts:
docker.for.lin.host.internal: 172.16.238.1
docker.for.lin.localhost: 172.16.238.1
host.docker.internal: host-gateway
Ở đây tôi chỉ ví dụ với dự án php74
. Bạn hãy tự cấu hình với dự án php54
để hiểu thêm về quy trình cài đặt.
xdebug.ini
cho phiên bản đó. Ví dụ với PHP 7.4 thì sẽ tương ứng với thư mục cfg/php-ini-7.4
. Nội dung tập tin xdebug.ini
cũng tương tự:xdebug.mode=debug
xdebug.client_port=9000
xdebug.client_host=docker.for.lin.host.internal
xdebug.start_with_request=yes
xdebug.max_nesting_level=250
xdebug.remote_log=/var/log/php/xdebug-74.log
Restart the Devilbox and check if xdebug is set up correctly
docker compose down && docker compose up -d
launch.json
:{
"version": "0.2.0",
"configurations": [
{
"name": "Devilbox Xdebug",
"type": "php",
"request": "launch",
"port": 9000,
"pathMappings": {
"/shared/httpd/php74": "${workspaceFolder}"
}
}
]
}
Các bước vẫn tương tự như nội dung đã được tôi hướng dẫn trước đó. Chỉ thêm phần cấu hình extra_hosts
cho tập tin docker-compose.override.yml
.
Có thể bạn đã biết là chúng ta có thể thay đổi xdebug.client_port
và port
trên từng dự án. Hay chính xác hơn là trên từng phiên bản PHP. Ví dụ, chúng ta có thể cấu hình dự án dùng PHP 7.4 là port 9001
. Còn với dự án dùng PHP 5.4 là port 9002
.
Điều này sẽ giúp bạn cùng lúc có thể sử dụng step debugger trên cả hai dự án. Còn nếu chỉ sử dụng port mặc định theo hướng dẫn là 9000
thì tại một thời điểm chỉ có thể sử dụng step debugger trên một dự án mà thôi. Dự án còn lại muốn sử dụng thì các dự án trước phải disconnect khỏi Xdebug.
Với nội dung vừa rồi, tôi tin rằng đã giúp bạn giảm bớt gánh nặng về việc phải quản lý nhiều dự án mà mỗi dự án lại vận hành trên một phiên bản PHP khác.
Tuy nhiên, lời khuyên của tôi vẫn là cố gắng cập nhật dự án hiện tại lên phiên bản PHP mới hơn càng sớm càng tốt trong khả năng có thể. Ngoài việc bạn sẽ tận dụng sức mạnh, cải thiện hiệu năng và cập nhật bản vá thì phiên bản mới còn mang theo nhiều tính năng giúp bạn giảm thiểu lượng boilerplate code khi muốn phát triển tính năng mới cũng như bảo trì, nâng cấp tính năng cũ. Từ đó giúp giảm thiểu nợ kỹ thuật – technical debt đến mức thấp nhất.
Trong nội dung tiếp theo, tôi sẽ hướng dẫn cho bạn thêm một nội dung nữa khi làm việc với Devilbox mà có thể bạn sẽ rất cần đến. Đó là làm việc với Node.js. Let’s go!