fairycat

Updated:
Created:

在 PHP 中从字符串创建流

在 PHP 中处理字符串,有时候把它转换成 Stream 来处理会很方便。比如处理不同来源的数据,有的数据源是流而有的直接给出字符串了,统一转成流可以统一一个输出流程。

base64 转 Stream

$base64 = base64_encode("string");

$stream = fopen('data://text/plain;base64,' . $base64, 'r');

当拿到一个 base64 字符串,可以直接拼接在 data:// 协议的地址后边,然后用fopen 打开地址。

text/plain 地址

如果源内容不是 base64 而是普通的字符串,可以如同前边一样经过 base64_encode 转换再进行 base64 地址的拼接,但是转换 base64 字符串会变长很多。另外可以省略 ;base64 而直接使用字符串拼接,但需要注意的是,fopen 处理该字符串直接会经过 urldecode 处理该字符串,因为这确实就是 URL。如果字符串中存在 URL 编码序将会被转换。比如字符串中恰好存在 %20,则将会被转换成空格。要解决该问题就在拼接字符串时经过 urlencode 进行转换。要经过转换还是感觉不太好,可以使用后边提到的 php://memory 或者 php://temp

$string = 'string';
$stream = fopen('data://text/plain,' . urlencode($string), 'r');

php://memory 与 php://temp

这两者都是在内存上打开一个空间用于存储数据的。区别是 php://temp 在写入超过一定数据量之后自动保存到文件以免使用太多内存。经过 fopen 打开之后,就可以写入和读取数据了。

$string = 'string';
$stream = fopen('php://memory', 'w+');
fwrite($stream, $string);
rewind($stream);

评论

Name

Email

Website

Subject