要获取 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, "写入临时文件");
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 文件未插入</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
注意,PHP 的 tmpfile
不是 unix 的 tmpfile
的等效项。
PHP(至少是我现在使用的 v. 5.3.17/linux)在 /tmp 中创建一个以“php”为前缀的文件,并在 fclose
或脚本终止时删除该文件。
因此,如果您希望确保即使在出现致命错误或进程被杀死的情况下也不留下垃圾,则不应该依赖此函数。
使用在创建后删除文件的经典方法
<?php
$fn = tempnam ('/tmp', 'some-prefix-');
if ($fn)
{
$f = fopen ($fn, 'w+');
unlink ($fn); // 即使 fopen 失败,因为 tempnam 创建了文件
if ($f)
{
do_something_with_file_handle ($f);
}
}
?>