nealis/pawl

异步 WebSocket 客户端

维护者

详细信息

github.com/nealis/Pawl

源代码

v0.2.3 2017-01-02 20:05 UTC

This package is auto-updated.

Last update: 2024-09-08 07:13:22 UTC


README

#Pawl

Autobahn Testsuite

PHP 的异步 WebSocket 客户端

通过 composer 安装

composer require ratchet/pawl

用法

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

<?php

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

    \Ratchet\Client\connect('ws://echo.socketo.me:9000')->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 服务器交互的对象。它有两个方法:sendclose。它有两个公共属性:requestresponse,它们是 PSR-7 对象,代表用于建立 WebSocket 连接的客户端和服务器端 HTTP 握手头。

消息

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

示例

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

<?php

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

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

    $connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'https://'])
    ->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();
    });

    $loop->run();