You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FPDF输出PDF串档问题求助:用户A获取到用户B的报告

问题成因
  • 服务器/代理缓存误判:尽管文件名随机,但服务器或反向代理可能将动态生成的PDF识别为静态资源进行缓存,导致后续请求返回缓存的其他用户文件。
  • FPDF实例复用污染:如果代码中全局复用同一个FPDF对象,没有在每个请求时重新初始化,会导致不同用户的PDF内容被混合覆盖。
  • 缓存响应头缺失:未设置明确的禁止缓存HTTP头,浏览器或代理会默认缓存PDF资源,在高并发场景下可能出现缓存命中错误。
  • 随机文件名冲突:若随机生成逻辑不够健壮(如仅用时间戳),高并发下可能出现文件名重复,导致文件被覆盖或混淆。
解决办法
  • 每次请求初始化新的FPDF实例:避免复用全局实例,确保每个用户的PDF生成过程完全独立:
    // 每个请求都创建新实例
    $pdf = new FPDF();
    // 生成PDF内容
    $pdf->AddPage();
    // ... 其他内容逻辑
    $pdf->output('I', $file);
    
  • 添加强制禁止缓存的HTTP头:在输出PDF前发送缓存控制头,彻底阻止缓存:
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Pragma: no-cache");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
    $pdf->output('I', $file);
    
  • 优化文件名生成逻辑:结合用户唯一标识(如用户ID)+ UUID/强随机数,确保文件名绝对唯一:
    // 示例:用户ID + 唯一随机串
    $uniqueId = uniqid('', true);
    $file = "report_{$_SESSION['user_id']}_{$uniqueId}.pdf";
    
  • 调整服务器缓存配置:针对动态生成的PDF路径,配置服务器禁止缓存:
    • Nginx配置示例:
      location ~* /report_.*\.pdf$ {
          add_header Cache-Control "no-store, no-cache";
          expires off;
      }
      
    • Apache .htaccess示例:
      <FilesMatch "^report_.*\.pdf$">
          Header set Cache-Control "no-store, no-cache, must-revalidate"
          Header set Expires "Sat, 26 Jul 1997 05:00:00 GMT"
      </FilesMatch>
      

内容的提问来源于stack exchange,提问作者Fabian Knauf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:05:12