ratchet / pawl
异步 WebSocket 客户端
v0.4.1
2021-12-10 14:32 UTC
Requires
- php: >=5.4
- evenement/evenement: ^3.0 || ^2.0
- guzzlehttp/psr7: ^2.0 || ^1.7
- ratchet/rfc6455: ^0.3.1
- react/socket: ^1.9
Requires (Dev)
- phpunit/phpunit: ^9.3 || ^5.7 || ^4.8
Suggests
- reactivex/rxphp: ~2.0
README
PHP 中的异步 WebSocket 客户端
通过 composer 安装
composer require ratchet/pawl
用法
Pawl 作为独立应用程序:连接到回声服务器,发送消息,显示输出,关闭连接
<?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 中,有 3 个主要的类需要注意和使用
Connector
向服务器发送 HTTP 请求并返回一个承诺,如果成功,将解析为 WebSocket 对象。通过其构造函数配置连接器,通过调用类来发起请求。可以通过单个连接器建立多个连接。invoke 方法有 3 个参数
- $url: 字符串;要连接的有效 uri 字符串(以 ws:// 或 wss:// 开头),也接受 PSR-7 Uri 对象
- $subProtocols: 数组;可选的索引数组,包含与服务器协商的 WebSocket 子协议。如果提供了任何子协议,客户端和服务器无法就一个协议达成一致时,连接将失败
- $headers: 数组;可选的关联数组,包含在初始化握手时请求使用的额外标题。要设置的常见标题是
Origin
WebSocket
这是用于与 WebSocket 服务器交互的对象。它有两个方法:send
和 close
。它有两个公共属性:request
和 response
,它们是 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(); });