clue / connection-manager-extra
创建异步TCP/IP连接的额外装饰器,基于ReactPHP的Socket组件构建
Requires
- php: >=5.3
- react/event-loop: ^1.2
- react/promise: ^3 || ^2.1 || ^1.2.1
- react/promise-timer: ^1.9
- react/socket: ^1.12
Requires (Dev)
- phpunit/phpunit: ^9.3 || ^5.7 || ^4.8
README
本项目提供基于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 ));
列表中的每个条目必须是 host
或 host: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)获取详细信息。