ragnarok / websocket
异步WebSocket客户端
dev-master
2024-06-27 12:08 UTC
Requires
- php: >=5.4
- evenement/evenement: ^3.0 || ^2.0
- guzzlehttp/psr7: ^2.0 || ^1.7
- ratchet/rfc6455: ^0.3.1
- react/promise: 3.0
- react/socket: ^1.9
Requires (Dev)
- phpunit/phpunit: ^9.3 || ^5.7 || ^4.8
Suggests
- reactivex/rxphp: ~2.0
This package is auto-updated.
Last update: 2024-09-27 12:41:07 UTC
README
PHP中的异步WebSocket客户端
通过composer安装
composer require ragnarok/websocket
用法
ragnarok/websocket作为一个独立的应用:连接到echo服务器,发送消息,显示输出,关闭连接
<?php require __DIR__ . '/vendor/autoload.php'; \Ragnarok\Websocket\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"; });
类
在ragnarok/websocket中有3个主要的类需要注意和使用
Connector
向服务器发送HTTP请求,返回一个promise,如果成功,将解析为WebSocket对象。通过构造函数配置连接器,通过调用类来发起请求。可以通过单个连接器建立多个连接。invoke方法有三个参数
- $url: String; 一个有效的uri字符串(以ws://或wss://开头),用于连接(也接受PSR-7 Uri对象)
- $subProtocols: Array; 可选的WebSocket子协议索引数组,用于与服务器协商。如果提供了任何子协议,并且客户端和服务器无法达成一致,连接将失败
- $headers: Array; 可选的关联数组,包含在初始化握手时使用的附加请求头。一个常见的头是
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 \Ragnarok\Websocket\Connector($loop, $reactConnector); $connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'https://']) ->then(function(\Ragnarok\Websocket\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(); });
Pawl
这是ratchet/pawl的延续,后者似乎已经不再维护。
使用PHP 8.3,pawl使用了一些已弃用的语言特性。该存储库的短期目标是更新必要的部分,使其与较新的PHP版本和较新的ReactPHP版本兼容。
从长远来看,API将进行更改,因为我不喜欢连接的实例化方式,之后将删除此通知。
待办事项
- ReactPHP Promise V3兼容性
- 重命名库
- 移除动态属性
- 修复测试期间输出的异常(测试通过,只是输出奇怪)
- 进行重大API更改