在 PHP 7.4 中基于 fopen 生成一个流资源,操作了磁盘,调整为完全基于内存的实现
1、在 PHP 7.4 中基于 fopen 生成一个流资源,操作了磁盘,代码实现如下。
1 2 3 4 5 | $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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 — 建立一个临时文件。
1 2 3 4 | $stream = tmpfile(); var_dump(stream_get_meta_data( $stream ), $stream ); exit ; |
4、打印结果,如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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
1 2 3 4 | $stream = fopen ( 'php://memory' , 'w+' ); var_dump(stream_get_meta_data( $stream ), $stream ); exit ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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) |
近期评论