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 

yii2 console

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

yii2 console

<?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 đólaugh.

php yii blog/remove

yii2 console

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

yii2 console

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 =)).

yii2 console

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

yii2 console`

Ở đâ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.