stubbles / peer
帮助进行套接字操作。
Requires
- php: ^8.2
- ext-ctype: *
- ext-filter: *
Requires (Dev)
- bovigo/assert: ^8.0
- bovigo/callmap: ^8.0
- mikey179/vfsstream: ^1.6.11
- phpunit/phpunit: ^10.5
- stubbles/values: ^11.0
Suggests
- stubbles/values: Will automatically add http uri parsing to stubbles\values\Parse
README
帮助进行套接字操作。
构建状态
安装
stubbles/peer 以 Composer 包的形式分发。要将它作为您的包的依赖项安装,请使用以下命令
composer require "stubbles/peer": "^10.0"
要求
stubbles/peer 至少需要 PHP 8.2。
与 URI 一起工作
有时将 URI 封装在类中很有用,该类提供用于处理该 URI 的方法。Stubbles Core 为此类情况提供了 stubbles\peer\Uri
。
可以通过 Uri::fromString('ftp://user@example.net/');
创建新实例。以下规则适用
- 如果提供的 uri 字符串为空,则不返回实例,而是返回
null
。 - 如果提供的 uri 字符串不是一个有效的 URI,则会抛出
stubbles\peer\MalformedUri
。 - 在其他所有情况下,将返回
stubbles\peer\Uri
的一个实例。 - 从版本 8.0.0 开始,不建议在 URI 中使用密码,并且将在 9.0.0 中移除对 URI 中密码的支持。通常,协议提供其他更好和更安全的方法来传输密码,因为将密码用于 URI 本身是不安全的。
为了使 uri 字符串成为有效的 URI,它必须遵守在 RFC 3986 中规定的规范。
请注意,将标准化主机名,这意味着如果给定的主机名为例如 eXAMple.net,它将被标准化为 example.net,并且始终以标准化形式返回。
对于方法,以下规则适用
hasDnsRecord()
如果 URI 不包含主机,则返回false
。hasDnsRecord()
对于 localhost、127.0.0.1 和 [::1] 始终返回true
。hasDefaultPort()
当指定端口时返回false
,即使它可能是方案的默认端口。此方法旨在用于提供特定协议的附加方法的子类。
URI 实例只能更改其 URI 参数。无法更改 URI 的方案、主机、用户、密码、端口或片段。
与 HTTP URI 一起工作
尽管 URI 的基本实现已经提供了在处理 URI 时有用的帮助,但有时需要对 HTTP URI 提供更好的支持。stubbles/peer 为此类情况提供了 stubbles\peer\http\HttpUri
。
可以通过 HttpUri::fromString('http://example.net/');
创建新实例。以下规则适用
- 如果提供的 uri 字符串为空,则不返回实例,而是返回
null
。 - 如果提供的 uri 字符串不是一个有效的 HTTP URI,则会抛出
stubbles\peer\MalformedUri
。 - 在其他所有情况下,将返回
stubbles\peer\http\HttpUri
的一个实例。
为了使 uri 字符串成为有效的 URI,它必须遵守在 RFC 7230 中规定的规范。任何不属于 http 或 https 方案的 uri 字符串都将被拒绝,并引发 stubbles\peer\MalformedUri
。
此外,可以使用 HttpUri::fromParts($scheme, $host, $port = null, $path = '/', $queryString = null)
创建实例。 (自版本 4.0.0 可用。)
特定方法的规则
hasDefaultPort()
如果方案是 http 且端口是 80,则返回true
。如果没有提供原始端口,则假定端口为 80。如果方案是 https 且端口是 443,则该方法也返回true
。如果没有提供原始端口,则假定端口为 443。在任何其他情况下,该方法返回false
。port()
方法将返回原始提供的端口。如果没有提供,并且方案为 http,则返回值将为 80,如果方案为 https,则返回值为 443。
更改 HTTP URI 的部分
HttpUri
的实例只能更改它们的 URI 参数。无法更改 URI 的主机、用户、密码、端口或片段。此外,还可以更改方案,但这将返回一个新的实例
toHttp()
:如果方案为 http,将返回相同的实例。如果方案为 https,则将返回一个新的实例,该实例具有相同的 URI 但方案为 http。toHttps()
:如果方案为 https,则返回相同的实例。如果方案为 http,则返回一个新的实例,该实例具有相同的 URI 但方案为 https。
可以使用 isHttp()
和 isHttps()
检查当前方案。
建立到 HTTP URI 的连接
此外,该类还提供了建立到名称 HTTP URI 的连接的可能性
openSocket()
将创建一个stubbles\peer\Socket
实例,可以连接到该实例。有关更多详细信息,请参阅关于套接字的部分。connect()
提供了具有完整 HTTP 连接的高级访问权限。该方法可以可选地接受一个stubbles\peer\HeaderList
实例,其中将应用标题到请求中。
建立 HTTP 连接
可以通过以下方式对目标 URI 执行 HTTP 请求
$response = $httpUri->connect() ->asUserAgent('Not Mozilla') ->timeout(5) ->usingHeader('X-Money', 'Euro') ->get();
请注意,对 connect()
的调用不会打开连接,但仅在本地建立连接。相反,它可以用来添加更多标题到请求中:用户代理、引用者、Cookie 或任何其他标题。只有最后一种方法真正打开连接。目前,支持 GET、HEAD、POST、PUT 和 DELETE 请求
$response = $httpUri->connect()->get(); $response = $httpUri->connect()->head(); $response = $httpUri->connect()->post($postBody); $response = $httpUri->connect()->put($putBody); $response = $httpUri->connect()->delete();
对于 POST 和 PUT,有一个必需的参数,该参数应包含 post/put 正文。对于 POST,还可以提供关联的 array
,它将被转换为表单 post 值,这将导致自动添加 Content-type: application/x-www-form-urlencoded 标题到请求中。
然后可以读取响应。它提供了访问 HTTP 响应所有单个细节的方法。
套接字操作
可以使用 stubbles\peer\Socket
执行套接字操作。通过构造函数提供主机来创建套接字,并可选地提供端口。如果没有指定端口,它将回退到端口 80。
在构造时仅创建套接字实例。要实际打开连接,必须调用 connect()
方法。可选地,可以提供建立连接的超时时间,如果没有给出,则默认为 2 秒。成功建立连接后,它将返回一个 stubbles\peer\Stream
实例,该实例提供从套接字读取和写入的方法。
其他实用程序类
stubbles\peer\HeaderList
该类提供了使用标题的可能性,主要解析包含标题的字符串并维护标题列表。
stubbles\peer\http\AcceptHeader
该类可以解析 HTTP 的 accept header 并提供检查是否接受某种类型、其优先级以及如果将 accept header 与类型选择进行比较以找到最佳匹配的访问权限。它可以处理 Accept、Accept-Charset 和 Accept-Encoding。
stubbles\peer\ParsedUri
以 uri 字符串作为构造函数参数,并提供了访问 uri 的各个部分。与 stubbles\peer\Uri
和 stubbles\peer\http\HttpUri
不同,不会在 url 字符串上执行检查,这意味着可以从无效的 url 字符串构造实例,这是其他两个类所不允许的。
stubbles\peer\QueryString
接受查询字符串作为构造参数,并提供对查询字符串中所有参数的访问权限,以修改和删除它们或添加其他参数;并从这些参数中重新构建完整的查询字符串。
stubbles\peer\IpAddress
自4.0.0版本起可用
表示IP地址以及可能的IP地址操作。
与stubbles/values集成
如果存在stubbles/values包,则会自动添加对stubbles\values\Parse
的识别,以解析http URI到stubbles\peer\http\HttpUri
实例。
此外,还添加了对stubbles\values\Value
的一些检查(自7.1.0版本起可用)
isMailAddress()
isIpAddress()
isIpV4Address()
isIpV6Address()
isHttpUri()
isExistingHttpUri()