Artisan :: call () вне рамки Laravel

Я хочу создать работу cron для Laravel 5.2

Мой общий хост (на OVH) позволяет мне указывать полный путь к файлу, и я не могу использовать рекомендуемую запись Cron из документов Laravel, то есть:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 

Поэтому я должен вызвать команду Artisan из .php-файла, вне рамки Laravel.

Вот как выглядит мой public/cron.php файл:

 <?php require __DIR__.'/../bootstrap/autoload.php'; use Illuminate\Support\Facades\Artisan; Artisan::call('refresh'); 

refresh – моя команда для восстановления эскизов внутри моего приложения.

При доступе к cron.php через мой браузер (тестирование на локальном XAMPP) возникает следующая ошибка:

 Fatal error: Uncaught RuntimeException: A facade root has not been set. in C:\xampp\htdocs\site\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:210 Stack trace: #0 C:\xampp\htdocs\site\public\cron.php(7): Illuminate\Support\Facades\Facade::__callStatic('call', Array) #1 {main} thrown in C:\xampp\htdocs\site\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php on line 210 

Я также пытался загрузить приложение, но он не делает никаких различий

 $app = require_once __DIR__.'/../bootstrap/app.php'; $app->boot(); 

Чтобы избежать использования Artisan Facade, я попытался напрямую вызвать базовый класс ядра:

 use Illuminate\Contracts\Console\Kernel; $kernel = new Kernel; $kernel->call('refresh'); 

Но это возвращает:

 Uncaught Error: Cannot instantiate interface Illuminate\Contracts\Console\Kernel 

EDIT: Вот скриншот интерфейса OVH cron. Задача cron настраивается OVH и позволяет указывать на полный путь uri файла – какой файл выполнил бы мою команду artisan. Мой вопрос в том, что я должен положить в этот файл, и должен ли он быть файлом PHP или CMD?

Интерфейс OVH cron

То, что вы хотите сделать, – запустить определенную команду Artisan из сценария.

Вы можете добиться этого, скопировав artisan.php и заставив вход в то, что вы хотите:

 #!/usr/bin/env php <?php require __DIR__.'/bootstrap/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); $status = $kernel->handle( $input = new Symfony\Component\Console\Input\ArrayInput(['command' => 'refresh']), new Symfony\Component\Console\Output\ConsoleOutput ); $kernel->terminate($input, $status); exit($status); 

Если вы сравните этот скрипт с artisan.php, вы увидите, что я просто принудительно передал вход, переданный $kernel->handle() . Он больше не читает ввод от CLI, он принимает эти аргументы как массив. Дополнительную информацию см. В документации по компонентам Symfony Console .

Если вам нужно передать аргументы в свой скрипт, просто установите вход соответственно:

 $input = new Symfony\Component\Console\Input\ArrayInput([ 'command' => 'refresh', 'arg_foo' => 'foo', '--option_bar' => 42 ]); $status = $kernel->handle( $input, new Symfony\Component\Console\Output\ConsoleOutput ); 

Теперь вы можете поместить этот скрипт туда, где хотите, он не должен быть доступен через Интернет через браузер (кстати, он не должен).

Если вы поместите его в корень вашего хостинга в OVH, я имею в виду NOT на www, вам просто нужно заполнить форму очень просто:

OVH Shared Hosting Cronjob - Шаг 1

Если вы хотите, чтобы ваш скрипт был доступен через Интернет (который не рекомендуется по очевидным причинам безопасности, но все же), поместите его в свой каталог www , измените пути на bootstrap/app.php и bootstrap/app.php и дайте сценарий – это имя, которое нелегко догадаться.

В форме в диспетчере OVH не забудьте добавить www/ в начале пути скрипта.

Нет необходимости указывать имя php script_name , поскольку менеджер обрабатывает его для вас, когда вы выбираете версию PHP. Просто введите путь к скрипту PHP.

Если вы просто хотите установить задание cron. отредактируйте crontab и используйте «your / app / path / php artisan cron: job», чтобы выпустить вашу команду напрямую.

Просто попробуйте просто:

 shell_exec('php artisan refresh'); 

Если это не сработает, попробуйте добавить соответствующие пути как к php и к artisan .