要取得 tmpfile 檔案指標的底層檔案路徑
<?php
$file = tmpfile();
$path = stream_get_meta_data($file)['uri']; // 例如:/tmp/phpFx0513a
(PHP 4, PHP 5, PHP 7, PHP 8)
tmpfile — 建立暫存檔案
以讀寫二進制 (w+b) 模式建立一個具有唯一名稱的暫存檔案,並返回檔案控制代碼。
當檔案被關閉時(例如,通過呼叫 fclose(),或者當沒有剩餘的檔案控制代碼(由 tmpfile() 返回)的引用時),或者當腳本結束時,該檔案會被自動移除。
如果腳本意外終止,臨時檔案可能不會被刪除。
此函式沒有參數。
範例 #1 tmpfile() 範例
<?php
$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // 這會移除檔案
?>
上述範例將輸出
writing to tempfile
要取得 tmpfile 檔案指標的底層檔案路徑
<?php
$file = tmpfile();
$path = stream_get_meta_data($file)['uri']; // 例如:/tmp/phpFx0513a
我發現這個函式在透過 FTP 上傳檔案時很有用。我上傳的其中一個檔案是來自前一頁 textarea 的輸入,所以實際上沒有「檔案」可以上傳,這個函式很好地解決了這個問題。
<?php
# 上傳 setup.inc
$fSetup = tmpfile();
fwrite($fSetup,$setup);
fseek($fSetup,0);
if (!ftp_fput($ftp,"inc/setup.inc",$fSetup,FTP_ASCII)) {
echo "<br /><i>設定檔未插入</i><br /><br />";
}
fclose($fSetup);
?>
變數 $setup 是文字區域的內容。
我不確定是否需要 fseek($temp,0);,除非你知道它沒有作用,否則就保留它。
至少在 Windows 10 搭配 php 7.3.7,以及 Debian Linux 搭配 php 7.4.2 上,
模式不是(如文件中所述)'w+',而是 'w+b'
(在 Windows 系統上工作時,這是一個重要的區別)
由於此函式在某些環境中可能無法正常運作,以下提供一個簡單的解決方法
function temporaryFile($name, $content)
{
$file = DIRECTORY_SEPARATOR .
trim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) .
DIRECTORY_SEPARATOR .
ltrim($name, DIRECTORY_SEPARATOR);
file_put_contents($file, $content);
register_shutdown_function(function() use($file) {
unlink($file);
});
return $file;
}
要取得 tmpfile 的內容
<?php
$tmpfile = tmpfile();
$tmpfile_path = stream_get_meta_data($tmpfile)['uri'];
// ... 寫入到 tmpfile ...
$tmpfile_content = file_get_contents($tmpfile_path);
?>
也許不是用於正式程式碼的最佳方式,但對於記錄或快速 var_dump() 除錯執行來說已經足夠了。
不,fseek() 是必要的——在寫入檔案後,檔案指標(我將使用「檔案指標」來指代檔案中的目前位置,也就是您使用 fseek() 更改的位置)位於檔案的末尾,而在檔案末尾讀取會立即返回 EOF,這表現為上傳空檔案。
您可能感到困惑的地方在於某些系統要求在讀取和寫入同一個檔案之間需要 seek 或 flush。fflush() 滿足了這個先決條件,但它對檔案指標沒有任何作用,在這種情況下,檔案指標需要移動。
-- Josh