在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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。