alex-kalanis / remote-request
用于向远程服务器进行查询的PHP库
Requires
- php: >=7.4.0
- ext-json: *
- ext-mbstring: *
- ext-sockets: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: >=7.2 <=9
- shipmonk/composer-dependency-analyser: ^1.4
This package is auto-updated.
Last update: 2024-10-01 00:08:57 UTC
README
以对象方式请求本地和远程服务器。包含查询远程机器的库 - 比Curl更通用,比file_get_contents()更详细。
该包的基本理念是保持简单,与大量数据一起工作,尽管下面有流,并且已经使用了流变量来传递选项。
安装
composer.phar require alex-kalanis/remote-request
(如果您不熟悉composer,请参阅Composer文档)
主要变更
- 版本1是初始版本
- 版本2将网络层2和3(传输和内容协议)分开
- 版本3为Composer打包
- 版本4在添加“新”套接字和协议后更改了内部结构
- 版本5更改了路径和命名空间,使用流和翻译
- 版本6将命名从schema更改为params,并允许使用一个连接来传递数据并返回
用法
RemoteRequest FSocket/Stream
通过网络发送基本数据。在这种情况下使用FSocket方法。没有基本依赖项,需要编译带有ssl的安全连接的php。请注意 - 在这种情况下,必须在机器上拥有受信任的未签名密钥!另一方面 - 可以禁用此检查,使用Helper并设置上下文参数(不推荐)。
基本用法(http查询)
$libParams = new RemoteRequest\Connection\Params\Ssl(); $libParams->setTarget('10.0.0.1', 2048); $libQuery = new RemoteRequest\Protocols\Http\Query(); # http internals $libQuery ->setMethod('post') ->setRequestSettings($libParams) ->setPath('/api/hook/') ->addValues([ 'service_id' => $serviceId, 'hook_data' => $data, ]) ; $libProcessor = new RemoteRequest\Connection\Processor(); # tcp/ip http/ssl $libProcessor->setConnectionParams($libParams); $libProcessor->setData($libQuery); $libHttpAnswer = new RemoteRequest\Protocols\Http\Answer(); $response = $libHttpAnswer->setResponse($libProcessor->getResponse()); return $response->getContent();
return RemoteRequest\Helper::getRemoteContent( 'https://10.0.0.1:2048/api/hook/', [ 'service_id' => $serviceId, 'hook_data' => $data, ], [ 'method' => 'post', 'multipart' => true, ] );
UDP变体
$libParams = new RemoteRequest\Connection\Params\Udp(); # query params on layer 3 $libParams->setTarget('udp-listener.' . DOMAIN, 514); $message = new RemoteRequest\Protocols\Dummy\Query(); $message->maxLength = 0; // expects no response $message->body = 'Post message to them!'; $libProtocol = new RemoteRequest\Connection\Processor(); $libProtocol->setProtocolSchema($libParams)->setData($message); $libProtocol->getResponse(); // just execute
RemoteRequest\Helper::getRemoteContent( 'udp://udp-listener.' . DOMAIN . ':514', 'Post message to them!' );
由于继承,可以做出许多有趣的变化。对于目标更改,可以直接设置它或创建一个子类并设置连接参数。接下来 - 通过仅交换结果类,可以处理XML或JSON。
操作符(FSocket和Stream)发送代理"php-agent/1.3",但也可以更改它。
连接参数
包含关于网络层2传输方法的基本信息以及查询的目标 - 通常为地址和端口。还包括连接其他机器所需的其他信息,如架构和超时。
UDP参数
通过UDP协议发送。
尽管存在测试中的麻烦,但它还包含2个用于检查本地机器连接的文件,这些文件是从StackOverflow上获取的。使用此功能需要2个终端窗口 - 一个用于服务器,另一个用于客户端。在客户端上写入消息。如果消息没有在两个窗口上显示,那么机器内部有死连接,并且它也会与连接外部目标有问题 - 同时它也可能被正确设置。
TCP / HTTP / SSL参数
基本上是发送数据通过tcp协议的变体。Tcp和Http是不安全的,SSL是安全的(取决于php是否编译了ssl支持或定义了传递此障碍的自定义流)。Http和SSL还添加Http标题。
PHP内部参数 - 文件,PHP
在参数内部有2个用于访问内部源。它们是为了测试目的而设计的。可以测试访问数据,并且它们不需要保存到外部机器上。
指针
没有什么花哨的,只是流处理器指针的来源。在远程机器上和/或本地存储上。
套接字
最具体的。主要用于与UDP协议连接。与其他情况不同,它不需要等待接收数据包。
FSocket, PFsocket
最愚蠢的也是最常见的。你不能通过你的事实来说服他们,比如“这个连接是正确加密的”。
Stream
PHP内部的Stream。可以使用上下文参数。但出于合理性考虑,它并没有从更高层的操作函数中获取任何东西;即使这对其有效。
共享内部
本地用于测试目的。它应该从内部获得一些包装。然后可以在那里保存只有PHP指针的数据。
协议
定义了几个基本协议及其辅助工具,这使得使用它们更加容易。在最上面是处理HTTP和UDP的示例。还包含查询REST API的基础。
RESTful
扩展和编辑后的HTTP,其消息体中包含JSON数据包,而不是普通的HTTP数据。它还可以传递文件 - 使用base64进行传输。但它无法将其编译回数据,因为不知道来自服务器的数据定义。
FSP
文件共享协议,即UDP上的FTP。一个老式、黑客式、缓慢但有趣的协议,它表明在层中放入的任何东西都是可读的。你可以在网上找到更多关于它的信息。这里有一个简单的PHP包装器,允许你透明地使用它。
测试
使用PhpUnit测试。下载Phpunit.phar,保存到根目录,使其可执行,然后运行。有一个排除的目录 - 包装器。它们在这里是为了访问远程源并简化你的生活,因此在这些目录上运行测试不是一个好主意。同样,辅助工具也没有涵盖,出于相同的原因。
不遵循PSR-7
这个库不符合PSR-7,有几个原因。首先,PSR-7是为了HTTP而设计的。然后它得到了流,并且完全摒弃了通常发送的填充。有些东西是HTTP特有的,在其他协议中不受欢迎。我现在写的是schema:host:port和表单输入。然后你有"StreamInterface",在其中你可以得到消息体。不是按值分隔的,没有设置头部的边界,只是原始数据。它也不像正常的流,因此使用"stream_copy_to_stream"不起作用。
如果你真的想了解更多,尝试通过PSR-7实现FSP或SMB连接器。你会头痛不已。或者HTTP2/3,其中内容是二进制编码的,并在UDP方案上运行(在3的情况下)。你一定会遇到很多问题来实现它。不是在远程请求中,那里的责任是分开的。