Laravel同步发射功能

时间:2017-10-24 14:43:50

标签: php laravel simultaneous-calls

我的特质中有这样的功能:

public function cupPlayMatch(Season $season, $round_id)
{

    foreach($season->cups as $cup)
    {
        $this->cupPlay($cup, $round_id);
    }

}
当第一杯结束时,第二杯开始播放。我如何同时开始玩所有杯子?

1 个答案:

答案 0 :(得分:1)

在大多数情况下,PHP是“同步的”,这意味着理论上你不能对任何函数进行“同时调用”。

但是,有一些变通方法可以使这项工作成功。

PHP是一种脚本语言。因此,当您在控制台中启动它时:

php -r "echo 'Hello World';"

启动PHP 进程,此进程中发生的任何事情都会同步执行。

所以这里的解决方案是启动各种PHP进程,以便能够同时运行函数。

想象一下一个SQL表,您可以在其中放置要同时执行的所有函数。然后你可以运行10个实际上“同时”工作的php进程。

Laravel开箱即用解决了这个问题。正如@Anton Gildebrand在评论中提到的那样,它被称为“队列”。

您可以在此处找到文档:https://laravel.com/docs/5.5/queues

laravel的做法是创造“工作”。每个Job代表您要执行的功能。在这里,您的工作将是cupPlay

以下是从文档中粘贴的作业副本的基本示例:

<?php

namespace App\Jobs;

use App\Podcast;
use App\AudioProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;

    /**
     * Create a new job instance.
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }

    /**
     * Execute the job.
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle(AudioProcessor $processor)
    {
        // Process uploaded podcast...
    }
}

如果您已配置工作者驱动程序来运行队列,则只需启动:

php artisan queue:work --queue=high,default
从命令行

,它将执行您的任务。

根据您的需要,您可以根据需要执行任意数量的工作人员......

我希望这有帮助!