alex-kalanis/remote-request

用于向远程服务器进行查询的PHP库

v6.3.0 2024-03-31 09:28 UTC

This package is auto-updated.

Last update: 2024-10-01 00:08:57 UTC


README

Build Status Scrutinizer Code Quality Latest Stable Version Minimum PHP Version Downloads License Code Coverage

以对象方式请求本地和远程服务器。包含查询远程机器的库 - 比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的情况下)。你一定会遇到很多问题来实现它。不是在远程请求中,那里的责任是分开的。