Tạo dự án PHP đầu tiên với Devilbox

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

Nếu như các bạn đang suy nghĩ rằng: Liệu việc tạo dự án mới với Devilbox có dễ dàng giống như việc cài đặt nó hay không ta? Thì tôi tự tin nói với bạn rằng câu trả lời là có! Thậm chí nó còn dễ hơn các bạn nghĩ nữa. Vậy hãy cùng nhau tìm hiểu vì sao mà “khứa tác giả này” lại dám chắc chắn đến như vậy?

Virtual Host

Hiểu một cách đơn giản, virtual host (còn gọi là virtual hosting hay hosting ảo) là một phương thức cho phép vận hành nhiều website trên một máy chủ duy nhất. Lúc này, mỗi website sẽ được lưu trữ trong một thư mục riêng cũng như ánh xạ đến một tên miền riêng. Nếu bạn đã từng sử dụng qua các control panel như cPanel hay DirectAdmin thì có thể hiểu đây là chính là cách mà nó cấu hình các addon domain và subdomain.

Thật tuyệt vời khi đây cũng là một tính năng có sẵn trong Devilbox. Nó sẽ giúp chúng ta vận hành nhiều dự án cùng lúc. Trong đó, mỗi dự án sẽ có tên miền riêng do chính chúng ta lựa chọn. Và đương nhiên là nó sẽ không sự giới hạn về số lượng dự án. Ngoài ra, điểm thú vị nhất của tính năng này đó là khi chúng ta tạo một thư mục dự án thì Devilbox sẽ tự tạo một domain tương ứng. Ví dụ:

├── project1 -> http://project1.local
├── project2 -> http://project2.local

Theo tôi, đây là một tính năng cực kỳ đáng giá. Vì ngoài việc giúp dễ dàng phân biệt trong việc quản lý, nó còn giúp chúng ta hình dung được cách mà một dự án vận hành thực tế như thế nào nữa. Dài dòng vậy đủ rồi, giờ hãy cùng nhau tạo dự án PHP đầu tiên!

Tạo dự án PHP đầu tiên

Sau khi đã khởi động xong Devilbox, hãy truy cập vào phần quản lý Virtual Host.

Đây sẽ là nơi quản lý toàn bộ các virtual host của chúng ta. Bên dưới còn kèm theo hướng dẫn hết sức cơ bản. Đó là đơn giản chỉ cần tạo một thư mục bên trong đường dẫn ./data/www ví dụ như my_project chẳng hạn thì nó sẽ tự trỏ đến domain http://my_project.dvl.to. Có vẻ đơn giản đây, hãy làm theo thử xem sau:

  1. Vào bên trong thư mục chứa Devilbox, mặc định là devilbox theo như hướng dẫn ở phần trước. Tiếp đến, vào bên trong đường dẫn data/www và tạo thư mục my_project. Sau đó tải lại trang quản lý Virtual Hosts, các bạn sẽ thấy rằng dự án my_project đã được liệt kê nhưng vẫn chưa có domain tại mục URL vì thông báo lỗi thiếu thư mục htdocs.

Lý do là vì Devilbox mặc định sẽ phân biệt giữa thư mục dự án (project dir) và thư mục chứa tập tin mà người dùng của thể truy cập trực tiếp từ trình duyệt của dự án (docroot dir).

  1. Do đó, hãy tạo tiếp thư mục htdocs bên trong thư mục my_project và tải lại trang Virtual Hosts một lần nữa. Tadaaa, tên miền my_project.dvl.to cho dự án my_project đã được tạo thành công.

Trong trường hợp bạn gặp lỗi No Host DNS record found, hãy làm theo hướng dẫn mà Devilbox cung cấp.

Tức là thêm đoạn cấu hình 127.0.0.1 my_project.dvl.to vào tập tin hosts của Ubuntu. Nhưng làm thế nào để thêm đây bạn ơi? Cũng đơn giản thôi, hãy bật terminal lên vào gõ vào lệnh sau để chỉnh sửa tập tin hosts:

sudo nano /etc/hosts

Sau đó thêm đoạn cấu hình trỏ tên miền dự án vào địa chỉ 127.0.0.1 vào tập tin hosts.

Cuối cùng, hãy nhấn tổ hợp phím Ctrl + XY để lưu lại nội dung đã chỉnh sửa. Vậy là xong. Thông tin thêm đến bạn, đó là lỗi này xảy ra thường liên quan đến việc tên miền dvl.to bị hết hạn. Do đó, mọi cấu hình sub-domain của nó cũng “hết hạn” theo. Bạn có thể cấu hình như trên để tiếp tục sử dụng hoặc nếu muốn sử dụng tên miền theo ý muốn của mình, hay tham khảo bài viết sau đây. Còn đây là hướng dẫn nếu bạn đang sử dụng Windows hoặc MacOS.

  1. Thế nhưng, nếu truy cập vào http://my_project.dvl.to thì sẽ gặp thông báo lỗi 403 Forbidden. Nhưng hãy đừng bối rối bạn ơi, báo lỗi là đúng rồi vì đã có tập tin index nào đâu!

Bạn có thể nhấn vào bánh răng ở mục config và tìm đến dòng Define the vhost to serve files để thấy rằng mặc định virtual host sẽ tìm tập tin index.php hoặc index.html hoặc index.htm để thực thi.

  1. Để kiểm chứng, tôi sẽ tạo tập tin index.php bên trong thư mục htdocs với nội dung như sau:
<?php
phpinfo();

Đương nhiên là bạn có thể tạo các tập tin index.html hoặc index.htm với nội dung tùy thích.

  1. Bây giờ hãy tải lại trang http://my_project.dvl.to. Tadaaa, giờ mới thật sự thành công nè!

Bật mí với các bạn một chút thì đây là tên miền có thật trên internet. Các bạn có thể kiểm tra thông tin tại đây. Các subdomain của tên miền này đều trỏ về web server có IP 127.0.0.1. Từ đó giúp chúng ta hình dung được một trang web đang chạy thực tế sẽ như thế nào. Đúng là một tính năng rất đáng giá phải không nào? Nhưng như vậy cũng chưa là gì đâu, vì sao ư?

Như đã đề cập, Devilbox đã cài đặt sẵn rất nhiều công cụ dành cho nhà phát triển như chúng ta. Trong số đó, không thể không kể đến Composer.

Làm việc với PHP Container

Composer là một trình quản lý phụ thuộc dành riêng cho PHP. Nếu bạn là một PHP developer thì đây là một công cụ gần như là bắt buộc phải biết. Nhờ lợi thế của Docker, việc sử dụng Composer cũng dễ dàng không kém. Đầu tiên, tại thư mục devilbox, hãy thực thi tập tin shell.sh.

./shell.sh

Lúc này, bạn sẽ được chuyển vào bên trong PHP container của Devibox, tại thư mục mặc định /shared/httpd.

Hãy thử sử dụng lệnh ls để xem chúng ta có gì ở đây:

Thấy quen chưa? Thư mục my_project ban đầu của chúng ta nó ở đây nè. Bạn đã bắt đầu hiểu ra vấn đề rồi phải không? Đó chính là thư mục chứa dự án của chúng ta (data/www) đã được ánh xạ tới thư mục /shared/httpd bên trong PHP container. OK! Giờ hãy thử kiểm tra Composer xem nào:

composer --version

Thư mục chứa dự án của chúng ta (data/www) được ánh xạ tới thư mục /shared/httpd bên trong PHP container. Như vậy, những dự án được tạo trực tiếp bên trong PHP container cũng sẽ ánh xạ ra bên ngoài thư mục chứa dự án (data/www). Với tính chất này, bạn hoàn toàn có thể khởi tạo dự án từ các PHP framework có sử dụng Composer như Laravel, Symfony, CakePHP,…

Ngoài Composer ra, các bạn cũng có thể thử các công cụ dòng lệnh khác được liệt kê ở mục Available CLI Tools.

Để thoát khỏi PHP container và trở về thư mục devilbox, hãy sử dụng câu lệnh exit:

exit

PHP container chạy trên nền tảng Debian, cũng là một bản phân phối của Linux. Điều này sẽ đảm bảo rằng không có sự khác nhau về trải nghiệm Devilbox giữa các nền tảng. Việc truy cập vào PHP container như thế này cũng đang giống như là bạn đang truy cập vào một Linux web server.

source /etc/os-release
echo $NAME

Kết nối cơ sở dữ liệu MySQL

Mặc định, MySQL được cài đặt với các thông số như sau:

<?php
$host = 'mysql';
$port = '3306';
$user = 'root';
$pass = '';

Các thông tin này có thể tìm thấy ở mục Networking và Ports trên trang chủ intranet.

Bạn cũng có thể sử dụng phpMyAdmin hoặc Adminer trong mục Tools để thao tác với MySQL bằng giao diện web. Trong trường hợp bạn muốn truy cập vào máy chủ MySQL, đầu tiên hãy truy cập vào PHP container và thực hiện câu lệnh sau:

mysql -h mysql -u root -p

Thay đổi phiên bản PHP

Devilbox mặc định sử dụng PHP phiên bản 8.1 cho toàn bộ dự án bên trong PHP container. Thông tin này có thể tìm thấy tại mục PHP Info trên thanh điều hướng hoặc mục Base Stack trên trang chủ intranet. Để thay đổi sang phiên bản mới hơn hoặc cũ hơn, hãy thực hiện theo các bước sau:

  1. Đầu tiên, tạm ngưng Devilbox
docker compose down
  1. Tiếp theo, mở tập tin .env và tìm đến khu vực PHP_SERVER. Sau đó bỏ ghi chú ở phiên bản mong muốn cũng như vô hiệu hóa các phiên bản còn lại. Ở đây, tôi sẽ ví dụ với phiên bản PHP 8.2:
#PHP_SERVER=5.2
#PHP_SERVER=5.3
#PHP_SERVER=5.4
#PHP_SERVER=5.5
#PHP_SERVER=5.6
#PHP_SERVER=7.0
#PHP_SERVER=7.1
#PHP_SERVER=7.2
#PHP_SERVER=7.3
#PHP_SERVER=7.4
#PHP_SERVER=8.0
#PHP_SERVER=8.1
PHP_SERVER=8.2
  1. Cuối cùng, khởi động lại Devilbox
docker compose up -d

Nếu nhận được kết quả này tức là đã thành công:

PHP Modules

Để đảm bảo việc tương thích nên mặc định Devilbox đã vô hiệu hóa một số module PHP. Để cấu hình cho việc kích hoạt hay vô hiệu hóa các module này, chúng ta cũng sẽ làm việc với tập tin .env.

  1. Đầu tiên, cũng là tạm ngưng Devilbox.
docker compose down
  1. Tiếp theo, cũng là mở tập tin .env. Nhưng lần này sẽ làm tìm đến hai mục: PHP_MODULES_ENABLE cho các module mà bạn muốn kích hoạt và PHP_MODULES_DISABLE cho các module mà bạn muốn vô hiệu hóa. Lưu ý, các module sẽ ngăn cách nhau bởi dấu phẩy.
PHP_MODULES_ENABLE=
PHP_MODULES_DISABLE=oci8,PDO_OCI,pdo_sqlsrv,sqlsrv,rdkafka,swoole,psr,phalcon
  1. Cuối cùng cũng là khởi động lại Devilbox.
docker compose up -d

Để kiểm tra kết quả, bạn hãy vào lại trang PHP Info và tìm kiếm thông tin về module đó. Như dưới đây là ví dụ về module phalcon mà tôi đã kích hoạt. Trong trường hợp không tìm thấy thông tin nào, bạn hãy truy cập vào đây để xem thử module của mình đã được Devilbox hỗ trợ hay chưa.

Biến môi trường

Khi ở trên trang PHP Info, nếu để ý một chút bạn sẽ thấy tại mục Environment cũng như mục PHP Variables sẽ chứa thông tin của các khóa bên trong tập tin .env. Điển hình chính là hai khóa PHP_MODULES_ENABLEPHP_MODULES_DISABLE mà chúng ta vừa nhắc đến.

Điều này có nghĩa là nếu định nghĩa một khóa bất kỳ trong tập tin .env thì hoàn toàn có thể truy cập chúng bên trong ứng dụng PHP của mình. Ví dụ, tôi sẽ thêm khóa APP_URL vào tập tin .env:

APP_URL=https://khuyennguyen.dev

Bây giờ, các bạn hoàn toàn có thể truy cập vào khóa này với ứng dụng PHP của mình bằng những cách sau:

<?php
echo $_ENV['APP_URL'];
echo $_SERVER['APP_URL'];
echo getenv('APP_URL');

Lưu ý là các bạn phải khởi động lại Devilbox để nó cập nhật các giá trị mới.

PHP_CodeSniffer

Đây là bộ công cụ phân tích mã nguồn được tích hợp sẵn bên trong PHP container của Devilbox. Nó sẽ giúp bạn phát hiện và sửa các lỗi liên quan đến coding convention.

cd my_project/
phpcs .

Khởi động Devilbox có chọn lọc

Từ đầu đến giờ, chúng ta đều khởi động Devilbox bằng câu lệnh sau:

docker compose up -d

Bằng cách này, chúng ta đã khởi động toàn bộ dịch vụ được tích hợp sẵn theo Devilbox như PHP, MySQL, PostgreSQL, MongoDB,… Nhưng đều này thật sự có cần thiết?

Bởi vì trong một số trường hợp, dự án của bạn chỉ cần sử dụng combo PHP & MySQL là đủ. Vậy có cách nào chỉ cần khởi động Devilbox với hai dịch vụ này thôi hay không? Câu trả lời là có! Đây là một tính năng đến từ Docker, cho phép lựa chọn dịch vụ muốn khởi động theo ý muốn.

Như ví dụ trên, nếu chỉ muốn khởi động combo PHP & MySQL thôi thì hãy điều chỉnh câu lệnh như sau:

docker compose up -d php mysql

Còn nếu muốn có Redis, chỉ cần thêm tên dịch vụ là redis vào mà thôi. Rất đơn giản phải không?

docker compose up -d php mysql redis

Nếu bạn đang thắc mắc là làm sao tôi biết được tên dịch vụ là php và mysql mà thực thi câu lệnh? Hay chỉ là tôi đoán bừa thì tôi xin trả lời là tôi không đoán bừa đâu, bạn có thể tham khảo tên của cách dịch vụ khác ở đây.

Kết luận

Đến đây, tôi tin rằng bạn đã biết cách tạo dự án PHP với Devilbox. Ngoài ra, còn bắt đầu làm quen với các lệnh Docker cơ bản. Quan trọng hơn chính là việc có được môi trường web server và các công cụ tích hợp một cách nhanh chóng. Mọi thứ khá là đơn giản phải không nào? Tuy nhiên, tôi biết rằng các bạn cũng sẽ có một chút lấn cấn ở đây.

Thứ nhất, đó là việc thư mục chứa dự án (data dir) nằm ngay bên trong Devilbox. Điều này khiến cho việc quản lý các thư mục dự án mang cảm giác dính chặt với Devilbox. Khiến cho chúng cho chúng ta có cảm giác không thoải mái khi làm việc.

Thứ hai, đó là thư mục htdocs. Nó khiến cho việc quản lý dự án khá là dở hơi vì nó phân biệt giữa project dirdocroot dir. Nếu là các PHP framework như Laravel thì thư mục này phải là public, còn nếu là CMS như WordPress thì nó lại không cần. Vậy làm cách nào để thay đổi nó đây?

Hãy yên tâm vì trong phần tiếp theo chúng ta sẽ cùng nhau giải quyết hết tất cả các vấn đề này bằng cách tái cấu trúc lại thư mục dự án. Let’s go!

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