Консольные команды
Не всё на сайте происходит по запросу браузера: рассылку, чистку старых записей или импорт запускают из терминала или по расписанию. Для этого пишут консольные команды. Команда в Yii — тот же контроллер с действиями, только вызывается он через файл yii.
Где лежит команда
Команды хранятся в папке commands, пространство имён — app\commands. В проекте уже есть пример commands/HelloController.php. Создайте вручную свой файл:
// commands/PostController.php
namespace app\commands;
use app\models\Post;
use yii\console\Controller;
use yii\console\ExitCode;
class PostController extends Controller
{
public function actionCount(): int
{
$count = Post::find()->count();
$this->stdout("Статей в базе: $count\n");
return ExitCode::OK;
}
}php yii post/countКоманда напечатает число статей. Маршрут строится так же, как на сайте: контроллер и действие. stdout() выводит текст в терминал, а ExitCode::OK сообщает системе, что команда завершилась успешно.
Аргументы
Аргументы метода — это слова после имени команды:
public function actionPublish($id): int
{
$post = Post::findOne($id);
if ($post === null) {
$this->stderr("Статья $id не найдена\n");
return ExitCode::DATAERR;
}
$post->status = 1;
$post->save();
$this->stdout("Статья $id опубликована\n");
return ExitCode::OK;
}php yii post/publish 5Число 5 попадёт в аргумент $id. stderr() выводит сообщение об ошибке, а код, отличный от ExitCode::OK, сообщает о неудаче.
Параметры
Параметр — необязательная настройка вида --имя=значение. Его объявляют свойством класса и перечисляют в методе options():
public $days = 30;
public function options($actionID): array
{
return array_merge(parent::options($actionID), ['days']);
}
public function actionClean(): int
{
$deleted = Post::deleteAll([
'and',
['status' => 0],
['<', 'created_at', time() - $this->days * 86400],
]);
$this->stdout("Удалено черновиков: $deleted\n");
return ExitCode::OK;
}php yii post/clean --days=90Команда удалит черновики старше 90 дней; без параметра — старше 30.
Справка
| Команда | Что показывает |
|---|---|
php yii | Список всех команд |
php yii help post | Действия контроллера post |
php yii help post/clean | Аргументы и параметры действия |
Описание команды в справке берётся из комментария перед методом.
Запуск по расписанию
На сервере команды запускает планировщик cron. Строка в его таблице:
0 3 * * * php /var/www/blog/yii post/clean --days=90Каждую ночь в три часа сервер выполнит чистку. Путь к файлу yii указывают полностью.
Частая ошибка
Консоль читает config/console.php, а не config/web.php. В ней нет запроса, сессии и текущего пользователя: обращение к Yii::$app->user или Yii::$app->session в команде закончится ошибкой. Всё нужное передавайте аргументами.