clue/connection-manager-extra

创建异步TCP/IP连接的额外装饰器,基于ReactPHP的Socket组件构建

v1.3.0 2022-08-30 13:30 UTC

This package is auto-updated.

Last update: 2024-08-29 04:08:55 UTC


README

CI status installs on Packagist

本项目提供基于ReactPHP的Socket组件构建的额外(指“额外的”、“非凡的”、“特殊的”和“不寻常的”)装饰器。

目录

支持我们

我们投入了大量时间开发、维护和更新我们的优秀开源项目。您可以通过在GitHub上成为赞助者来帮助我们保持工作的高质量。赞助者将获得许多回报,请参阅我们的赞助页面以获取详细信息。

让我们共同努力将这些项目提升到下一个层次! 🚀

简介

如果您还不熟悉react/socket,可以将其视为fsockopen()stream_socket_client()的异步(非阻塞)版本。也就是说,在您可以发送和接收远程服务器数据之前,您必须首先建立连接——这需要一些时间,因为它涉及多个步骤。为了能够同时建立多个连接,react/socket提供了一个简单的API,用于以异步(非阻塞)方式建立简单连接。

本项目包含几个类,这些类通过实现相同的简单ConnectorInterface来扩展基本功能。该接口提供了一个基于promise的单一方法connect($uri),可用于轻松通知连接成功建立或Connector放弃连接失败。

$connector->connect('www.google.com:80')->then(function ($stream) {
    echo 'connection successfully established';
    $stream->write("GET / HTTP/1.0\r\nHost: www.google.com\r\n\r\n");
    $stream->end();
}, function ($exception) {
    echo 'connection attempt failed: ' . $exception->getMessage();
});

由于一切使用相同的简单API,因此生成的Connector类可以轻松互换,并可用于期望正常ConnectorInterface的地方。这可以用来堆叠它们,例如使用超时进行TCP连接,延迟SSL/TLS连接,重试失败的连接尝试,随机选择一个Connector或任何组合。

用法

本节列出了该库的所有功能及其示例。示例假定您已安装此库,并且已经设置了一个Socket/Connector实例$connector

所有类都位于ConnectionManager\Extra命名空间中。

重复

ConnectionManagerRepeat($connector, $tries) 尝试连接指定位置,最多尝试 $tries 次,当连接失败时。

如果传递 3 给它,它会首先发起正常连接尝试,如果连接尝试失败,则最多重试 2 次。

$connectorRepeater = new ConnectionManagerRepeat($connector, 3);

$connectorRepeater->connect('www.google.com:80')->then(function ($stream) {
    echo 'connection successfully established';
    $stream->close();
});

超时

ConnectionManagerTimeout($connector, $timeout, $loop = null) 设置一个最大 $timeout 秒数,用于决定何时放弃等待连接完成。

$connector = new ConnectionManagerTimeout($connector, 3.0);

延迟

ConnectionManagerDelay($connector, $delay, $loop = null) 在实际尝试连接之前设置一个固定的初始 $delay 秒延迟。 (与设置 最大超时ConnectionManagerTimeout 不应混淆。)

$delayed = new ConnectionManagerDelayed($connector, 0.5);

拒绝

ConnectionManagerReject(null|string|callable $reason) 简单地拒绝每一个连接尝试。这对于下面的 ConnectionManagerSelective 特别有用,用于拒绝只针对某些目的地的连接尝试(例如阻止广告或有害网站)。

构造函数接受一个可选的拒绝原因,该原因将用于拒绝生成的承诺。

您可以显式传递一个 string 值,该值将用作 Exception 实例的消息。

$connector = new ConnectionManagerReject('Blocked');
$connector->connect('www.google.com:80')->then(null, function ($e) {
    assert($e instanceof \Exception);
    assert($e->getMessage() === 'Blocked');
});

您可以显式传递一个 callable 值,该值将用于抛出或返回自定义的 Exception 实例。

$connector = new ConnectionManagerReject(function ($uri) {
    throw new RuntimeException($uri . ' blocked');
});
$connector->connect('www.google.com:80')->then(null, function ($e) {
    assert($e instanceof \RuntimeException);
    assert($e->getMessage() === 'www.google.com:80 blocked');
});

可交换的

ConnectionManagerSwappable($connector) 是其他 ConnectionManager 的简单装饰器,用于简化在运行时交换实际的 ConnectionManager->setConnectionManager($connector))。

连续的

ConnectionManagerConsecutive($connectors) 通过尝试通过给定的任何一个 ConnectionManager 连接,按照顺序直到第一个成功来建立连接。

$consecutive = new ConnectionManagerConsecutive(array(
    $connector1,
    $connector2
));

随机的

ConnectionManagerRandom($connectors)ConnectionManagerConsecutive 类似,但它使用的是随机打乱的顺序,而不是固定的顺序。

$random = new ConnectionManagerRandom(array(
    $connector1,
    $connector2
));

并发的

ConnectionManagerConcurrent($connectors) 通过尝试同时通过给定的所有 ConnectionManager 建立连接,直到第一个成功。

$concurrent = new ConnectionManagerConcurrent(array(
    $connector1,
    $connector2
));

选择的

ConnectionManagerSelective($connectors) 管理一个 Connector 列表,并将每个连接通过第一个匹配项进行转发。这可以用于实现网络访问控制列表(ACL)或防火墙规则,如黑名单或白名单。

这允许对如何处理出站连接有更细粒度的控制,例如拒绝广告、延迟未加密的 HTTP 请求或通过外国转发 HTTPS 连接。

如果列表中的条目没有任何匹配项,连接将被拒绝。这可以用来实现一个非常简单的白名单,如下所示

$selective = new ConnectionManagerSelective(array(
    'github.com' => $connector,
    '*:443' => $connector
));

如果您想实现黑名单(即仅拒绝某些目标),请确保将默认目标添加到列表的末尾,如下所示

$reject = new ConnectionManagerReject();
$selective = new ConnectionManagerSelective(array(
    'ads.example.com' => $reject,
    '*:80-81' => $reject,
    '*' => $connector
));

同样,您也可以将任何其他连接器组合起来,以实现更高级的连接设置,例如仅延迟未加密的连接并重试不可靠的主机

// delay connection by 2 seconds
$delayed = new ConnectionManagerDelay($connector, 2.0);

// maximum of 3 tries, each taking no longer than 2.0 seconds
$retry = new ConnectionManagerRepeat(
    new ConnectionManagerTimeout($connector, 2.0),
    3
);

$selective = new ConnectionManagerSelective(array(
    '*:80' => $delayed,
    'unreliable.example.com' => $retry,
    '*' => $connector
));

列表中的每个条目必须是 hosthost:port 的形式,其中 host 可能包含 * 通配符字符,而 port 可以是确切的端口号,也可以是 min-max 形式的范围。传递任何其他内容将导致抛出 InvalidArgumentException

请注意,如果没有指定,主机将完全匹配。这意味着如果只阻止 youtube.com,则这对 www.youtube.com 没有影响。在这种情况下,您可能需要添加一个针对 *.youtube.com 的第二个规则。

安装

安装此库的推荐方法是 通过 Composer初识 Composer?

此项目遵循 SemVer。这将安装最新的支持版本。

composer require clue/connection-manager-extra:^1.3

另请参阅CHANGELOG了解版本升级的详细信息。

本项目旨在在任何平台上运行,因此不需要任何PHP扩展,并支持在旧版PHP 5.3到当前PHP 8+和HHVM上运行。强烈建议使用此项目的最新支持版本。

测试

要运行测试套件,您首先需要克隆此仓库,然后通过Composer安装所有依赖项。

composer install

要运行测试套件,请转到项目根目录并运行

vendor/bin/phpunit

许可证

本项目采用宽松的MIT许可证发布。

你知道吗?我提供定制开发服务,并为发布赞助和贡献开具发票。请联系我(@clue)获取详细信息。