gpt4 book ai didi

php - 有没有办法在子进程中传递服务/容器?

转载 作者:行者123 更新时间:2023-12-04 13:08:32 28 4
gpt4 key购买 nike

我正在测试 spatie 的异步项目。我创建了一个这样的任务。

use Spatie\Async\Task;

class ServiceTask extends Task
{
protected $accountService;
protected $serviceFactory;

public function __construct(ServiceFactory $serviceFactory)
{
$this->serviceFactory = $serviceFactory;
}
public function configure()
{
$this->accountService = $this->serviceFactory->getAccountService();
}

public function run()
{
//accounting tasks
}
}

对于游泳池:

$pool = Pool::create();

foreach ($transactions as $transaction) {
$pool->add(new ServiceTask($serviceFactory))
// handlers
;
}

$pool->wait();

当我运行上面的代码时,我得到了

Serialization of 'Closure' is not allowed

我知道我们不能简单地序列化一个闭包,我用一个简单的纯数据传输对象尝试了上面的相同代码,它运行良好。但是当从 symfony 传递服务或容器类时,我遇到了上述错误。有解决办法吗?

最佳答案

简答:否

更长的答案:Spatie Async 在将任务添加到池之前将其序列化,因此您可能需要一个替代解决方案。

为什么 Async 需要序列化任务

查看相关代码以了解发生了什么: Pool::add > ParentRuntime::createProcess > ParentRuntime::encodeTask .

有关更多讨论,请参阅 thisthis spatie/async 的问题列表中的问题。

替代方案:Symfony Messenger

这个问题有很多替代方案。由于您使用的是 Symfony,因此您可能对 Symfony Messenger 感兴趣将消息发送给处理程序。这些处理程序可以使用依赖注入(inject):

class DefaultController extends AbstractController
{
public function index(MessageBusInterface $bus)
{
$bus->dispatch(new ServiceTask('Look! I created a message!'));
}
}

class ServiceTaskHandler implements MessageHandlerInterface
{
protected $accountService;
protected $serviceFactory;

public function __construct(ServiceFactory $serviceFactory)
{
$this->serviceFactory = $serviceFactory;
$this->accountService = $this->serviceFactory->getAccountService();
}

public function __invoke(ServiceTask $task)
{
$this->accountService->handle($task);
}
}

请注意,任务(本例中的 ServiceTask)也应该(如 spatie/async 的任务)是可序列化的。因此,您可以将 ID 作为消息发送,并在 MessageHandler

中查找该 ID

关于php - 有没有办法在子进程中传递服务/容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68239279/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com