关于文件相关的操作,想必大家已经非常了解了,在将来我们刷到手册中相关的文件操作函数时也会进行详细的讲解。今天,我们先来了解一下在 PHP 中关于临时文件相关的一些内容。

获取 PHP 的默认临时创建文件目录

学习过 Linux 操作系统的都会知道有一个目录是 /tmp 目录( Windows 中一般是:C:\Windows\Temp\ ),它是用来存放系统的一些临时文件的,所以,这个目录也叫做临时文件目录。很多软件都会将一些临时保存的文件放在这个目录里面,包括一些缓存、一些临时生成的脚本之类的。PHP 在默认情况下也会将临时文件目录指向这个目录,包括 SESSION 文件之类的临时文件都会保存在这里。它可以在 php.ini 文件中通过 sys_tmp_dir 进行设置。

当然,在动态运行的 PHP 程序中,我们也可以通过一个函数来获得当前的临时文件目录。

print_r(sys_get_temp_dir());
// /tmp

创建一个临时文件

既然有了临时文件目录,PHP 当然也贴心的为我们准备好了直接去创建一个临时文件的函数。

$tmpFile = tmpfile();
fwrite($tmpFile, "I'm tmp file.");
// ll /tmp
// vim phpbnAjbE sleep(10); fclose($tmpFile);
// ll /tmp

tmpfile() 函数就是用来创建这个临时文件的,我们不需要为它指定文件名,也不需要为它指定路径,同时,它创建的文件是 w+ 类型的,也就是直接就是可读写的文件。当调用 fclose() 的时候,这个临时文件将自动删除掉。手册中说使用这个函数创建的文件在脚本运行结束后也会自动删除,但是在测试后发现脚本结束时文件并不会删除。

在调用函数并写入内容后,我们暂停了十秒。其实就是为了去 /tmp 目录里看一下这个文件是否生成成功。根据文件创建的时间,我们找到了生成的这个对应的文件。然后在十秒后执行了 fclose() 之后,再次到目录查看,就会发现文件已经被自动删除了。

根据目录状态创建一个唯一名称的临时文件

最后,PHP 还为我们提供了一个非常人性化的创建临时文件的函数。

$tmpFile = tempnam('/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source', 'testtmp');
$f = fopen($tmpFile, "w");
fwrite($f, "I'm tmp file.");
// ll /tmp
// vim testtmpH7bptZ // etc目录没有写权限
$tmpFile = tempnam('/etc', 'testtmp');
$f = fopen($tmpFile, "w");
fwrite($f, "I'm tmp file.");
// ll /etc
// ll /tmp
// vim testtmpTUNucM

tempnam() 函数,它会根据目录的状态去生成一个唯一名称的临时文件。什么叫根据目录状态呢?从上面的代码注释中可以看出,第二段的 /etc 目录一般是 root 权限的目录,没有 root 帐户权限的话我们是无法创建修改文件的。如果是这种没有权限的目录,或者是压根就不存在的目录,tempnam() 函数就会将文件生成到临时文件目录中去。如果目录是正常存在并且可以写的,就像第一段代码一样,文件就会正常在这个目录进行创建。

tempnam() 函数的第二个参数是指定生成文件名的前缀。tmpfile() 函数是无法指定文件名的,而这个函数则是可以给文件名一个固定的前缀,并保证前缀之后自动生成的文件名部分是唯一的。

总结

又发现了这几个非常好玩的函数,不管是做为临时缓存还是进行一些文件的创建,这两个临时文件操作的函数都非常有用。在日后的开发中我们可以多多尝试使用这样的函数,或许它们能够为我们带来不少的生产力提升。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%9C%A8PHP%E4%B8%AD%E6%93%8D%E4%BD%9C%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6.php

参考文档:

https://www.php.net/manual/zh/function.sys-get-temp-dir.php

https://www.php.net/manual/zh/function.tmpfile.php

https://www.php.net/manual/zh/function.tempnam.php

在PHP中操作临时文件的更多相关文章

  1. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  2. JQuery中操作Css样式的方法

    JQuery中操作Css样式的方法//1.获取和设置样式 $("#tow").attr("class")获取ID为tow的class属性 $("#tw ...

  3. C#中操作Word(1)—— word对象模型介绍

    一.开发环境布置 C#中添加对Word的支持,只需添加对Microsoft.Office.Interop.Word的命名空间,如下图所示,右键点击“引用”,在弹出的“添加引用”对话框中选中COM标签页 ...

  4. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  5. VBA中操作XML

    OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现. 先学习一下VBA中操作XML的方法 先引用Microsoft XML ...

  6. VC线程中操作控件,引起程序卡死的问题。

    [问题还原] 线程中操作控件,具体为控制一个按键的使能,使能后结束线程. 主程序中有一个死循环,等待线程结束. 然后,就没有然后了-- [解决方案] 在主程序死循环中,如果检测到界面消息,优先处理掉.

  7. c#中操作word文档-四、对象模型

    转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual St ...

  8. C#中操作WMI的类库-实现远程登录共享

    WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...

  9. VC++中操作XMLWin32实例

    摘要:VC++中操作XML XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个 ...

随机推荐

  1. WPF基础:Dispatcher介绍

    Disaptcher作用 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负 ...

  2. DVWA(五):CSRF 全等级跨站请求伪造

    CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面 ...

  3. DVWA(六):XSS-Reflected 反射型XSS全等级详解

    XSS 概念: 由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: Reflected(反射型):只是简单的 ...

  4. 见微知著 带你透过内存看 Slice 和 Array的异同

    hi, 大家好,我是 hhf. 有这么一个 Go 面试题:请说出 slice 和 array 的区别? 这简直就是送分题.现在思考一下,你咋样回答才能让面试官满意呢? 我这里就不贴这道题的答案了.但是 ...

  5. 转载自-阮一峰-测试框架 Mocha 实例教程

    测试框架 Mocha 实例教程   作者: 阮一峰 日期: 2015年12月 3日 Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏 ...

  6. 虚拟机下安装Centos设置静态ip,并通过桥接连接

    Centos7.6设置静态IP 1.CentOS7默认网卡设备文件存放于该目录下 /etc/sysconfig/network-scripts/ 网卡设备默认的名字为:ifcfg-ens33 查看网卡 ...

  7. vue同一个页面可以有多个router-view

    参考:https://blog.csdn.net/u011615787/article/details/80075240 参考:https://router.vuejs.org/zh/guide/es ...

  8. vue2.0中文文档

    地址1: 链接: https://pan.baidu.com/s/1uEzM990A-W-fl23ref2zww 提取码: rkpt 复制这段内容后打开百度网盘手机App,操作更方便哦 地址2:htt ...

  9. C++继承体系中的内存对齐

    本篇随笔讨论一个比较冷门的知识,继承结构中内存对齐的问题,如今内存越来越大也越来越便宜,大部分人都已经不再关注内存对齐的问题了.但是作为一个有追求的技术人员,实现功能永远都是最基本的要求,把代码优化到 ...

  10. css - 响应式

    css - 响应式 移动设备尺寸 移动设备的尺寸各不相同,大体上可以做如下划分: 768px以下的是手机屏幕 768px-991px是平板ipad屏幕 992px-1199是大平板屏幕 1200极其以 ...