clue / icmp-react
为 React 设计的简单异步低级 ICMP (ping) 消息库
Requires
- php: >=5.3
- clue/socket-react: 0.2.*
- e-butik/iodophor: 1.*
- react/event-loop: 0.3.*
- react/promise: ~1.0
This package is auto-updated.
Last update: 2024-09-06 09:27:51 UTC
README
基于 React 构建的简单异步低级 ICMP (ping) 消息库
用法
安装 clue/icmp-react 后,您可以通过命令行运行其 示例,例如
$ sudo php examples/ping.php www.google.com
注意:请注意这里的
sudo
。打开原始 ICMP 套接字需要 root 权限!
提供的示例应为您提供一个关于该库如何工作的良好概述。因此,以下指南假设您熟悉示例,并对其进行更详细的解释。
该库基于 reactphp 构建,以遵循异步(非阻塞)范式。这样做是为了您可以在不相互阻塞的情况下并行发送和接收多个消息。
为此,您需要传递一个事件循环(或创建一个新的)。
工厂
Clue\React\Icmp\Factory
是一个方便的包装器,可以帮助您初始化正确的循环和 ICMP 处理程序。
简单工厂
将现有循环实例传递给工厂是可选的。如果您对事件循环的概念不熟悉,或者只关心处理 ICMP 消息,那么建议您让工厂为您完成工作,并让它创建推荐的循环实现
$factory = new Clue\React\Icmp\Factory(); $icmp = $factory->createIcmp4();
您将需要像这样访问并运行它的循环
$loop = $factory->getLoop(); // place your ICMP calls here, see below... // important: run the loop in order to actually do anything $loop->run();
如果您没有传递现有的事件循环(如上所示),则会为您创建一个适合(且速度合理)处理 ICMP 套接字的事件循环。然而,由于 ICMP 的低级网络访问性质,此循环不适用于添加其他流资源。特别是,这意味着您应该预期它将拒绝在 reactphp 中通常找到的几乎所有正常流/连接。
使用现有的事件循环
如果您只想处理 ICMP 套接字,上述限制对您来说实际上并不适用。但是,如果您还想使用相同的事件循环来处理其他流,则也可以像这样将现有事件循环实例传递给工厂
$loop = React\EventLoop\Factory::create(); $factory = new Clue\React\Icmp\Factory($loop);
虽然这将允许您将任何数量的流附加到循环中,但这种方法通常不支持 ICMP 的低级套接字。因此,它不会在给定的循环中内部设置事件监听器,而是必须设置一个计时器,使用隐藏的内部事件循环定期检查 ICMP 套接字。这实际上是一个微小的实现细节,您可能不必担心,因为这完全是透明的。然而,虽然依赖于周期性计时器(例如,10ms 间隔,即每秒 100 次检查)只会对 CPU 使用率产生轻微影响,但这将对 ICMP 响应时间产生明显影响。因此,例如,请预期 ping()
将额外花费 10-20ms。
Ping
这个库最常见的使用是发送 ICMP 回显请求(即 ping 消息),因此它提供了一个方便的基于 Promise 的 API
$icmp->ping($remote, $timeout);
请注意,这是一个异步方法,即 ping 消息只会被排队以发送。这样做是为了您可以在不相互阻塞的情况下并行发送多个 ping 消息,并且将返回的 ping 回复与其对应的 ping 请求匹配。
您可能会像这样使用此代码
$icmp->ping('github.com', 3.0)->then(function ($time) { echo 'Success after ' . $time . ' seconds'; }, function(Exception $error) { echo 'Nope, there was an error'; });
接收消息
上述代码会自动设置一个临时监听器来检查每个传入的消息是否与预期的 ping 结果匹配。您也可以像这样自己监听任何传入的消息
$icmp->on('message', function (Clue\React\Icmp\Message $message, $peerAddress) { echo 'Message type ' . $message->getType() . ' from ' . $peerAddress . PHP_EOL; });
发送消息
如果您想发送任意的ICMP消息,您可以自己构建一个Message
对象,如下所示
$message = new Clue\React\Icmp\Message($type, $code, $checksum, $header, $payload)
或者,您可以使用MessageFactory
来创建常见的消息类型,如下所示
$factory = new Clue\React\Icmp\MessageFactory(); $message = $factory->createMessagePing();
接下来,您可以像这样发送消息对象
$icmp->sendMessage($message, '127.0.0.1');
这是一个异步操作,即消息只被排队等待发送,因此请确保实际启动循环($loop->run()
)。此外,您可能(但不一定)想要等待响应消息,请参阅接收消息。
安装
推荐通过Composer安装此库。您是Composer的新手?需要了解Composer?
{ "require": { "clue/icmp-react": "~0.2.0" } }
测试
要运行测试套件,您需要PHPUnit。前往项目根目录并运行
$ phpunit tests
注意:测试套件包含针对ICMP套接字的测试,这些测试在Unix/Linux系统上需要root权限。因此,除非您运行
sudo phpunit tests
以执行完整测试套件,否则某些测试将被跳过。
许可协议
MIT