【问题标题】:Setting up queue in Laravel 5在 Laravel 5 中设置队列
【发布时间】:2015-08-08 13:50:29
【问题描述】:

我在返回 HTTP 响应后尝试运行代码。我知道 Laravel 5 支持 queues,但我仍然觉得它们令人困惑。我正在尝试在用户注册后运行代码,这需要用户的密码和用户名。 This answer 看起来很有趣,但并不直接适用于 Laravel。

  • 如何在队列中创建作业?
  • 如何将数据传递给新作业?

我知道这听起来很懒惰,但我真的不懂文档。

【问题讨论】:

    标签: php laravel queue laravel-5


    【解决方案1】:

    设置队列首先需要选择您将使用的驱动程序。因为它运行起来最快,所以我将解释如何从database 驱动程序开始,因为它不需要在服务器上安装任何其他服务(例如beanstalkd 就是这种情况)。设置方法如下:

    1. 在您的.env 文件中设置QUEUE_DRIVER

    QUEUE_DRIVER=database
    

    2. 运行此命令生成jobs 表的迁移文件,该文件将用于存储作业信息:

    php artisan queue:table
    

    3. 现在运行迁移以创建表:

    php artisan migrate
    

    创建了一个jobs 表,用于在将作业推送到队列时存储数据。


    您可以将命令和 clojures 推送到队列中。为简洁起见,我将展示一个如何将闭包推入队列的示例:

    $username = Request::input('username');
    $password = Request::input('password');
    
    // Do your registration stuff
    
    // Push a job onto the queue
    \Queue::push(function($job) use ($username, $password)
    {
        // Do the stuff you need here with $username and $password
    
        // Delete the job from the queue
        $job->delete();
    });
    

    完成这项工作的最后一步是运行队列侦听器。除非队列侦听器正在运行,否则不会自动处理作业。所以运行这个命令:

    php artisan queue:listen
    

    您可以采取进一步的步骤,例如设置Supervisor 来监控并在队列侦听器崩溃时重新启动它,但这应该足以让您开始。

    【讨论】:

    • 感谢您的回答。我更改了我的代码,但它以Class 'App\Services\Queue' not found 失败。我尝试将use App\Services\Queue 添加到页面顶部,但这并没有解决问题。我错过了什么?
    • 有两种选择:使用\Queue::push() 代替Queue::push(),或者在文件顶部添加use Queue;
    • 还有一件事(告诉我这是否应该是一个新问题):我正在尝试运行代码,但大约 30 秒后得到FatalErrorException in SerializableClosure.php(153) : eval()'d code line 86: Class 'App\Services\Auth' not found。这是否意味着该作业从未真正放入队列中?
    • Queue的问题一样。您在 App\Services 命名空间中。这意味着如果您使用Auth,它会自动假定该命名空间中的类并会尝试加载App\Services\Auth。那当然不是当然是不正确的,因为所有 Laravel 别名都在全局命名空间中。所以解决方案是一样的:你要么在文件顶部添加use Auth;,要么像\Auth那样在前面加上一个反斜杠。您可以在PHP Documentation 中阅读有关命名空间如何工作的更多信息。
    • @Bogdan php artisan queue:listen 命令在 Laravel 5.4 中给出 InvalidArgumentException: The "force" option doesn't exist
    【解决方案2】:

    一般我们这样在队列上传递数据-

    在我们编写的控制器上 -

    $this->dispatch(new videoToAudioConvert($video_id))
    

    在工作部分你必须这样写 -

    protected $video_id
    
    public function __contructor($video_id){
      $this->video_id = $video_id
    }
    
    public function handle(){
      $this->video_id
    }
    

    您可以了解如何在队列中创建作业以及如何从here 传递变量。

    【讨论】:

      【解决方案3】:

      作业表中存储的需求数据是什么 我用它来发送带有队列的电子邮件,我会安排它 我做了前三个步骤。 在 .env 文件中设置 QUEUE_DRIVER:

      QUEUE_DRIVER=数据库 2. 运行此命令生成作业表的迁移文件,该文件将用于存储作业信息:

      php 工匠队列:表 3. 现在运行迁移以创建表:

      php 工匠迁移 创建了一个作业表,该表将在将作业推送到队列时存储数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 2015-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-12-08
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多