PHP:作为参数传递给闭包的对象的范围

时间:2018-06-17 12:55:48

标签: php websocket closures

参考以下答案的下列代码: How to reconnect a client automatically on ratchetphp?

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);

$app = function (Ratchet\Client\WebSocket $conn) use ($connector, $loop, &$app) {
$conn->on('message', function (\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
    echo "Received: {$msg}\n";
    $conn->close();
});

$conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) {
    echo "Connection closed ({$code} - {$reason})\n";

    //in 3 seconds the app will reconnect
    $loop->addTimer(3, function () use ($connector, $loop, $app) {
        connectToServer($connector, $loop, $app);
    });
});

$conn->send('Hello World!');
};

function connectToServer($connector, $loop, $app)
{
$connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost'])
    ->then($app, function (\Exception $e) use ($loop) {
        echo "Could not connect: {$e->getMessage()}\n";
        $loop->stop();
    });
}

connectToServer($connector, $loop, $app);

$loop->run();

有没有什么方法可以在$ app闭包之外调用$ conn对象的方法? 在关闭方法被调用3秒后,答案的代码重新连接,我想要做的是重新连接,如果我没有从套接字接收任何消息一段时间,所以我想添加一个定期的计时器如果最后收到的消息的时间戳超过30秒,则调用close方法的循环:

    $loop->addPeriodicTimer(30, function() use ($connector, $loop, $app){
    global $received;

    $last_timestamp = isset($received) ? strtotime($received->time) : 0;
    if(time() - $last_timestamp > 30){
        echo "No data received for more than 30 seconds! Trying to reconnect\n";
        $conn->close();
        connectToServer($connector, $loop, $app);
    }
});

不幸的是,我无法找到将$ conn对象置于$ app闭包范围之外的方法。任何帮助赞赏。感谢。

0 个答案:

没有答案