zbateson / stream-decorators
PHP psr7 流装饰器,用于 MIME 消息部分流
Requires
- php: >=8.0
- guzzlehttp/psr7: ^2.5
- zbateson/mb-wrapper: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: *
- phpstan/phpstan: *
- phpunit/phpunit: ^9.6|^10.0
README
字符集转换和常见邮件格式内容编码的 psr7 流装饰器。
本项目的目标是
- 编写得很好
- 符合标准但宽容
- 尽可能进行测试
要将其包含在您的项目中,请通过 composer 安装
composer require zbateson/stream-decorators
PHP 7 支持 已弃用
从 stream-decorators 2.0 开始,已弃用对 PHP 7 的支持。
需求
stream-decorators 需要 PHP 8.0 或更高版本。已在 8.0、8.1、8.2 和 8.3 上进行测试。
2.0 和 2.1 中的新功能
已弃用对 guzzlehttp/psr7 1.9 的支持,最低支持版本为 2.0。
zbateson/mb-wrapper 已更新到 2.0,它会在从/to 不支持的字符集转换时抛出 UnsupportedCharsetException,这改变了 CharsetStream 的行为。
2.1 中引入了两个新类,DecoratedCachingStream 和 TellZeroStream。
用法
$stream = GuzzleHttp\Psr7\Utils::streamFor($handle); $b64Stream = new ZBateson\StreamDecorators\Base64Stream($stream); $charsetStream = new ZBateson\StreamDecorators\CharsetStream($b64Stream, 'UTF-32', 'UTF-8'); while (($line = GuzzleHttp\Psr7\Utils::readLine()) !== false) { echo $line, "\r\n"; }
注意,CharsetStream 根据 目标编码,在读取单个 'char' 时可能会返回多个字节。如果使用 php 的 'fread',这将导致警告
'读取比请求的多 x 字节数据(xxxx 已读取,xxxx 最大) - 过多的数据将丢失'
这是因为 'fread' 的参数是字节,因此当 CharsetStream 返回时,例如,表示单个 UTF-32 字符的 4 个字节,fread 会截断到请求 '1' 个字节时的第一个字节。因此,当使用 CharsetStream 时,建议 不要 转换为流句柄(使用 StreamWrapper)。
该库由以下 Psr\Http\Message\StreamInterface 实现
- ZBateson\StreamDecorators\Base64Stream - 读取时解码,写入时编码为 base64。
- ZBateson\StreamDecorators\CharsetStream - 读取时从 $streamCharset 编码到 $stringCharset,写入时反之。
- ZBateson\StreamDecorators\ChunkSplitStream - 将写入的字符分割成 $lineLength 长的行(php 的 chunk_split 的流实现)。
- ZBateson\StreamDecorators\DecoratedCachingStream - 一个写入到装饰流的缓存流,并从缓存的未装饰流中读取,因此,例如,可以将流传递,并用 Base64Stream 装饰它,当读取时,返回的字节将进行 base64 编码。
- ZBateson\StreamDecorators\NonClosingStream - 覆盖 close() 和 detach(),简单地取消设置附加的流而不关闭它。
- ZBateson\StreamDecorators\PregReplaceFilterStream - 在每次 read() 调用中使用传递的参数调用 preg_replace。
- ZBateson\StreamDecorators\QuotedPrintableStream - 读取时解码,写入时编码为 quoted-printable。
- ZBateson\StreamDecorators\SeekingLimitStream - 与 GuzzleHttp 的 LimitStream 类似,但保持内部当前读取位置,在 read() 调用中定位到它,并在读取后回到包装流的当前位置。
- ZBateson\StreamDecorators\TellZeroStream - tell() 总是返回 '0' -- 用于 DecoratedCachingStream 将 BufferStream 包装在 CachingStream 中。CachingStream 在其包装流上调用 tell(),而 BufferStream 抛出异常,因此使用 TellZeroStream 包装内部 BufferStream 来减轻这种情况。
- ZBateson\StreamDecorators\UUStream - 读取时解码,写入时编码为 uu-encoded。
QuotedPrintableStream、Base64Stream 和 UUStream 的构造函数接受一个 StreamInterface 类型的单个参数。CharsetStreams 的构造函数还分别接受 $streamCharset 和 $stringCharset 作为参数,ChunkSplitStream 可选地接受一个 $lineLength 参数(默认为 76)和一个 $lineEnding 参数(默认为 CRLF)。PregReplaceFilterStream 接受一个 $pattern 参数和一个 $replacement 参数。SeekingLimitStream 可选地接受 $limit 和 $offset 参数,类似于 GuzzleHttp 的 LimitStream。
许可协议
BSD 许可协议 - 请参阅 许可协议。