PHP WebSocket.关闭时发送消息吗?

inkz8wg9  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(88)

我用workerman/workerman来做websocket。主要的问题是-如何在websocket关闭时发送消息?我也试着向其他连接发送消息。也没有结果。

public function run()
    {
        $this->ws = new Worker(
            'websocket://0.0.0.0:' . $_ENV['WS_PORT'],
            ['ssl' => [
                'local_cert'  => $_ENV['WS_CERTIFICATE_CRT'],
                'local_pk'    => $_ENV['WS_CERTIFICATE_KEY'],
                'verify_peer' => false,
            ]]
        );
        $this->ws->count = 1;
        $this->ws->transport = 'ssl';

        $this->ws->onConnect = function ($connection) {
            $this->onConnect($connection);
        };

        $this->ws->onMessage = function ($connection, $data) {
            $this->onMessage($connection, $data);
        };

        $this->ws->onClose = function ($connection) {
            $this->onClose($connection);
        };

        Worker::runAll();
    }

这不管用

private function onClose($connection)
{
    $connection->send("Hello");
}
mdfafbf1

mdfafbf11#

查看workerman/workerman的源代码,我们可以看到onClose事件的实现方式如下:

// Close socket.
        try {
            @fclose($this->socket);
        } catch (Throwable) {
        }

        $this->status = self::STATUS_CLOSED;
        // Try to emit onClose callback.
        if ($this->onClose) {
            try {
                ($this->onClose)($this);
            } catch (Throwable $e) {
                $this->error($e);
            }
        }

如您所见,onClose在套接字关闭后发出。
因此,您将无法再在onClose处理程序中使用该套接字。
更好的解决方案是客户机向服务器发送某种“关闭”数据包。
然后服务器可以运行一些逻辑,并在完成后关闭连接。

相关问题