Laravel 设置,试图让 cronjob 调用 php laravel 文件中的函数

Laravel setup, trying to have cronjob call a function within php laravel file

原版Post

大家晚上好。我有一个 laravel 设置,我正在尝试让 cronjob 对 laravel 项目目录中的文件执行 php 函数。

当我尝试执行以下操作时出现 class 和名称 space 错误:

<?php
require_once('../laravel/app/Http/Controllers/NotificationsController.php');

然后调用processQueuedNotifications()函数。

这当然会给我错误,在 laravel 目录中调用我的函数的正确方法是什么? 我需要调用这个函数,因为这个函数有正确执行功能所需的所有正确名称space和扩展控制器。


更新 1:

多亏了@michael,我才知道 Laravel 中有一个名为 commands 的组件。

所以我 运行 这个代码: php artisan make:console processQueuedNotifications 并在控制台目录中创建了一些文件。

目前正在探索下一步该做什么。

  1. 查看 kernel.php 文件使用的 Events class 后,我注意到这个 class 提供了一个易于使用界面让我即时创建 cron 作业。我这样想对吗?

  2. 我注意到没有 运行 每分钟 cron 作业的功能,编辑 Events class 文件而不被覆盖是否安全未来 make:console 个命令,或 laravel 个更新?

  3. 我在 kernel.php 文件中看到这段代码:

    $schedule->command('inspire')
                     ->hourly();
    

所以这是你要我添加功能的地方吗?正如我注意到启发功能是自动创建的,以便我了解发生了什么?

所以我会写,

$schedule->command('processQueuedNotifications')
                 ->everyMinute();
//Providing it's safe to edit the Event's class or figure out a clean way of doing so without my code being deleted in the future on Laravel updates.

一个非常方便的方法是使用laravels控制台组件。您可以通过发出

创建一个新命令
php artisan make:console

然后在您的 app/console 目录中找到它。创建后,确保在 Kernel.php 文件中启用该命令。

只需从命令内部通过 cron 调用您的 class 或您想要 运行 的任何内容。控制台命令本身可以通过 cli 调用,就像 运行 laravels php artisan ... 命令之一一样。您可以在为您创建的文件中进行设置。例如,您可以使用

从任何地方调用该文件
/usr/bin/php /path/to/file/artisan my:command

如果需要,您可以设置选项和参数。

这是文档:http://laravel.com/docs/5.0/commands / http://symfony.com/doc/current/components/console/introduction.html

kernel.php 中有一个数组,您需要在其中注册您的 class(包括命名空间)。之后可以通过 cli 调用它。首先,看看您可以初始化的参数和选项,以防您需要在控制器上发出不同的请求 class。 (您为控制台命令选择的文件名是一个参数。您可以将它们设为您自己的命令的必需项或可选项。)

在您的文件中,您可以通过使用这些值在适当的方法中简单地创建一个数组来创建它们:

 [$name, $mode, $description, $defaultValue]

看看文档或 Jeffrey 的 laracasts,它们非常好。

要仅从控制台命令调用您的 class,只需在文件的上述部分中命名您的命令并称您为控制器即可

(new namespace\controller)->method();

更新后您可以在代码中做什么,2 个选择:

  1. 使用 Bus facade 从您的代码中直接调度命令

首先使用 use Illuminate\Support\Facades\Bus;

然后在你的代码中

Bus::dispatchNow(new YourCommandClass);

(别忘了导入你的命令class)

  1. 使用相同的总线外观为队列进程调度它:

(仍然以同样的方式导入)

Bus::dispatch(new YourCommandClass);

(请注意,在这种情况下,您的 cron 作业需要使用以下命令 运行:

php artisan queue:listen

它可以处理几个选项,例如 --tries=X 其中是尝试次数等

一般来说,您可以通过键入 php artisan my:command -h

命令来获取更多信息