在PHP中操做临时文件
关于文件相关的操做,想必你们已经很是了解了,在未来咱们刷到手册中相关的文件操做函数时也会进行详细的讲解。今天,咱们先来了解一下在 PHP 中关于临时文件相关的一些内容。php
获取 PHP 的默认临时建立文件目录
学习过 Linux 操做系统的都会知道有一个目录是 /tmp 目录( Windows 中通常是:C:\Windows\Temp\ ),它是用来存放系统的一些临时文件的,因此,这个目录也叫作临时文件目录。不少软件都会将一些临时保存的文件放在这个目录里面,包括一些缓存、一些临时生成的脚本之类的。PHP 在默认状况下也会将临时文件目录指向这个目录,包括 SESSION 文件之类的临时文件都会保存在这里。它能够在 php.ini 文件中经过 sys_tmp_dir 进行设置。git
固然,在动态运行的 PHP 程序中,咱们也能够经过一个函数来得到当前的临时文件目录。github
print_r(sys_get_temp_dir());
// /tmp
建立一个临时文件
既然有了临时文件目录,PHP 固然也贴心的为咱们准备好了直接去建立一个临时文件的函数。web
$tmpFile = tmpfile();
fwrite($tmpFile, "I'm tmp file.");
// ll /tmp
// vim phpbnAjbE
sleep(10);
fclose($tmpFile);
// ll /tmp
tmpfile() 函数就是用来建立这个临时文件的,咱们不须要为它指定文件名,也不须要为它指定路径,同时,它建立的文件是 w+ 类型的,也就是直接就是可读写的文件。当调用 fclose() 的时候,这个临时文件将自动删除掉。手册中说使用这个函数建立的文件在脚本运行结束后也会自动删除,可是在测试后发现脚本结束时文件并不会删除。vim
在调用函数并写入内容后,咱们暂停了十秒。其实就是为了去 /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
本文分享自微信公众号 - 硬核项目经理(fullstackpm)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。