laravel squequeue返回swoole服务器上的结果不正确

发布于 2025-02-06 20:03:10 字数 3352 浏览 3 评论 0原文

描述

当调用定义为实现为应有的作业中的立面的服务时,将显示不正确的结果。

  • 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 5
  • 10
  • 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蒗幽 2025-02-13 20:03:10

已解决。

这不是一个问题。

即使在服务提供商中使用了绑定方法,外墙也像单身人士一样。

<?php

namespace App\Support\Facades;

use Illuminate\Support\Facades\Facade;

class Message extends Facade
{
  protected static function getFacadeAccessor()
  { 
    self::clearResolvedInstance('message'); // will be solved.

    return 'message';
  } 
}

Solved.

This is not a swoole problem.

Even if the bind method was used in the service provider, the facade behaved like a singleton.

<?php

namespace App\Support\Facades;

use Illuminate\Support\Facades\Facade;

class Message extends Facade
{
  protected static function getFacadeAccessor()
  { 
    self::clearResolvedInstance('message'); // will be solved.

    return 'message';
  } 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文