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

如何正确刷新PHP echo输出?解决邮件发送时页面空白问题

解决PHP发送邮件时页面空白,实时显示加载动画的问题

问题核心

你的代码直接输出加载动画后就执行邮件发送,但PHP默认会缓冲所有输出,直到脚本完全执行完毕才会把内容发送给浏览器,导致加载动画无法提前显示,页面一直处于空白状态。

正确的输出刷新实现方案

要让加载动画先显示,需要手动控制输出缓冲流程,步骤如下:

  1. 开启缓冲并立即推送加载动画
    先开启输出缓冲,输出加载动画的HTML,然后强制把缓冲区内容推送给浏览器,确保用户能看到加载状态后,再执行耗时的邮件发送逻辑。

  2. 执行邮件发送任务
    在加载动画显示后,正常执行PHPMailer的邮件发送代码,此时浏览器不会再空白。

  3. 推送最终结果与剩余页面内容
    邮件发送完成后,输出结果信息和剩余HTML,最后关闭缓冲并推送所有剩余内容。

示例代码

<?php
// 关闭自动输出缓冲,确保手动控制生效
ini_set('output_buffering', 0);
// 开启手动输出缓冲
ob_start();

// 输出加载动画HTML
echo '<div style="padding: 20px; font-size: 16px;">正在发送邮件,请稍候...</div>';
// 输出空白字符凑够最小推送阈值(部分服务器需要积累一定内容才会发送)
echo str_repeat(' ', 1024);

// 强制推送缓冲区内容到浏览器
ob_flush();
flush();

// ------------------------------
// 这里执行PHPMailer邮件发送逻辑
// ------------------------------
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/Exception.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);
try {
    // 配置SMTP服务器
    $mail->isSMTP();
    $mail->Host = 'smtp.yourserver.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'your-email@domain.com';
    $mail->Password = 'your-email-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port = 465;

    // 设置邮件内容与附件
    $mail->setFrom('sender@domain.com', '发送者名称');
    $mail->addAddress('recipient@domain.com', '收件人名称');
    // 添加多个PDF附件示例
    $mail->addAttachment('/path/to/file1.pdf');
    $mail->addAttachment('/path/to/file2.pdf');
    // 更多附件...

    $mail->isHTML(true);
    $mail->Subject = '带附件的测试邮件';
    $mail->Body = '<h3>这是一封带PDF附件的测试邮件</h3>';

    // 循环发送最多5封邮件
    for ($i = 0; $i < 5; $i++) {
        $mail->send();
        echo "<p>第 ".($i+1)." 封邮件发送成功!</p>";
        // 每发送一封就推送一次状态
        ob_flush();
        flush();
        // 模拟发送间隔(如果实际发送已有延迟可删除)
        sleep(1);
    }
} catch (Exception $e) {
    echo "<p>邮件发送失败:{$mail->ErrorInfo}</p>";
    ob_flush();
    flush();
}

// 输出剩余页面内容
echo '<div style="margin-top: 20px;">所有邮件处理完成,<a href="/">返回首页</a></div>';

// 推送剩余内容并关闭缓冲
ob_end_flush();
?>

关键函数说明

  • ob_start():开启手动输出缓冲,后续echo的内容会暂时存入缓冲区。
  • ob_flush():将缓冲区中的内容推送给Web服务器,但不清空缓冲区。
  • flush():强制Web服务器把接收到的内容立即发送给浏览器(部分服务器有额外缓冲层,这一步必不可少)。
  • ob_end_flush():推送缓冲区剩余内容并关闭手动缓冲。

额外注意事项

  • 如果使用Nginx服务器,需检查fastcgi_buffer_size等配置,避免服务器额外缓冲内容导致刷新失效。
  • 确保PHP的zlib.output_compression配置为关闭状态,否则压缩会干扰手动刷新流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:52:06