wpjscc/pawl

异步WebSocket客户端

维护者

详细信息

github.com/wpjscc/Pawl

源代码

v0.4.1 2023-09-19 12:11 UTC

This package is auto-updated.

Last update: 2024-09-19 14:16:53 UTC


README

Autobahn Testsuite CI status

PHP中的异步WebSocket客户端

通过composer安装

composer require ratchet/pawl

用法

Pawl作为独立应用程序:连接到echo服务器,发送消息,显示输出,关闭连接

<?php

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

\Ratchet\Client\connect('wss://echo.websocket.org:443')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

在Pawl中有三个主要的类需要注意和使用

Connector

向服务器发送HTTP请求,返回一个承诺,如果成功,将解析为WebSocket对象。通过构造函数配置连接器,通过调用类来发起请求。可以通过单个连接器建立多个连接。invoke方法有三个参数

  • $url: 字符串;要连接的有效uri字符串(以ws://或wss://开头)(也接受PSR-7 Uri对象)
  • $subProtocols: 数组;可选的索引数组,用于与服务器协商WebSocket子协议。如果提供任何子协议,客户端和服务器不能达成一致,连接将失败
  • $headers: 数组;可选的关联数组,用于在发起握手时使用额外的请求头。常见的头部设置是Origin
WebSocket

这是用于与WebSocket服务器交互的对象。它有两个方法:sendclose。它有两个公共属性:requestresponse,它们是PSR-7对象,代表用于建立WebSocket连接的客户端和服务器端HTTP握手头。

Message

这是从WebSocket服务器接收到的对象。它有一个__toString方法,这是您通常想要访问接收到的数据的方式。如果您需要进行二进制消息,您可能需要使用对象上的方法。

示例

使用显式接口的更深入的示例:请求子协议,并发送自定义头,同时使用特定的React事件循环

<?php

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

$reactConnector = new \React\Socket\Connector([
    'dns' => '8.8.8.8',
    'timeout' => 10
]);
$loop = \React\EventLoop\Loop::get();
$connector = new \Ratchet\Client\Connector($loop, $reactConnector);

$connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost'])
->then(function(\Ratchet\Client\WebSocket $conn) {
    $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) {
        echo "Connection closed ({$code} - {$reason})\n";
    });

    $conn->send('Hello World!');
}, function(\Exception $e) use ($loop) {
    echo "Could not connect: {$e->getMessage()}\n";
    $loop->stop();
});