关于文件相关的操作,想必大家已经非常了解了,在将来我们刷到手册中相关的文件操作函数时也会进行详细的讲解。今天,我们先来了解一下在 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. 第7篇-为Java方法创建栈帧

    在 第6篇-Java方法新栈帧的创建 介绍过局部变量表的创建,创建完成后的栈帧状态如下图所示. 各个寄存器的状态如下所示. // %rax寄存器中存储的是返回地址 rax: return addres ...

  2. spring-session-data-redis反序列化问题

    springCloud项目,采用springSession,用户模块同时引入了spring-cloud-starter-security,在其他模块request.getSession()的时候抛了以 ...

  3. SpringBoot开发十二-账号设置

    需求介绍-账号设置 账号设置里面的上传头像(文件) 首先请求必须是一个 POST 请求,其次表单的属性 enctype = "multipart/form-data" 然后就是利用 ...

  4. php本地文件包含 Writeup

    目录 本地文件包含 LFI本地文件包含案例一 LFI本地文件包含案例二 本地文件包含简介 文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码. ...

  5. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  6. 题解 math

    传送门 赛时用一个奇怪的方法过掉了 首先\(b_i\)的有效范围是\([0, k-1]\) 发现不同的\(a_i*b_i\)会有很多重的 考虑把\(a_i\%k\),然后由小到大排序 按顺序扫,如果某 ...

  7. 两个线程交叉打印一个打印A一个打印B 循环打印?

    public static Object obj1 = new Object(); public static void printAB(){ Thread t1 = new Thread(() -& ...

  8. ASP.NET Core:ASP.NET Core程序使用Docker部署

    一.前言 这篇文章介绍如何将一个ASP.NET Core应用程序在Docker中进行部署.开发工具使用的是Visual Studio 2019和VS Code. 二.使用Docker部署 我们选择新建 ...

  9. 【springboot】自动装配原理

    摘自:https://mp.weixin.qq.com/s/ZxY_AiJ1m3z1kH6juh2XHw 前言 Spring翻译为中文是"春天",的确,在某段时间内,它给Java开 ...

  10. C++面试题(四)——智能指针的原理和实现

    C++面试题(一).(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了.     1,你知道智能指针吗?智能指针的原理.     2,常用的智能指针.     3,智能指针的 ...