Как запустить файл из консоли в Laravel?

Здравствуйте. 

У меня возникла проблема: через роуты на сайте все работает корректно, но при попытке добавить задачи в крон Laravel не распознает модули. 

Я настраиваю это в файле <b>routes/console.php</b>, следуя инструкции из <a href="https://laravel.su/docs/11.x/scheduling" rel="nofollow">документации</a>. 

Когда я выполняю файл в его исходном виде, появляется ошибка <code>Class "Artisan" not found</code>. Если я добавляю следующий код: 
<pre><code>$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__) . "/..");
require $_SERVER["DOCUMENT_ROOT"].'/vendor/autoload.php';</code></pre> 
то возникает ошибка <b>Uncaught RuntimeException: A facade root has not been set.</b>. 

Как мне корректно выполнить необходимый код из консоли в <b>routes/console.php</b>?
  • 16 февраля 2025 г. 4:24
Ответы на вопрос 3
Для выполнения команд из файла `routes/console.php` в Laravel необходимо использовать консольный интерфейс, а не запускать его напрямую через PHP. Файл `routes/console.php` предназначен для определения консольных команд, которые могут быть выполнены в командной строке.

### Запуск консольной команды

1. Убедитесь, что у вас правильно настроены задачи в файле `routes/console.php`. Пример:
   ```php
   use Illuminate\Support\Facades\Artisan;

   Artisan::command('your:command', function () {
       $this->comment('This is your command output.');
       // Ваш код здесь
   });
   ```

2. Теперь, чтобы запустить вашу команду, используйте консоль (терминал). Например, для выполнения команды `your:command`, выполните следующую команду из корневого каталога вашего Laravel проекта:
   ```bash
   php artisan your:command
   ```

### Настройка задач крона

Если вы хотите добавить задачу в крон, вам нужно сначала убедиться, что у вас правильно настроен сам крон и что вы используете команду `schedule:run` для запуска задач, определенных в вашем приложении.

1. Откройте терминал и выполните команду, чтобы отредактировать крон:
   ```bash
   crontab -e
   ```

2. Добавьте следующую строку для запуска команд каждую минуту:
   ```bash
   * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
   ```
   Замените `/path-to-your-project` на фактический путь к вашему проекту.

После этого ваш крон будет выполнять команды, определенные в `app/Console/Kernel.php` методе `schedule`, который вызывается из `routes/console.php`.

### Примечания

- Убедитесь, что ваш сервер настроен для исполнения PHP и что у вас есть доступ к командной строке.
- Ошибка `Class "Artisan" not found` обычно возникает, когда вы пытаетесь запустить файл напрямую, который использует фасады Laravel, но окружение Laravel не инициализировано.
- Ошибка `A facade root has not been set` возникает по той же причине – вы пытаетесь использовать функционал Laravel вне контекста самого приложения.

Таким образом, для корректного выполнения вашего кода используйте `php artisan` и настройте задачи в кроне, а не пытайтесь запускать файлы напрямую.
Чекпоинты на ум приходят сразу  (проверяйте на локальном сервере тоже) - 

1) проверить, что команда console отрабатывается из папки лары
2) проверить, что команда console отрабатывается с абсолютными путями на проде
3) если не отрабатывается - сбросьте кэши, как минимум, и разбирайтесь почему
4) проверьте версию PHP и самое смешное, проверьте shortags. Я уже лет 10 как отказался от shorTags.
оставить в кроне только 
* * * * * cd /полный/путь/до/сайта && /usr/bin/php8.3 artisan schedule:run >> /dev/null 2>&1

остальное разруливать в routes/console.php (и оно прям вот по дефолту работает)

перед этим грохнуть папку вендор и файл композер.лок, выполнить composer install
Похожие вопросы