在 PHP 7.4 中基于 fopen 生成一个流资源,操作了磁盘,调整为完全基于内存的实现
1、在 PHP 7.4 中基于 fopen 生成一个流资源,操作了磁盘,代码实现如下。
$tmp = tempnam(sys_get_temp_dir(), 'theme_asset_cdn_zip_stream'); $stream = fopen($tmp, 'w+'); var_dump(stream_get_meta_data($stream), $stream); exit;
2、打印结果,如图1
array(9) { ["timed_out"]=> bool(false) ["blocked"]=> bool(true) ["eof"]=> bool(false) ["wrapper_type"]=> string(9) "plainfile" ["stream_type"]=> string(5) "STDIO" ["mode"]=> string(2) "w+" ["unread_bytes"]=> int(0) ["seekable"]=> bool(true) ["uri"]=> string(46) "C:\Users\Lenovo\AppData\Local\Temp\the7A4D.tmp" } resource(2041) of type (stream)
3、参考:https://www.php.net/manual/zh/resource.php ,资源类型列表。使用 tmpfile — 建立一个临时文件。
$stream = tmpfile(); var_dump(stream_get_meta_data($stream), $stream); exit;
4、打印结果,如图2
array(9) { ["timed_out"]=> bool(false) ["blocked"]=> bool(true) ["eof"]=> bool(false) ["wrapper_type"]=> string(9) "plainfile" ["stream_type"]=> string(5) "STDIO" ["mode"]=> string(3) "r+b" ["unread_bytes"]=> int(0) ["seekable"]=> bool(true) ["uri"]=> string(45) "C:\Users\Lenovo\AppData\Local\Temp\php14B.tmp" } resource(2041) of type (stream)
5、两者主要的差别在于,在脚本结束后,搜索:C:\Users\Lenovo\AppData\Local\Temp\the7A4D.tmp,其是存在的。搜索:C:\Users\Lenovo\AppData\Local\Temp\php14B.tmp,其已经被自动删除。如图3
6、fopen 的参数 $filename 支持协议,参考:https://www.php.net/manual/zh/wrappers.php.php 。基于 php://memory 实现,避免操作磁盘。php://memory 和 php://temp 是一个类似文件 包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。如图4
$stream = fopen('php://memory', 'w+'); var_dump(stream_get_meta_data($stream), $stream); exit;
array(9) { ["timed_out"]=> bool(false) ["blocked"]=> bool(true) ["eof"]=> bool(false) ["wrapper_type"]=> string(3) "PHP" ["stream_type"]=> string(6) "MEMORY" ["mode"]=> string(3) "w+b" ["unread_bytes"]=> int(0) ["seekable"]=> bool(true) ["uri"]=> string(12) "php://memory" } resource(2041) of type (stream)
近期评论