madbyad / mpl-long-poll
一个PHP库,提供通过HTTP长轮询实现实时通信的简单方法
Requires
- php: >= 7.0.0
Requires (Dev)
- phpunit/phpunit: ^9.6
README
MPL (MadByAd PHP库) 长轮询是一个专门创建的库,用于提供通过HTTP长轮询实现实时通信的简单接口。尽管HTTP长轮询可能是一种过时的技术(因为WebSocket),但在PHP中实现起来比WebSocket更简单,可以用于创建无缝的实时通信(尽管可能会有几秒钟的延迟)
LongPoll类
使用LongPoll
类可以轻松实现通过HTTP长轮询的实时通信
informPeer()
LongPoll::informPeer(string $id, array $data)
方法用于向指定的对等方发送消息(数据)。此方法接受两个参数,第一个是 peers id,第二个是应作为关联数组的数据
readAsPeer()
LongPoll::readAsPeer(string $id, bool $endExecution = true)
方法用于以指定的对等方读取消息(数据)。此方法接受一个参数和一个可选参数,参数是对等方 id,可选参数确定是否在读取消息(数据)后结束执行,默认设置为TRUE
setQueryTime()
LongPoll::setQueryTime(int $second)
方法用于设置查询时间(以秒为单位)。查询时间越低,响应越快,但资源消耗越大;查询时间越高,响应越慢,但资源消耗越小
setJsonFlags()
LongPoll::setJsonFlags(int $flags)
方法用于设置JSON消息的格式(仅用于调试)。可用的格式列表如下
JSON_HEX_QUOT
JSON_HEX_TAG
JSON_HEX_AMP
JSON_HEX_APOS
JSON_NUMERIC_CHECK
JSON_PRETTY_PRINT
JSON_UNESCAPED_SLASHES
JSON_FORCE_OBJECT
JSON_UNESCAPED_UNICODE
JSON_THROW_ON_ERROR
示例
以下是长轮询工作方式的两个示例
示例1
首先,我们将创建read.php
,并将以下内容写入其中
<?php use MadByAd\MPLLongPoll\LongPoll; require __DIR__."/autoload.php"; LongPoll::readAsPeer("madbyad");
现在,如果我们使用php read.php
执行read.php
,您会发现脚本不会停止执行,这是因为长轮询是一种技术,其中您只发送一个请求,然后服务器将保持查询,直到它收到一条消息,然后它将返回该消息,或者在这种情况下,我们一次执行脚本,脚本将保持查询直到收到消息,然后停止并返回消息
现在创建send.php
并写入以下内容
<?php use MadByAd\MPLLongPoll\LongPoll; require __DIR__."/autoload.php"; // this is only for debugging // this is so we can read the json easily LongPoll::setJsonFlags(JSON_PRETTY_PRINT); LongPoll::informPeer("madbyad", [ "message" => $argv[1], ]);
现在,如果我们打开一个新的终端并执行php send.php "Hello World"
,您会注意到第一个终端将立即停止或经过一段时间后停止,这取决于您设置的查询时间,并输出如下内容
[
{
"message" => "Hello World"
}
]
这是因为当脚本查询消息时,它检测到消息,因此它会输出消息并停止执行
这就是通过HTTP长轮询实现实时通信的基本方法。客户端只向服务器发送一个请求,然后服务器将接收请求并在每n
秒查询/检查一次消息,如果存在消息,它将立即将消息返回给客户端,客户端接收到消息后,将发送另一个请求以检查新消息
示例2
这里是一个例子,这一次,在接收消息后,我们将继续发送消息
首先,我们将创建read.php
,并将以下内容写入其中
<?php use MadByAd\MPLLongPoll\LongPoll; require __DIR__."/autoload.php"; function read() { LongPoll::readAsPeer("madbyad", false); read(); } read();
在这个例子中,我们将第二个参数设置为 FALSE
,这意味着它不会停止,将继续执行
现在,如果我们打开一个新的终端并执行 php send.php "Hello World"
,一段时间后,第一个终端应该会收到消息。大概是这样的
[
{
"message" => "Hello World"
}
]
并且不会停止。现在如果我们打开一个新的终端并执行 php send.php "Hello World"
,一段时间后,第一个终端应该会收到消息
现在在第二个终端中,执行 php send.php "How Are you?"
,一段时间后,第一个终端应该会收到消息
[
{
"message" => "Hello World"
},
{
"message" => "How Are you?"
}
]
做得好,你已经成功与两个终端进行了通信
要结束进程,只需关闭终端即可