danielealbano/php-websocket-s2c

0.3.1 2016-08-16 06:14 UTC

This package is not auto-updated.

Last update: 2024-09-15 02:16:45 UTC


README

介绍

php-websocket-s2c 是一个 PHP Websocket 原生实现,能够通过 Apache、nginx 或其他任何 Web 服务器和代理服务器提供服务,而无需进行任何特定配置。

PHP 中的 WebSocket 支持几乎不存在,因为通常需要在 Web 服务器/代理服务器级别提供支持。本实现采用的方案允许仅从服务器向客户端发送数据包,而无需在代理服务器和/或 Web 服务器上更改任何配置参数,s2c 后缀代表 服务器到客户端

支持的功能

该库支持以下功能

  • 服务器到客户端消息(文本(json)、二进制、ping/pong)
  • 分段消息(用于流式传输数据)
  • 数据包大小可达 2^64
  • 尝试自动禁用 HTTP 压缩(gzip)和分块
  • WebSocket 协议(Sec-Websocket-Protocol 标头)
  • 协议版本 13 (https://en.wikipedia.org/wiki/WebSocket#Browser_implementation

不支持或未测试的内容

  • 扩展(多路复用、压缩等)
  • SSL/TLS

该库已在 Apache 2.2 上使用 mod_php 对 PHP 5.4、PHP 5.5 和 PHP 5.6 进行了测试

错误

该库非常年轻,并使用技巧来避免启动独立的 Web 服务器。如果某些功能无法正常工作,在提交问题之前,请检查您的 Web 服务器是否启用/请求了以下内容:

  • 压缩已启用(Content-Encoding 标头应不存在或其值为 identity);
  • 分块已启用(Transfer-Encoding 标头应不存在或其值为 identity)。

在报告问题时,请记住说明以下内容:

  • 如果 Content-Length 标头有不同的值,则不为零;
  • 如果 Connection 标头不存在或其值不是 Upgrade
  • 如果 Upgrade 标头不存在或其值不是 websocket
  • 您的 Web 服务器(名称和版本);
  • 如果您使用 php 作为模块或作为 fastcgi;
  • 如果您使用代理服务器,如果是,请说明哪一种。

示例

普通 WebSocket

创建 WebSocket 服务器
require_once('src/WebSocket.php');
require_once('src/Frame.php');

$ws = new WebsocketS2C\WebSocket();

使用 composer 不需要包含源代码。

检查是否请求了 WebSocket
if ($ws->isWebsocket() == false) {
	echo 'Not a websocket!';
	die();
}
接受连接
$ws->accept();
发送文本帧(第一个示例)
$ws->text(utf8_encode('This is a test!'));
发送文本帧(第二个示例)
for($i = 0; $i < 3; $i++) {
	$ws->text(utf8_encode('Loop ' . $i));
	sleep(1);
}
发送 json 帧数据
$ws->json([
	'hello' => 'world'
]);
发送二进制(blob)帧
$ws->binary('This is a test!');
流式传输数据
$isFirst = true;
$ws->text('[', false, false);
foreach([ 'this', 'is', 'a', 'multipart', 'message' ] as $part) {
	if ($isFirst == false) {
		$ws->text(',', false, false);
	}

	$ws->json([
		'alot' => true,
		'of' => true,
		'data' => $part
	], false);

	$isFirst = false;
}
$ws->text(']');