Artisan::call() 在 Laravel 框架之外
Artisan::call() outside the Laravel framework
我想为 Laravel 5.2
创建一个 cron 作业
我的共享主机(在 OVH 上)只允许我指向文件的完整路径,我无法使用 Laravel 文档中推荐的 Cron 条目,即:
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
因此,我必须从 Laravel 框架之外的 .php 文件调用 Artisan 命令。
这是我的 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,我尝试直接调用底层内核 Class:
use Illuminate\Contracts\Console\Kernel;
$kernel = new Kernel;
$kernel->call('refresh');
但是这个returns:
Uncaught Error: Cannot instantiate interface Illuminate\Contracts\Console\Kernel
编辑:这是 OVH cron 界面的屏幕截图。 cron 任务由 OVH 自定义,只允许指向文件的完整路径 uri - 哪个文件将执行我的 artisan 命令。我的问题是,我应该在这个文件中放什么,它应该是 PHP 文件,还是 CMD?
如果您只想设置一个 cron 作业。请编辑 crontab 并使用 "your/app/path/php artisan cron:job" 直接执行您的命令。
试试简单的:
shell_exec('php artisan refresh');
如果它不起作用,请尝试向 php
和 artisan
添加适当的路径。
您想要做的是运行脚本中的特定 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 Component documentation。
如果您需要将参数传递给脚本,只需相应地设置输入即可:
$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 的主机的根目录下,我的意思是不在 www 中,你只需要非常简单地填写表格:
如果您希望您的脚本可以通过网络访问(出于明显的安全原因,不推荐这样做,但仍然如此),请将它放在您的 www
目录中,将路径更改为 bootstrap/autoload.php
和 bootstrap/app.php
并为您的脚本起一个不容易猜到的名称。
在OVH管理器的表单中,不要忘记在脚本路径的开头添加www/
。
不需要指定php script_name
,因为当您选择PHP版本时,经理会为您处理。只需键入脚本的路径 PHP 即可执行。
我想为 Laravel 5.2
创建一个 cron 作业我的共享主机(在 OVH 上)只允许我指向文件的完整路径,我无法使用 Laravel 文档中推荐的 Cron 条目,即:
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
因此,我必须从 Laravel 框架之外的 .php 文件调用 Artisan 命令。
这是我的 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,我尝试直接调用底层内核 Class:
use Illuminate\Contracts\Console\Kernel;
$kernel = new Kernel;
$kernel->call('refresh');
但是这个returns:
Uncaught Error: Cannot instantiate interface Illuminate\Contracts\Console\Kernel
编辑:这是 OVH cron 界面的屏幕截图。 cron 任务由 OVH 自定义,只允许指向文件的完整路径 uri - 哪个文件将执行我的 artisan 命令。我的问题是,我应该在这个文件中放什么,它应该是 PHP 文件,还是 CMD?
如果您只想设置一个 cron 作业。请编辑 crontab 并使用 "your/app/path/php artisan cron:job" 直接执行您的命令。
试试简单的:
shell_exec('php artisan refresh');
如果它不起作用,请尝试向 php
和 artisan
添加适当的路径。
您想要做的是运行脚本中的特定 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 Component documentation。
如果您需要将参数传递给脚本,只需相应地设置输入即可:
$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 的主机的根目录下,我的意思是不在 www 中,你只需要非常简单地填写表格:
如果您希望您的脚本可以通过网络访问(出于明显的安全原因,不推荐这样做,但仍然如此),请将它放在您的 www
目录中,将路径更改为 bootstrap/autoload.php
和 bootstrap/app.php
并为您的脚本起一个不容易猜到的名称。
在OVH管理器的表单中,不要忘记在脚本路径的开头添加www/
。
不需要指定php script_name
,因为当您选择PHP版本时,经理会为您处理。只需键入脚本的路径 PHP 即可执行。