我的特质中有这样的功能:
public function cupPlayMatch(Season $season, $round_id)
{
foreach($season->cups as $cup)
{
$this->cupPlay($cup, $round_id);
}
}
当第一个杯赛结束时,第二个杯赛就开始了。我如何开始同时玩我所有的杯子?
在大多数情况下,PHP是"同步的",这意味着理论上不能对任何函数进行"同时调用"。
然而,存在一些变通办法来实现这一点。
PHP是一种脚本语言。所以当你在控制台中启动这个时:
php -r "echo 'Hello World';"
启动一个PHP进程,该进程中发生的任何事情都将同步执行。
因此,这里的解决方案是启动各种PHP进程,以便能够同时运行函数。
想象一下,在一个SQL表中,您放置了要同时执行的所有函数。然后,您可以运行10个php进程,这些进程实际上"同时"工作。
Laravel为这个问题提供了一个开箱即用的解决方案。正如@Anton Gildebrand在评论中提到的那样,它被称为"排队"。
您可以在此处找到文档:https://laravel.com/docs/5.5/queues
最巧妙的做法是创造"就业机会"。每个作业都表示要执行的功能。在这里,您的工作将是cupPlay
。
以下是从文档粘贴作业副本的基本示例:
<?php
namespace AppJobs;
use AppPodcast;
use AppAudioProcessor;
use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
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
它将执行您的任务。
根据您的需求,您可以执行任意数量的员工。。。
我希望这能有所帮助!