clue / socket-raw
PHP的底层套接字扩展(ext-sockets)的简单轻量级面向对象包装器。
Requires
- php: >=5.3
- ext-sockets: *
Requires (Dev)
- phpunit/phpunit: ^9.3 || ^5.7 || ^4.8.35
README
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)了解详情。