PHP中如何读取TempNam临时文件并支持自定义命名与CURL调用?
解决方案:读取临时文件并保留供CURL调用
看起来你遇到了两个核心问题:一是用tempnam生成的临时文件写完后读不到内容,二是需要一个能保留下来供CURL调用的临时文件(毕竟tmpfile()一关就删根本没法用对吧?),下面给你一步步解决这些问题:
一、先修复tempnam示例的读取问题
你之前的代码读不到内容,本质原因是写完文件后,文件指针停在了内容末尾,直接调用fread自然读不到任何东西。有两种简单的修复方式:
方法1:写完后移动文件指针到开头
$tmpfname = tempnam("/tmp", "testfile"); $handle = fopen($tmpfname, "w"); fwrite($handle, "I stored data"); fseek($handle, 0); // 把文件指针移回开头 echo fread($handle, 1024); // 现在能正常读取内容了 fclose($handle); // 不要马上执行unlink!等CURL调用完成后再删除文件 // unlink($tmpfname);
方法2:写完关闭后重新打开文件读取
如果觉得移动指针麻烦,也可以关闭文件后重新以读模式打开:
$tmpfname = tempnam("/tmp", "testfile"); $handle = fopen($tmpfname, "w"); fwrite($handle, "I stored data"); fclose($handle); // 重新打开文件读取 $readHandle = fopen($tmpfname, "r"); echo fread($readHandle, 1024); fclose($readHandle); // CURL调用完成后再删除文件 // unlink($tmpfname);
二、自定义临时文件名供CURL调用
如果需要指定固定的文件名(而不是tempnam生成的随机前缀文件名),可以直接在临时目录创建自定义名称的文件,注意设置合适的权限确保CURL能访问:
// 自定义临时文件名,建议加上随机字符串避免多进程冲突 $customTmpFile = "/tmp/my_custom_temp_" . uniqid() . ".txt"; $handle = fopen($customTmpFile, "w"); fwrite($handle, "Data prepared for CURL call"); fclose($handle); // 设置文件权限,确保外部调用能读取(根据实际场景调整) chmod($customTmpFile, 0644); // 这里执行你的CURL逻辑,比如提交文件到接口 // $curl = curl_init("http://your-api-url.com/upload"); // curl_setopt($curl, CURLOPT_POSTFIELDS, ["file" => new CURLFile($customTmpFile)]); // curl_exec($curl); // 所有操作完成后删除临时文件 unlink($customTmpFile);
小提示:如果不想硬编码
/tmp,可以用sys_get_temp_dir()获取系统默认临时目录,兼容性更好:$tempDir = sys_get_temp_dir(); $customTmpFile = $tempDir . "/my_custom_temp_" . uniqid() . ".txt";
三、为什么tmpfile()不适合你的场景?
tmpfile()的设计就是临时存储,关闭文件后会自动删除,所以当你需要用CURL调用时,文件已经不存在了——这完全不符合你需要保留文件供后续调用的需求,所以确实不是合适的选择。
内容的提问来源于stack exchange,提问作者Kevin Spurs
相关产品推荐
相关产品推荐

