У меня есть такая функция в моей черте:
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 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
из командной строки, и он будет выполнять ваши задачи.
И вы можете выполнять столько рабочих, сколько захотите, в зависимости от ваших потребностей …
Надеюсь, это поможет!
Других решений пока нет …