Я хочу создать работу 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?
То, что вы хотите сделать, – запустить определенную команду 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, вам просто нужно заполнить форму очень просто:
Если вы хотите, чтобы ваш скрипт был доступен через Интернет (который не рекомендуется по очевидным причинам безопасности, но все же), поместите его в свой каталог 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
.