自动删除 – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Wed, 26 Apr 2023 09:17:34 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 在 PHP 7.4 中基于 fopen 生成一个流资源,操作了磁盘,调整为完全基于内存的实现 https://www.shuijingwanwq.com/2023/04/26/7585/ https://www.shuijingwanwq.com/2023/04/26/7585/#respond Wed, 26 Apr 2023 09:17:34 +0000 https://www.shuijingwanwq.com/?p=7585 浏览量: 64 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
打印结果

图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
打印结果

图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
两者主要的差别在于,在脚本结束后,搜索: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
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)



]]>
https://www.shuijingwanwq.com/2023/04/26/7585/feed/ 0