Tạo và vận hành dự án Phalcon
Phalcon là gì?
Phalcon là một framework mã nguồn mở PHP hiệu năng cao, được hiện thực dưới dạng extension C. Nhờ kiến trúc này, Phalcon tiêu tốn rất ít tài nguyên và đạt tốc độ xử lý vượt trội so với hầu hết các framework PHP truyền thống. Phalcon tuân thủ mô hình kiến trúc MVC (Model-View-Controller), cung cấp nhiều thành phần chức năng như ORM (Object Relational Mapping), engine template, định tuyến, cache, quản lý sự kiện... nhằm giúp lập trình viên xây dựng ứng dụng web và API mạnh mẽ, hiệu năng cao một cách nhanh chóng.
Tính năng & Ưu điểm nổi bật của Phalcon
- Hiệu năng vượt trội: Chạy như một extension C giúp Phalcon loại bỏ chi phí phân tích & tải script PHP, đạt hiệu năng gần native.
- Tiết kiệm tài nguyên: Tiêu thụ bộ nhớ cực thấp, phù hợp các ứng dụng yêu cầu cao về tốc độ & khả năng mở rộng.
- Đầy đủ chức năng: Tích hợp sẵn hầu hết các thành phần cần thiết phát triển web, giảm phụ thuộc thư viện ngoài.
- Dễ sử dụng: API rõ ràng, nhất quán, tài liệu chi tiết; người mới cũng dễ làm quen.
- Tính module hóa cao: Các thành phần được thiết kế độc lập, bạn có thể tùy ý thay thế/hạn chế theo nhu cầu dự án.
- Bảo mật: Có nhiều thành phần bảo mật như filter input, chống CSRF, v.v.
Phalcon là lựa chọn lý tưởng cho các dự án web và API đòi hỏi hiệu năng, khả năng mở rộng và tối ưu tài nguyên.
Tạo & chạy dự án Phalcon với ServBay
ServBay là môi trường phát triển web nội bộ dành riêng cho macOS, tích hợp nhiều phiên bản PHP, các hệ quản trị cơ sở dữ liệu (MySQL, PostgreSQL, MongoDB, Redis) và các máy chủ web (Caddy, Nginx, Apache)... Với ServBay, bạn dễ dàng xây dựng, vận hành, quản lý những dự án Phalcon với môi trường tối ưu mà không mất quá nhiều thời gian cấu hình thủ công.
Hướng dẫn này sẽ dẫn bạn qua từng bước tạo dự án Phalcon cơ bản với ServBay, cấu hình máy chủ web để truy cập dự án, cũng như tích hợp cơ sở dữ liệu quan hệ (MySQL) và NoSQL (Redis).
Yêu cầu trước khi bắt đầu
Trước khi thao tác, đảm bảo rằng:
- Đã cài đặt & chạy ServBay: Hãy chắc chắn ServBay đã được cài & kích hoạt trên macOS của bạn.
- Đã bật phiên bản PHP cần dùng: Trong ServBay, kiểm tra và bật phiên bản PHP bạn sẽ sử dụng cho dự án.
- Đã bật module Phalcon: ServBay tích hợp sẵn module Phalcon nhưng mặc định có thể chưa bật. Hãy thực hiện theo hướng dẫn bật module Phalcon của ServBay để bật extension Phalcon tương ứng với phiên bản PHP bạn đang dùng, nhớ khởi động lại PHP service.
- Composer đã khả dụng: ServBay tích hợp sẵn Composer, không cần cài riêng. Đảm bảo bạn có thể dùng lệnh
composer
ngay trên terminal.
Bảng chọn phiên bản Phalcon và DevTools tương ứng với PHP
Phiên bản Phalcon framework & công cụ DevTools nên tương thích với phiên bản PHP đang dùng. Bảng sau gợi ý tương quan các phiên bản phổ biến:
Phiên bản PHP | Phiên bản Phalcon khuyến nghị | Phalcon DevTools khuyến nghị | Ghi chú |
---|---|---|---|
PHP 5.6, 7.0, 7.1 | Phalcon 3.4.5 | 3.4.x | |
PHP 7.2, 7.3, 7.4 | Phalcon 4.1.2 | ~4.1 (hoặc 4.3.x ) | |
PHP 8.0, 8.1, 8.2 | Phalcon 5.x | 5.0.x (chính thức) | DevTools chính thức có thể gặp 1 số vấn đề tương thích với PHP 8.x |
PHP 8.3, 8.4 | Phalcon 5.x | dev-master (bản sửa từ cộng đồng) | Nên dùng bản fix cộng đồng để tương thích tốt hơn. |
Lưu ý quan trọng: Với PHP 8.x trở lên, DevTools chính thức có thể không tương thích đầy đủ. Nên cài bản sửa từ cộng đồng theo hướng dẫn ở các bước dưới.
Tạo dự án Phalcon mới
Đường dẫn lưu trữ website khuyên dùng
Để dễ quản lý, ServBay khuyến nghị đặt tất cả dự án website tại thư mục gốc mặc định: /Applications/ServBay/www
. Ví dụ dưới đây cũng dùng thư mục này.
Chuyển vào thư mục gốc website & tạo folder dự án
Mở Terminal, chuyển đến thư mục website gốc của ServBay và tạo folder mới cho dự án Phalcon, ví dụ
servbay-phalcon-app
:bashcd /Applications/ServBay/www mkdir servbay-phalcon-app cd servbay-phalcon-app
1
2
3Cài đặt Phalcon DevTools
Phalcon DevTools là bộ công cụ dòng lệnh hỗ trợ tạo code, sinh skeleton dự án, quản lý migration... Sử dụng Composer để cài đặt, tùy phiên bản PHP:
PHP 5.6, 7.0, 7.1 (Phalcon DevTools
^3.4
):bashcomposer require phalcon/devtools:"^3.4"
1PHP 7.2, 7.3, 7.4 (Phalcon DevTools
~4.1
):bashcomposer require phalcon/devtools:"~4.1"
1PHP 8.0, 8.1, 8.2, 8.3, 8.4 (Phalcon DevTools
dev-master
- bản sửa): Do DevTools chính thức có vấn đề tương thích, bạn cần dùng bản fix cộng đồng. Tạo/chỉnh filecomposer.json
ở thư mục gốc dự án (/Applications/ServBay/www/servbay-phalcon-app
), thêm cấu hình repository như sau:json{ "repositories": [ { "url": "https://github.com/daleffe/phalcon-devtools-5.x-fixed.git", "type": "git" } ], "require": { "phalcon/devtools": "dev-master" }, "minimum-stability": "dev", "prefer-stable": true }
1
2
3
4
5
6
7
8
9
10
11
12
13Sau đó, chạy Composer để cập nhật/cài DevTools:
bashcomposer update
1
Sau khi cài, thư mục
vendor
sẽ có file thực thi DevTools tạivendor/bin/phalcon
.Sinh skeleton cho project bằng Phalcon DevTools
Tiếp theo, sử dụng command DevTools vừa cài để sinh khung cấu trúc cơ bản. Theo mặc định, code sẽ nằm trong subdirectory có cùng tên:
bashvendor/bin/phalcon project servbay-phalcon-app
1Lệnh này tạo thư mục
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app
chứa skeleton chuẩn của dự án Phalcon.Chuyển vào thư mục code của dự án
Chuyển tới thư mục code dự án vừa tạo để thực hiện các thao tác tiếp theo:
bashcd servbay-phalcon-app
1Giờ bạn đang ở
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app
.
Cấu hình môi trường dự án
Việc cấu hình dự án Phalcon thường tập trung ở file app/config/config.php
. Bạn cần khai báo các thông tin thiết yếu như database, đường dẫn ứng dụng...
Chỉnh sửa file cấu hình
Mở file
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app/app/config/config.php
bằng editor tuỳ chọn, tìm/điền phần cấu hình database. ServBay mặc định user MySQL/MariaDB làroot
, password rỗng - bạn nên đặt lại password mạnh (ví dụpassword
chỉ là placeholder, đừng dùng thực tế). Tên database làservbay_phalcon_app
(bạn cần tự tạo trước database này):phpreturn new \Phalcon\Config([ // ... cấu hình khác ... 'database' => [ 'adapter' => 'Mysql', // hoặc 'Postgres',... 'host' => '127.0.0.1', 'username' => 'root', // User mặc định của ServBay 'password' => 'password', // <-- Nhớ sửa thành password thực tế 'dbname' => 'servbay_phalcon_app', // <-- Sửa thành tên DB thực tế ], // ... cấu hình khác ... ]);
1
2
3
4
5
6
7
8
9
10
11Lưu ý quan trọng: Đảm bảo đã bật service database (MySQL/MariaDB) trong ServBay, username/password đúng và đã tạo trước DB
servbay_phalcon_app
. Có thể dùng phpMyAdmin/Adminer của ServBay để quản lý.
Cấu hình máy chủ Web (bằng chức năng Website của ServBay)
Để truy cập được website qua trình duyệt, bạn cần cấu hình 1 website mới trên ServBay — gán domain, chọn đúng root folder.
- Mở ứng dụng ServBay
- Vào mục “Website”: Ở giao diện chính, tìm và chọn mục “Website”.
- Thêm website mới: Bấm nút thêm website.
- Tên: Đặt tên dễ nhớ, ví dụ
My First Phalcon Dev Site
. - Tên miền: Gõ domain mà bạn muốn truy cập, ví dụ
servbay-phalcon-test.local
. ServBay tự động ánh xạ.local
về localhost. - Loại website: Chọn
PHP
. - Phiên bản PHP: Chọn đúng PHP đã bật module Phalcon.
- Root directory: Quan trọng! File
index.php
đầu vào của Phalcon thường nằm trong folderpublic
của dự án, vậy cần trỏroot
về/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app/public
.
- Tên: Đặt tên dễ nhớ, ví dụ
- Lưu cấu hình: Lưu lại, ServBay sẽ tự áp dụng và có thể khởi động lại web server (Caddy hoặc Nginx).
Tham khảo thêm chi tiết tại Thêm website đầu tiên. Sau khi xong, domain sẽ tự động ánh xạ & cấu hình server.
Thêm code mẫu kiểm thử dự án
Ta sẽ thêm chút mã đơn giản để kiểm tra dự án chạy bình thường.
Cấu hình router
Mở file
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app/app/config/routes.php
, thêm route xử lý cho path gốc/
:php<?php use Phalcon\Mvc\Router; $router = new Router(false); // Định nghĩa route mặc định: path '/' sang IndexController@indexAction $router->add( '/', [ 'controller' => 'index', 'action' => 'index', ] ); // ... có thể thêm các route khác ... $router->handle($_SERVER['REQUEST_URI']); return $router;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19Tạo controller
Mở/tạo file
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app/app/controllers/IndexController.php
, thêm methodindexAction
cơ bản:php<?php namespace App\Controllers; // Đảm bảo đúng namespace use Phalcon\Mvc\Controller; class IndexController extends Controller { // Xử lý yêu cầu '/' public function indexAction() { // Trả về chuỗi đơn giản return 'Hello ServBay!'; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Truy cập website
Sau khi lưu lại các file, chắc rằng ServBay vẫn đang chạy. Mở trình duyệt, nhập domain đã cấu hình:
https://servbay-phalcon-test.local
Nếu đã cấu hình chính xác, trình duyệt sẽ hiển thị Hello ServBay!
.
Tích hợp cơ sở dữ liệu
Phalcon cung cấp tầng trừu tượng dữ liệu mạnh mẽ, ORM đi kèm. ServBay tích hợp nhiều loại database — bạn sẽ dễ dàng kết nối Phalcon với database mong muốn. Ví dụ sau dùng MySQL & Redis.
Ví dụ sử dụng CSDL quan hệ: MySQL
Demo cách kết nối MySQL trên ServBay với adapter của Phalcon, thực hiện thao tác insert và truy vấn đơn giản.
Tạo cấu trúc DB (migration)
Phalcon DevTools hỗ trợ migration cho version-control schema DB.
Sinh migration file: Tại thư mục code (
/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app
):bashvendor/bin/phalcon migration generate
1Lệnh này tạo file migration mới trong thư mục
migrations
(tên dạngYYYYMMDDHHMMSS_MigrationName.php
).Chỉnh migration file: Mở file vừa sinh, sửa method
morph
để định nghĩa bảngusers
tối giản:php<?php use Phalcon\Db\Column; use Phalcon\Db\Index; use Phalcon\Migrations\Mvc\Model\Migration; /** * Class UsersMigration_100 */ class UsersMigration_100 extends Migration // Đảm bảo tên class khớp file { /** * Thực thi migration * * @return void */ public function morph() { $this->morphTable('users', [ 'columns' => [ new Column( 'id', [ 'type' => Column::TYPE_INTEGER, 'autoIncrement' => true, 'notNull' => true, 'primary' => true, ] ), new Column( 'name', [ 'type' => Column::TYPE_VARCHAR, 'size' => 255, 'notNull' => true, ] ), new Column( 'email', [ 'type' => Column::TYPE_VARCHAR, 'size' => 255, 'notNull' => true, 'unique' => true, ] ), ], 'indexes' => [ new Index('PRIMARY', ['id'], 'PRIMARY'), new Index('email_UNIQUE', ['email'], 'UNIQUE'), ], 'options' => [ 'TABLE_ENGINE' => 'InnoDB', 'CHARACTER SET' => 'utf8mb4', 'COLLATE' => 'utf8mb4_unicode_ci', ], ]); } /** * Rollback migration * * @return void */ public function down() { // Tùy chọn: logic rollback (ví dụ xóa bảng) // $this->getConnection()->dropTable('users'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70Lưu ý: Đảm bảo tên class (vd.
UsersMigration_100
) đúng với tên file.Chạy migration: Để tạo bảng trên database, chạy:
bashvendor/bin/phalcon migration run
1Nếu gặp lỗi kết nối DB, hãy kiểm tra lại cấu hình DB trong
app/config/config.php
và dịch vụ MySQL/MariaDB trên ServBay.
Kết nối DB (đã cấu hình ở bước trên)
Hãy chắc rằng mục
'database'
ởapp/config/config.php
trỏ đúng về MySQL/MariaDB của ServBay.Thêm các route demo
Sửa file
app/config/routes.php
để bổ sung route cho thao tác thêm/lấy dữ liệu user:php<?php use Phalcon\Mvc\Router; $router = new Router(false); $router->add('/', [ 'controller' => 'index', 'action' => 'index', ]); // Route thêm user $router->add( '/mysql-add', [ 'controller' => 'index', 'action' => 'mysqlAdd', ] ); // Route lấy danh sách user $router->add( '/mysql', [ 'controller' => 'index', 'action' => 'mysql', ] ); $router->handle($_SERVER['REQUEST_URI']); return $router;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31Viết controller thao tác DB
Mở
app/controllers/IndexController.php
, thêm 2 methodmysqlAddAction
,mysqlAction
:php<?php namespace App\Controllers; use Phalcon\Mvc\Controller; use Phalcon\Db\Adapter\Pdo\Mysql; // Adapter MySQL use Phalcon\Db\Enum; // Enum dùng cho fetchAll class IndexController extends Controller { public function indexAction() { return 'Hello ServBay!'; } // Thêm user (insert) public function mysqlAddAction() { // Trong thực tế nên dùng DI container, demo thì tạo object trực tiếp $connection = new Mysql([ 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', // <-- Sửa thành pass DB thực tế 'dbname' => 'servbay_phalcon_app', 'charset' => 'utf8mb4', ]); // Thêm user mẫu $success = $connection->insert( 'users', ['ServBay Demo User', '[email protected]'], ['name', 'email'] ); // Hiện kết quả echo $success ? 'User added successfully.' : 'Failed to add user.'; } // Liệt kê user (select) public function mysqlAction() { // Kết nối DB $connection = new Mysql([ 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', // <-- Sửa lại pass DB 'dbname' => 'servbay_phalcon_app', 'charset' => 'utf8mb4', ]); // Lấy danh sách user $users = $connection->fetchAll('SELECT * FROM users', Enum::FETCH_ASSOC); // Json output header('Content-Type: application/json'); echo json_encode($users); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57Lưu ý: Ở dự án thực tế, hãy khai báo DB connection là 1 service singleton trong container, không tạo mới mỗi lần action chạy.
Truy cập demo
- Truy cập
https://servbay-phalcon-test.local/mysql-add
để thêm user mẫu, sẽ hiện "User added successfully." nếu thành công. - Truy cập
https://servbay-phalcon-test.local/mysql
để xem danh sách user (JSON), bao gồm record vừa thêm.
- Truy cập
Ví dụ sử dụng NoSQL: Redis
Demo tích hợp Redis (do ServBay cung cấp) làm cache trong dự án Phalcon.
Cài đặt extension Redis
Các gói PHP của ServBay thường đã tích hợp sẵn Redis extension. Hãy kiểm tra đã bật extension Redis đúng với PHP version bạn sử dụng.
Cấu hình kết nối Redis
Thêm cấu hình Redis vào
app/config/config.php
(mặc định Redis chạy trên127.0.0.1:6379
):phpreturn new \Phalcon\Config([ // ... cấu hình khác ... 'cache' => [ 'adapter' => 'Redis', 'host' => '127.0.0.1', 'port' => 6379, 'index' => 0, // DB index của Redis 'persistent' => false, // Nối bình thường, không persistent 'auth' => null, // Có password thì điền vào đây ], // ... cấu hình khác ... ]);
1
2
3
4
5
6
7
8
9
10
11
12Thêm route demo
Sửa file
app/config/routes.php
, thêm route demo Redis:php<?php use Phalcon\Mvc\Router; $router = new Router(false); $router->add('/', [ 'controller' => 'index', 'action' => 'index', ]); $router->add('/mysql-add', [ 'controller' => 'index', 'action' => 'mysqlAdd', ]); $router->add('/mysql', [ 'controller' => 'index', 'action' => 'mysql', ]); // Route demo Redis cache $router->add( '/redis', [ 'controller' => 'index', 'action' => 'redis', ] ); $router->handle($_SERVER['REQUEST_URI']); return $router;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32Demo thao tác Redis cache trong controller
Mở
app/controllers/IndexController.php
, thêmredisAction
:php<?php namespace App\Controllers; use Phalcon\Mvc\Controller; use Phalcon\Db\Adapter\Pdo\Mysql; use Phalcon\Db\Enum; use Phalcon\Cache\Adapter\Redis; // Adapter Redis cache use Phalcon\Storage\SerializerFactory; // Factory serializer class IndexController extends Controller { public function indexAction() { return 'Hello ServBay!'; } public function mysqlAddAction() { $connection = new Mysql([/* ... */]); $success = $connection->insert(/* ... */); echo $success ? 'User added successfully.' : 'Failed to add user.'; } public function mysqlAction() { $connection = new Mysql([/* ... */]); $users = $connection->fetchAll('SELECT * FROM users', Enum::FETCH_ASSOC); header('Content-Type: application/json'); echo json_encode($users); } // Demo cache Redis public function redisAction() { // Instanciate factory serialize $serializerFactory = new SerializerFactory(); // Option Redis cache (nhớ đồng nhất với config.php) $options = [ 'defaultSerializer' => 'Json', // Dữ liệu lưu dạng JSON 'lifetime' => 3600, // 1 giờ 'host' => '127.0.0.1', 'port' => 6379, 'index' => 0, // 'auth' => 'your_redis_password', ]; // Khởi tạo redis cache $cache = new Redis($serializerFactory, $options); $cacheKey = 'my_servbay_redis_cache_key'; $cachedData = $cache->get($cacheKey); // Thử lấy từ cache if ($cachedData === null) { // Không có cache, lấy từ nguồn gốc echo "Data not found in cache, fetching from source..."; $cachedData = 'Data fetched from source: Hello Redis from ServBay!'; $cache->set($cacheKey, $cachedData); // Lưu cache echo "Data stored in cache."; } else { // Đã có cache echo "Data found in cache: "; } // Xuất dữ liệu kết quả return $cachedData; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68Chú ý: Thực tế nên đăng ký service cache trong DI container cho dễ dùng toàn ứng dụng.
Truy cập thử
Truy cập
https://servbay-phalcon-test.local/redis
:- Lần đầu sẽ thấy "Data not found in cache, fetching from source...Data stored in cache." và nội dung "Data fetched from source: Hello Redis from ServBay!".
- Những lần sau (khi cache còn) sẽ thấy "Data found in cache: " và giá trị "Data fetched from source: Hello Redis from ServBay!" — tức đã lấy từ Redis cache.
Câu hỏi thường gặp (FAQ)
- Q: Truy cập web bị lỗi 404 Not Found?
- A: Đảm bảo trường "Website root" ở ServBay trỏ đúng folder
public
của dự án (/Applications/ServBay/www/servbay-phalcon-app/servbay-phalcon-app/public
). Kiểm tra web server (Caddy/Nginx) đã chạy và domain.local
ánh xạ đúng.
- A: Đảm bảo trường "Website root" ở ServBay trỏ đúng folder
- Q: Lỗi không tìm thấy module Phalcon (Class 'Phalcon\Mvc\Application' not found)?
- A: Thường là do chưa bật extension Phalcon cho PHP đang dùng. Quay lại ServBay, bật module Phalcon đúng version PHP và khởi động lại PHP service. Xem thêm hướng dẫn bật module Phalcon của ServBay.
- Q: Kết nối database thất bại?
- A: Kiểm tra cấu hình DB trong
app/config/config.php
(host, user, pass, dbname) đúng chưa. Đảm bảo dịch vụ MySQL/MariaDB đã bật trên ServBay, user đủ quyền và database đã tồn tại.
- A: Kiểm tra cấu hình DB trong
Tổng kết
Với ServBay, bạn dễ dàng thiết lập môi trường phát triển chuẩn cho framework Phalcon trên macOS — từ khâu tạo skeleton, cấu hình web server đến tích hợp MySQL/Redis. ServBay cung cấp đầy đủ gói phần mềm kèm giao diện quản lý trực quan, giúp giảm tối đa thời gian & công sức setup môi trường cục bộ. Mong rằng bài hướng dẫn này sẽ giúp bạn thuận lợi bắt đầu hành trình dựng website hiệu quả với Phalcon & ServBay!