Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Консольные команды

Не всё на сайте происходит по запросу браузера: рассылку, чистку старых записей или импорт запускают из терминала или по расписанию. Для этого пишут консольные команды. Команда в 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 в команде закончится ошибкой. Всё нужное передавайте аргументами.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.