Laravel/PHP-并行运行3个PHP函数
我有3个函数从外部API获取json数据,然后保存到数据库中。每个函数都属于自己的类,例如:Laravel/PHP-并行运行3个PHP函数,php,laravel,scheduler,Php,Laravel,Scheduler,我有3个函数从外部API获取json数据,然后保存到数据库中。每个函数都属于自己的类,例如: Class api1 { public function fetch() { //Do Something } } Class api2 { public function fetch() { //Do Something } } 因为它的api调用可能需要一些时间或延迟。我想并行运行所有3个,这样api2就不必等待api1完成 有办法吗 *注意:我
Class api1 {
public function fetch()
{
//Do Something
}
}
Class api2 {
public function fetch()
{
//Do Something
}
}
因为它的api调用可能需要一些时间或延迟。我想并行运行所有3个,这样api2就不必等待api1完成
有办法吗
*注意:我还将使用laravel scheduler,它将每分钟运行一次每个函数,或者运行一个包含所有3个函数的函数。在我看来,这更像是对数据的回调请求,因此为了防止应用程序速度减慢,这应该是一项后台工作 但在此之前,我将为这些类实现一个接口:
interface apiService{
public function fetch();
}
Class api1 implements apiService {
public function fetch()
{
//Do Something
}
}
Class api2 implements apiService{
public function fetch()
{
//Do Something
}
}
创建作业类php artisan make:job dataFetcher
作业将在App\Jobs\
Laravel中的job类非常简单,它由一个构造函数和handle()
组成,用于注入依赖项并触发该作业
protected $service;
public function __construct(apiService $service)
{
$this->service = $service;
}
public function handle()
{
$this->apiService->fetch();
}
注意,我正在注入接口,而不是具体的类,在这里使用更高级的代码。因此,现在您可以创建一个命令来使用cron作业触发调用,也可以创建一个自定义服务提供程序来在应用程序启动后立即触发命令
我将在此处使用自定义artisan命令:
因此,只需在handle方法上创建一个自定义artisan
public function handle()
{
Job::dispatch(new FirstApiClass);
Job::dispatch(new SecondApiClass);
}
Handle方法将执行第一行,作业将在后台处理(不管作业是否失败),然后将触发下一个调用,依此类推
注意接口的使用在这种情况下,只要您提供了一个实现,Job类并不真正关心您调用的是哪个服务 您可以为每个api创建3个队列。如果你想按顺序运行它们,你可以用这个:我写这个作为一个评论,因为我只有90%确定我完全理解。但是您想要的听起来像是
线程
在PHP中不是现成的东西。然而,Laravel有一个叫做的东西,它可以让你在NodeJ的帮助下使用线程。相关:@Christophvh作业链化基于链设计模式,因此如果一个作业失败,其他作业将失败。在他的情况下,如果第一次调用失败,其余的将不会执行。它们是并行运行还是1by1?请确保Laravel的队列使用同步驱动程序@亚当斯