clue/socket-raw

PHP的底层套接字扩展(ext-sockets)的简单轻量级面向对象包装器。

v1.6.0 2022-04-14 14:58 UTC

This package is auto-updated.

Last update: 2024-08-29 03:23:42 UTC


README

CI status installs on Packagist

PHP的底层套接字扩展(ext-sockets)的简单轻量级面向对象包装器。

PHP提供了两个网络API,较新的流API和较旧的套接字API。虽然前者在泛化各种流资源方面迈出了巨大的步伐,但它缺乏原始套接字API的一些高级特性。这个轻量级库通过提供对底层API的薄包装,以现代方式公开了套接字API。

  • 完整的套接字API - 通过一个合理的面向对象接口公开整个套接字API。提供常用操作的便利方法,同时也公开所有底层方法和选项。
  • 流畅接口 - 使用流畅接口,可以轻松地链接方法调用。错误条件将使用Exception信号,而不是依赖于繁琐的返回代码。
  • 轻量级,SOLID设计 - 提供了一个薄抽象,它只是足够好,不会妨碍你。这个库只是一个非常薄的包装,没有其他外部依赖。
  • 良好的测试覆盖率 - 随附自动测试套件,并定期在现实世界中进行测试。

目录

支持我们

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

让我们一起将这些项目提升到新的水平!🚀

快速入门示例

安装后,您可以使用以下示例发送和接收HTTP消息

$factory = new \Socket\Raw\Factory();

$socket = $factory->createClient('www.google.com:80');
echo 'Connected to ' . $socket->getPeerName() . PHP_EOL;

// send simple HTTP request to remote side
$socket->write("GET / HTTP/1.1\r\n\Host: www.google.com\r\n\r\n");

// receive and dump HTTP response
var_dump($socket->read(8192));

$socket->close();

另请参阅示例

使用

工厂

如快速入门示例所示,该库使用Factory模式作为简单的API来socket_create()。它提供简单的访问创建TCP、UDP、UNIX、UDG和ICMP协议套接字,并支持IPv4和IPv6寻址。

$factory = new \Socket\Raw\Factory();

createClient()

createClient(string $address, null|float $timeout): Socket方法是创建已连接客户端套接字最方便的方法(类似于fsockopen()stream_socket_client()的工作方式)。

// establish a TCP/IP stream connection socket to www.google.com on port 80
$socket = $factory->createClient('tcp://www.google.com:80');

// same as above, as scheme defaults to TCP
$socket = $factory->createClient('www.google.com:80');

// same as above, but wait no longer than 2.5s for connection
$socket = $factory->createClient('www.google.com:80', 2.5);

// create connectionless UDP/IP datagram socket connected to google's DNS
$socket = $factory->createClient('udp://8.8.8.8:53');

// establish TCP/IPv6 stream connection socket to localhost on port 1337
$socket = $factory->createClient('tcp://[::1]:1337');

// connect to local Unix stream socket path
$socket = $factory->createClient('unix:///tmp/daemon.sock');

// create Unix datagram socket
$socket = $factory->createClient('udg:///tmp/udg.socket');

// create a raw low-level ICMP socket (requires root!)
$socket = $factory->createClient('icmp://192.168.0.1');

createServer()

可以使用 createServer($address) 方法创建一个绑定到特定地址/路径的服务器端(监听)套接字(类似于 stream_socket_server() 的工作方式)。它接受与 createClient() 方法相同的寻址方案。

// create a TCP/IP stream connection socket server on port 1337
$socket = $factory->createServer('tcp://localhost:1337');

// create a UDP/IPv6 datagram socket server on port 1337
$socket = $factory->createServer('udp://[::1]:1337');

create*()

较少使用的是,Factory 提供创建(未连接)各种套接字类型的访问。

$socket = $factory->createTcp4();
$socket = $factory->createTcp6();

$socket = $factory->createUdp4();
$socket = $factory->createUdp6();

$socket = $factory->createUnix();
$socket = $factory->createUdg();

$socket = $factory->createIcmp4();
$socket = $factory->createIcmp6();

您还可以通过底层机制创建任意套接字协议类型。

$factory->create($family, $type, $protocol);

套接字

如上所述,Socket 类仅是对套接字资源进行面向对象封装的对象。因此,如果您熟悉一般的套接字编程,这将很有帮助。

创建 Socket 实例的推荐方法是上述 Factory

方法

所有底层套接字操作都作为 Socket 类的方法提供。

您可以参考 PHP 的相当好的 套接字 API 文档Socket 中的 docblock 注释来入门。

数据I/O
$socket->write('data');
$data = $socket->read(8192);
未连接I/O
$socket->sendTo('data', $flags, $remote);
$data = $socket->rcvFrom(8192, $flags, $remote);
非阻塞(异步)I/O
$socket->setBlocking(false);
$socket->selectRead();
$socket->selectWrite();
连接处理
$client = $socket->accept();
$socket->bind($address);
$socket->connect($address);
$socket->shutdown();
$socket->close();

安装

推荐通过 Composer 安装此库。您是 Composer 新手吗?了解 Composer

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

$ composer require clue/socket-raw:^1.6

有关版本升级的详细信息,请参阅 CHANGELOG

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

测试

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

$ composer install

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

$ vendor/bin/phpunit

请注意,测试套件包含针对 ICMP 套接字的测试,这些测试需要在 Unix/Linux 系统上具有 root 权限。因此,除非您运行以下命令以执行完整的测试套件,否则某些测试将被跳过

$ sudo vendor/bin/phpunit

测试套件还包含一些依赖于稳定互联网连接的功能集成测试。如果您不想运行这些测试,可以像这样简单地跳过

$ vendor/bin/phpunit --exclude-group internet

许可

此项目在 MIT 许可证 下发布。

您知道我可以提供定制开发服务以及为发布和贡献发布发票吗?请联系我(@clue)了解详情。