Cấu hình từng phiên bản PHP khác nhau cho từng dự án với Devilbox

Đây là phần thứ 10 trong tổng số 13 phần thuộc loạt bài nói về Devilbox

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ẻ?!”.

Chuẩn bị

Để 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, php54php74 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.47.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ự ánPhiên bản PHPTên miền
my_project8.1my_project.dvl.to
php545.4php54.dvl.to
php747.4php74.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

Cấu hình PHP cho từng dự án

  1. Đầu tiên, tại thư mục chứa Devilbox. Hãy copy tập tin 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
  1. Khởi động lại Devilbox và chờ đợi nó kéo về tất cả các phiên bản PHP được hỗ trợ.
docker compose up -d
  1. Bên trong các thư mục dự án cần cấu hình PHP. Tạo thư mục .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
  1. Tập tin 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 VersionHostnameIP address
5.4php54172.16.238.201
5.5php55172.16.238.202
5.6php56172.16.238.203
7.0php70172.16.238.204
7.1php71172.16.238.205
7.2php72172.16.238.206
7.3php73172.16.238.207
7.4php74172.16.238.208
8.0php80172.16.238.209
8.1php81172.16.238.210
8.2php82172.16.238.211
Dựa trên tập tin .envphp

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
  1. Quay lại intranet. Hãy truy cập vào trang Virtual Hosts. Bạn sẽ thấy mục Backend của dự án đã thay đổi chứng tỏ phần cấu hình của chúng ta đã thành công.

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.

  1. Truy cập vào trang Command & Control và nhấn vào nút Reload phía bên phải tại mục 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

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 php54php74 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:

  1. Trong nội dung tập tin 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.

  1. Tương tự như phần hướng dẫn về cài đặt Xdebug trước đó. Nếu sử dụng phiên bản PHP nào thì sẽ cấu hình tập tin 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
  1. Cấu hình Xdebug cho trình soạn thảo. Lấy ví dụ với Visual Studio Code là tập tin launch.json:
{
  "version": "0.2.0",
  "configurations": [
      {
          "name": "Devilbox Xdebug",
          "type": "php",
          "request": "launch",
          "port": 9000,
          "pathMappings": {
              "/shared/httpd/php74": "${workspaceFolder}"
          }
      }
  ]
}
  1. Đặt breakpoint, chạy Debugging, tải lại trang dự án và xem kết quả:

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_portport 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.

Kết luận

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!

© 2024 - 2025
Khuyên Nguyễn
Made with in CT