如何正确刷新PHP echo输出?解决邮件发送时页面空白问题
解决PHP发送邮件时页面空白,实时显示加载动画的问题
问题核心
你的代码直接输出加载动画后就执行邮件发送,但PHP默认会缓冲所有输出,直到脚本完全执行完毕才会把内容发送给浏览器,导致加载动画无法提前显示,页面一直处于空白状态。
正确的输出刷新实现方案
要让加载动画先显示,需要手动控制输出缓冲流程,步骤如下:
开启缓冲并立即推送加载动画
先开启输出缓冲,输出加载动画的HTML,然后强制把缓冲区内容推送给浏览器,确保用户能看到加载状态后,再执行耗时的邮件发送逻辑。执行邮件发送任务
在加载动画显示后,正常执行PHPMailer的邮件发送代码,此时浏览器不会再空白。推送最终结果与剩余页面内容
邮件发送完成后,输出结果信息和剩余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
相关产品推荐
相关产品推荐

