要获取 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 上传文件时很有用。我上传的文件之一是前一页文本区域的输入,所以实际上没有“文件”要上传,这很好地解决了问题
<?php
# 上传 setup.inc
$fSetup = tmpfile();
fwrite($fSetup,$setup);
fseek($fSetup,0);
if (!ftp_fput($ftp,"inc/setup.inc",$fSetup,FTP_ASCII)) {
echo "<br /><i>Setup file NOT inserted</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,这表现为一个空上传。
您可能会感到困惑的地方在于某些系统要求在读写同一文件之间进行一次查找或刷新。fflush() 满足了先决条件,但它对文件指针没有任何作用,在这种情况下,需要移动文件指针。
-- Josh