向 UDP $server->on() 回调函数传入额外参数

问题描述 投票:0回答:1

我有一个现有的 PHP 进程,它通过 UDP 接收数据,然后将该数据推送到 Beanstalk(beanstalkd 不是 AWS Elastic Beanstalk)。 然后另一个进程从 beanstalk 中提取这些数据(beanstalk 充当缓冲区,因为 UDP 消息速率变化很大)并在推送到 Redis 之前对其进行处理。

我试图通过将其移植到 OpenSwoole 来加快我的流程,今天我花了大部分时间试图理解它,但我很难真正理解这些文档,因为没有”没有任何与我的用例类似的示例。

我正在使用这里的 OpenSwoole 兼容 beanstalkd 库:

https://github.com/xpader/swbeanstalk/blob/master/example/test.php

使用 $scheduler->add('coJobProducer'); 行注释掉并附加以下代码:

// Start a new UDP server on 12.0.0.1, listening on port 9502
$server = new OpenSwoole\Server('127.0.0.1', 9502, OpenSwoole\Server::POOL_MODE, OpenSwoole\Constant::SOCK_UDP);

// Get connection to beanstalk
$client = getConnection();
$client->useTube('test');

// Setup the incoming data event callback, called 'Packet'
$server->on('Packet', function ($server, $data, $clientInfo) {
    global $client;
    $ret = $client->put($data);
});

// Start the server and begin accepting incoming requests
$server->start();

是否可以将附加参数传递到 $server->on() 函数中。 如果是这样怎么办?我已经尝试将 $client 附加到函数参数列表中,并将其声明为全局的(呃!),但我现在已经没有想法了......

理想情况下,我想扩展 $server->on() 回调函数来进行更多处理,但为此我需要传入相当多的类实例、变量等。

php openswoole
1个回答
0
投票

经过多次谷歌搜索后,我找到了解决方案:.

全局变量不能在协程中使用,因此可以通过 on-> 调用末尾的 use ($variable) 选项来实现,如下所示:

// Setup the incoming data event callback, called 'Packet'
$server->on('Packet', function ($server, $data, $clientInfo) use ($client) {
    $ret = $client->put($data);
});

如果需要将多个变量传递到函数中,那么也可以使用:use ($variable1, $variable2)

真的很简单!

© www.soinside.com 2019 - 2024. All rights reserved.