- Created:
- Updated:
在 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);