laravel squequeue返回swoole服务器上的结果不正确
描述
当调用定义为实现为应有的作业中的立面的服务时,将显示不正确的结果。
- Octane版本:1.2.12
- Laravel版本:9.9.0
- PHP版本:8.1.6
- 服务器&版本:Swoole 4.8.5
复制步骤:
CLI
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
结果
5
- 10
5
510
5
10
在服务中(定义为从作业称为from的立面)
5
10
5
5
5
5
namespace App\Observers;
class MessageObserver
{
public function created(Message $message)
{
SendMessage::dispatch($message); // call 1, 2, 3, 4, 5, 6
}
}
namespace App\Jobs;
use App\Models\Message;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Message as MessageFacade;
class SendMessage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $message;
public function __construct(Message $message)
{
$this->message = $message;
}
public function handle()
{
// logger($this->message->id); => 1, 2, 3, 4, 5, 6
MessageFacade::model($this->message)->send();
}
}
namespace App\Services\Message;
use App\Models\Message;
use App\Services\Message\Services\Text;
use Illuminate\Support\Manager;
class MessageManager extends Manager
{
protected $message;
public function getDefaultDriver()
{
return null;
}
protected function createTextDriver()
{
return new Text($this->message);
}
public function model(Message $message)
{
$this->message = $message;
// logger($this->message->id); => 1, 2, 3, 4, 5, 6
return $this->driver($this->message->service->value);
}
}
namespace App\Services\Message\Services;
use App\Models\Message;
class Text
{
protected $message;
public function __construct(Message $message)
{
$this->message = $message;
}
public function send()
{
...
// logger($this->message->id); => 1, 1, 1, 1, 1, 1
...
}
}
namespace App\Providers;
use App\Services\Message\MessageManager;
use Illuminate\Support\ServiceProvider;
class MessageServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('message', function ($app) {
return new MessageManager($app);
});
}
public function boot()
{
//
}
}
Description
When calling a service defined as a facade in a Job implemented as ShouldQueue, an incorrect result is displayed.
- Octane Version: 1.2.12
- Laravel Version: 9.9.0
- PHP Version: 8.1.6
- Server & Version: Swoole 4.8.5
Steps To Reproduce:
CLI
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
Job::dispatch(Model::find(5));
Job::dispatch(Model::find(10));
Result
In job
5
10
5
10
5
10
In service (defined as a facade called from job)
5
10
5
5
5
5
namespace App\Observers;
class MessageObserver
{
public function created(Message $message)
{
SendMessage::dispatch($message); // call 1, 2, 3, 4, 5, 6
}
}
namespace App\Jobs;
use App\Models\Message;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Message as MessageFacade;
class SendMessage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $message;
public function __construct(Message $message)
{
$this->message = $message;
}
public function handle()
{
// logger($this->message->id); => 1, 2, 3, 4, 5, 6
MessageFacade::model($this->message)->send();
}
}
namespace App\Services\Message;
use App\Models\Message;
use App\Services\Message\Services\Text;
use Illuminate\Support\Manager;
class MessageManager extends Manager
{
protected $message;
public function getDefaultDriver()
{
return null;
}
protected function createTextDriver()
{
return new Text($this->message);
}
public function model(Message $message)
{
$this->message = $message;
// logger($this->message->id); => 1, 2, 3, 4, 5, 6
return $this->driver($this->message->service->value);
}
}
namespace App\Services\Message\Services;
use App\Models\Message;
class Text
{
protected $message;
public function __construct(Message $message)
{
$this->message = $message;
}
public function send()
{
...
// logger($this->message->id); => 1, 1, 1, 1, 1, 1
...
}
}
namespace App\Providers;
use App\Services\Message\MessageManager;
use Illuminate\Support\ServiceProvider;
class MessageServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('message', function ($app) {
return new MessageManager($app);
});
}
public function boot()
{
//
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
已解决。
这不是一个问题。
即使在服务提供商中使用了绑定方法,外墙也像单身人士一样。
Solved.
This is not a swoole problem.
Even if the bind method was used in the service provider, the facade behaved like a singleton.