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发送失败,引发下载错误。
- 当前仅处理CSV导出,但Header固定设置为XLSX的Content-Type,需根据导出类型动态调整:
- 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
相关产品推荐
相关产品推荐

