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

PHP Spreadsheet本地正常,部署至生产服务器后导出失败求助

PHP Spreadsheet导出功能生产环境失败排查求助

我用PHP Spreadsheet开发的数据导出功能在本地运行正常,但部署到生产服务器后导出失败,浏览器弹出加载错误。相关代码和错误截图如下:

<?php

session_start();
include "includes/db.php";
require '../vendor/autoload.php';
 
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
use PhpOffice\PhpSpreadsheet\Writer\Csv;

if(isset($_POST['export_csv_data'])) 
{ 
    $export     = $_POST['export']; 
    $filename   =  "Adjudication-Sheet";

    $search_query="SELECT * FROM `adjudication_team` WHERE document_reviewed_by = '".$_SESSION['username']."'";
    $result=mysqli_query($connection,$search_query);
    if($result)
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'ID');
        $sheet->setCellValue('B1', 'USER ID');
        $sheet->setCellValue('C1', 'PATIENT NAME');
        $sheet->setCellValue('D1', 'DOCUMENT BY');
        $sheet->setCellValue('E1', 'DOCUMENT RECEIVED DATE');
        $sheet->setCellValue('F1', 'UHID NUMBER');
        $sheet->setCellValue('G1', 'ACTUAL DATE');
        $sheet->setCellValue('H1', 'ACTUAL DISCHARGE');
        $sheet->setCellValue('I1', 'HOSPITAL BILL');
        $sheet->setCellValue('J1', 'MAIN BILL');
        $sheet->setCellValue('K1', 'PHARMACY BILL EXCLUDED');
        $sheet->setCellValue('L1', 'ADVANCE PAYMENT');
        $sheet->setCellValue('M1', 'PHARMACY BILL');
        $sheet->setCellValue('N1', 'PRE HOSPITALIZATION');
        $sheet->setCellValue('O1', 'POST HOSPITALIZATION');
        $sheet->setCellValue('P1', 'OUTSIDE HOSPITALIZATION');
        $sheet->setCellValue('Q1', 'TOTAL BILL AMOUNT');
        $sheet->setCellValue('R1', 'DOCUMENT REVIEWED DATE');
        $sheet->setCellValue('S1', 'DOCUMENT REVIEWED BY');
        $sheet->setCellValue('T1', 'HOSPITAL PAID RECIEPT');
        $sheet->setCellValue('U1', 'INVESTIGATION BILL');
        $sheet->setCellValue('V1', 'PRE HOSPITALIZATION BILL');
        $sheet->setCellValue('W1', 'POST HOSPITALIZATION BILL');
        $sheet->setCellValue('X1', 'OUTSIDE HOSPITALIZATION BILL');
        $sheet->setCellValue('Y1', 'INVESTIGATION BILL');
        $sheet->setCellValue('Z1', 'DATE IN');

        $rowcount = 2;
        foreach($result as $row)
        {
            $sheet->setCellValue('A'.$rowcount,$row['id']);
            $sheet->setCellValue('B'.$rowcount,$row['user_id']);
            $sheet->setCellValue('C'.$rowcount,$row['patient_name']);
            $sheet->setCellValue('D'.$rowcount,$row['document_by']);
            $sheet->setCellValue('E'.$rowcount,$row['document_received_date']);
            $sheet->setCellValue('F'.$rowcount,$row['uhid_number']);
            $sheet->setCellValue('G'.$rowcount,$row['actual_date']);
            $sheet->setCellValue('H'.$rowcount,$row['actual_discharge']);
            $sheet->setCellValue('I'.$rowcount,$row['hospital_bill']);
            $sheet->setCellValue('J'.$rowcount,$row['main_bill']);
            $sheet->setCellValue('K'.$rowcount,$row['pharmacy_bill_excluded']);
            $sheet->setCellValue('L'.$rowcount,$row['advance_payment']);
            $sheet->setCellValue('M'.$rowcount,$row['pharmacy_bill']);
            $sheet->setCellValue('N'.$rowcount,$row['pre_hospitalization']);
            $sheet->setCellValue('O'.$rowcount,$row['post_hospitalization']);
            $sheet->setCellValue('P'.$rowcount,$row['outside_hospitalization']);
            $sheet->setCellValue('Q'.$rowcount,$row['total_bill_amount']);
            $sheet->setCellValue('R'.$rowcount,$row['document_reviewed_date']);
            $sheet->setCellValue('S'.$rowcount,$row['document_reviewed_by']);
            $sheet->setCellValue('T'.$rowcount,$row['hospital_paid_reciept']);
            $sheet->setCellValue('U'.$rowcount,$row['investigation_bill']);
            $sheet->setCellValue('V'.$rowcount,$row['pre_hospitalisation_bill']);
            $sheet->setCellValue('W'.$rowcount,$row['post_hospitalisation_bill']);
            $sheet->setCellValue('X'.$rowcount,$row['outside_hospitalisation_bill']);
            $sheet->setCellValue('Y'.$rowcount,$row['discharge_summary']);
            $sheet->setCellValue('Z'.$rowcount,$row['date_in']);
            $rowcount++;
        }

        if($export == 'csv')
        {
            $writer = new Csv($spreadsheet);
            $final_filename = $filename.'.csv';
        }

        header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition:attachment;filename="'.urlencode($final_filename).'"');
        $writer->save('php://output');
    }
    else
    {
        print_r(mysqli_error($connection));
    }
}
?>

浏览器加载错误截图


问题排查及修复方案

  • 路径兼容问题:代码中require '..\vendor\autoload.php';使用了Windows反斜杠,生产服务器若为Linux系统,需改为正斜杠../vendor/autoload.php,Linux不识别反斜杠路径。
  • 依赖缺失:生产服务器可能未安装PHP Spreadsheet依赖,执行composer install确保依赖包完整部署。
  • 权限不足:检查服务器临时目录权限,PHP Spreadsheet生成文件需读写临时目录权限,确保运行PHP的用户(如www-data)拥有对应权限。
  • Header输出错误:
    • 当前仅处理CSV导出,但Header固定设置为XLSX的Content-Type,需根据导出类型动态调整:
      if($export == 'csv') {
          $writer = new Csv($spreadsheet);
          $final_filename = $filename.'.csv';
          header('Content-Type: text/csv');
      } else {
          $writer = new Xlsx($spreadsheet);
          $final_filename = $filename.'.xlsx';
          header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
      }
      
    • 确保includes/db.php及其他引入文件无多余空格、echo输出,否则会导致Header发送失败,引发下载错误。
  • SQL注入风险:代码直接拼接$_SESSION['username']到SQL语句,存在注入漏洞,改用预处理语句:
    $search_query = "SELECT * FROM `adjudication_team` WHERE document_reviewed_by = ?";
    $stmt = mysqli_prepare($connection, $search_query);
    mysqli_stmt_bind_param($stmt, "s", $_SESSION['username']);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
  • 内存限制:若导出数据量较大,生产服务器PHP内存可能不足,修改php.ini的memory_limit(如memory_limit = 256M),或在代码开头添加ini_set('memory_limit', '256M');。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:05:19