Bên cạnh các tính năng phong phú để xây dựng ứng dụng web, Yii2 cũng hỗ trợ đầy đủ tính năng cho các ứng dụng console vốn chủ yếu được sử dụng để tạo các tác vụ nền và bảo trì cần thực hiện cho một trang web.
Ứng dụng của Console trong Yii2
Cấu trúc của các ứng dụng console rất giống với ứng dụng web Yii2. Nó bao gồm một hoặc nhiều lớp yii \ console \ Controller , thường được gọi là các lệnh trong môi trường giao diện dòng lệnh. Mỗi Controller cũng có thể có một hoặc nhiều action, giống như bộ controller web.
Các đồng dev có thể xem hướng dẫn các lệnh có sẵn bằng cách gõ lệnh sau trong command line
php yii
hoặc
./yii
Và kết quả sẽ show ra các lệnh mẫu có thể dùng
Có rất nhiều lệnh để tham khảo:
- asset: Cho phép quản lý các file tài nguyên css,js.. và có thể nén chúng lại để giảm tải việc load
- cache: Xử lý về cache ứng dụng
- fixture: Xử lý việc loading dữ liệu
- gii: Cho phép tạo các phần về CRUD, controller, extension, model, module bằng dòng lệnh mà không cần dùng đến UI (Nếu các đồng dev chưa biết gii thì có thể xem ở đây).
- help: Cung cấp các hướng dẫn về console cụ thể hơn
- message: Trích xuất các thông báo được dịch từ các file nguồn.
- migrate: Xử lý các phần về cấu trúc cơ sở dũ liệu ứng dụng
- serve: Chạy ứng dụng qua web server
Để sử dụng các đồng dev chạy lệnh theo cấu trúc sau
php yii <route> [--option1=value1 ... argument1 argument2 ... --option2=value2]
hoặc
./yii <route> [--option1=value1 ... argument1 argument2 ... --option2=value2]
<route> chính là các lệnh bên trên hoặc có thể hiểu là các controller gọi tới các action dạng controller/action, còn các option thì các đồng dev có thể tham khảo thêm tại đây
Ví dụ tại hạ chạy 1 lệnh cập nhật tất cả các migrate như sau
php yii migrate/up
Tạo cronjob bằng console
Đầu tiên để tạo cronjob chạy lập lịch cho 1 tác vụ nào đó các đồng dev cần có các bước sau:
1. Tạo controller trong thư mục console của Yii2
2. Mở crontab thêm vào dòng lệnh dạng php path_to_project\yii <controller>/<action> <param>
*Lưu ý: path_to_project là đường dẫn trỏ tới file yii trong thư mục dự án, nếu các đồng dev ở trong thư mục dự án thì có thể gọi trưc tiếp yii còn không thì phải khai báo đường dẫn trỏ tới file yii thì mới chạy được nhé.
Ví dụ ở đây tại hạ sẽ build 1 tác vụ làm nhiệm vụ xóa tất cả các blog có trạng thái là 0 vào lúc 1h sáng mỗi ngày thì sẽ làm như sau:
Bước 1: Tạo 1 controller BlogController trong console/controllers
- Để tạo controller, các đồng dev có thể vào Gii để tạo, không có thì trước đấy trên frontend hay backend xem có file controller nào không thì clone lại rồi sửa như này nhé =))
- Ở đây tại hạ có sẵn model Blog để gọi vào truy vấn nhé, gọi tạm từ bên backend sang cho nhanh =)). Anh em đồng dev chưa có thì nhớ tạo để truy vấn nhé.
<?php
namespace console\controllers;
use Yii;
use yii\console\Controller;
use backend\models\Blog;
class BlogController extends Controller
{
public function actionRemove()
{
Blog::deleteAll(['status' => 0]);
echo "Remove success".PHP_EOL;
}
}
Để chạy thử các đồng dev có thể chạy như sau, nhưng mà viết truy vấn khác đi để thử nhé =)) không như tại hạ là xóa bay màu luôn dữ liệu đó.
php yii blog/remove
OK, thế là không có lỗi gì, nếu có lỗi nó sẽ văng exception ra luôn nhé.
Tiếp theo, nếu tại hạ chỉ muốn xóa các blog có status = 0 và theo 1 category và 1 user đã tạo nào đó thì sao ? Rất đơn giản tại hạ sẽ truyền thêm tham số vào và chạy như sau
<?php
namespace console\controllers;
use Yii;
use yii\console\Controller;
use backend\models\Blog;
class BlogController extends Controller
{
public function actionRemove($category_id,$user_id)
{
Blog::deleteAll(['status' => 0,'category_id' => $category_id,'user_id' => $user_id]);
echo "Remove success with category_id: ".$category_id." and user_id: ".$user_id.PHP_EOL;
}
}
Tiếp tục chạy lênh test thử với category_id = 1 và user_id = 2
php yii blog/remove 1 2
OK, đã test thành công. Nếu các đồng dev dùng tham số không khai báo giá trị mặc định thì khi chạy phải truyền tham số vào không là sẽ báo lỗi
Bước 2: Cài đặt lệnh vừa test console lên crontab
- Để truy cập crontab trong linux các đồng dev dùng lệnh sau:
sudo crontab -e
Nếu là lần đầu nó sẽ hiển thị ra các tùy chọn để chọn trình sửa file crontab như này, tại hạ khuyến khích cứ dùng cái 1 là nano cho tiện hehe =)).
Xong thì gõ lại lệnh sudo crontab -e nhé sẽ mở ra file cronjob và các đồng dev chỉ việc cài lịch cho câu lệnh console để chạy thôi. Như ở trên tại hạ ví dụ là cài 1h sáng hàng ngày thì sẽ thêm vào như sau
Ở đây tại hạ vẫn dùng tham số nên để nguyên như vậy, anh em nào sau làm theo ý mình không dùng tham số thì bỏ nhé =))
Lưu lại xong hôm sau vào check dữ liệu xem có thay đổi như câu lệnh chạy không. Crontab anh em đồng dev chưa rõ thì có thể gg thêm nhé =)).
Tổng kết
Việc áp dụng console command trong Yii2 rất hữu ích không chỉ đối với việc chạy cronjob mà còn sử dụng được cho các tác vụ khác để duy trì cũng như phát triển ứng dụng. Bài viết chỉ tóm lược cách tổng quát nhất, Yii2 hỗ trợ rất nhiều thứ về console, anh em đồng dev có thể tham khảo thêm tại đây. Cảm ơn anh em đồng dev đã ghé đọc.