madbyad/mpl-long-poll

一个PHP库,提供通过HTTP长轮询实现实时通信的简单方法

v1.0.0 2024-05-09 03:31 UTC

This package is auto-updated.

Last update: 2024-09-09 04:20:55 UTC


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?"
    }
]

做得好,你已经成功与两个终端进行了通信

要结束进程,只需关闭终端即可