jc5/phpws

该软件包最新版本(dev-main)没有可用的许可证信息。

PHP 的 WebSocket 服务器和客户端库

该软件包的规范存储库似乎已消失,因此该软件包已被冻结。

维护者

详细信息

github.com/JC5/phpws

源代码

dev-main 2022-08-31 04:16 UTC

This package is not auto-updated.

Last update: 2024-01-18 09:20:23 UTC


README

PHP 的 WebSocket 服务器和客户端库。支持最新的 HyBi 规范,以及旧版 Chrome 版本和一些 Flash 回退方案所使用的旧 Hixie #76 规范。

此项目开始是为了将更多交互式功能引入 http://www.u2start.com/

此项目已更新以支持现代软件包和 PHP 版本。

功能

服务器

  • Hixie #76 和 Hybi #12 协议版本
  • Flash 客户端支持(也在同一端口上提供 XML 策略文件)
  • 原生 Firefox、Safari(包括 iPod / iPhone)、Chrome 和 IE10 支持。使用 Flash 客户端,支持 Flash 的所有浏览器都适用(包括 IE6-9、Opera、Android 和其他旧桌面浏览器)。
  • Opera(移动)原生支持 WebSocket,但默认禁用了支持。可以在 opera:config 中启用。

客户端

  • Hybi / Hixie76 支持。
  • 基于事件的异步 I/O

入门

设置 PHPWS 最简单的方法是将其作为 Composer 依赖项使用。在您的 composer.json 中添加以下内容

待办事项:添加依赖项

然后运行 php composer.phar install

为了验证它是否正常工作,在项目根目录中创建一个 time.php

require_once("vendor/autoload.php");
use Devristo\Phpws\Server\WebSocketServer;

$loop = \React\EventLoop\Factory::create();

// Create a logger which writes everything to the STDOUT
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);

// Create a WebSocket server using SSL
$server = new WebSocketServer("tcp://0.0.0.0:12345", $loop, $logger);

$loop->addPeriodicTimer(0.5, function() use($server, $logger){
    $time = new DateTime();
    $string = $time->format("Y-m-d H:i:s");
    $logger->notice("Broadcasting time to all clients: $string");
    foreach($server->getConnections() as $client)
        $client->sendString($string);
});


// Bind the server
$server->bind();

// Start the event loop
$loop->run();

并创建一个客户端 time.html,如下所示

<html>
    <head>
        <title>WebSocket TEST</title>
    </head>
    <body>
        <h1>Server Time</h1>
        <strong id="time"></strong>

        <script>
            var socket = new WebSocket("ws://:12345/");
            socket.onmessage = function(msg) {
                document.getElementById("time").innerText = msg.data;
            };
        </script>
    </body>
</html>

现在从命令行运行 time.php 并在浏览器中打开 time.html。你应该会看到由 phpws 定期广播的当前时间。如果这可行,你可能对示例文件夹中的更复杂的服务器感兴趣。

Phpws 客户端入门

以下是一个托管在 http://echo.websocket.org 的 WebSocket 服务器的客户端

require_once("vendor/autoload.php");                // Composer autoloader

$loop = \React\EventLoop\Factory::create();

$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);

$client = new \Devristo\Phpws\Client\WebSocket("ws://echo.websocket.org/?encoding=text", $loop, $logger);

$client->on("request", function($headers) use ($logger){
    $logger->notice("Request object created!");
});

$client->on("handshake", function() use ($logger) {
    $logger->notice("Handshake received!");
});

$client->on("connect", function($headers) use ($logger, $client){
    $logger->notice("Connected!");
    $client->send("Hello world!");
});

$client->on("message", function($message) use ($client, $logger){
    $logger->notice("Got message: ".$message->getData());
    $client->close();
});

$client->open();
$loop->run();

已知问题

  • 缺少 ORIGIN 检查(可以在 onConnect 中使用 getHeaders() 手动实现,当您不喜欢 Origin 标头时断开用户连接)
  • 不支持 HyBi 规范中的扩展数据。

要求

待办事项:更新