讲师中心 微信公众号
AI工具推荐 视频效率加速

批量发邮件用 PHP 8.5.7 协程,速度快哭了【异步实战】

夏瑶小哥_2226

夏瑶小哥_2226

发布时间:2026-07-10 21:12:50

|

487人浏览过

|

来源于php中文网

原创

PHP 8.5.7 不自带协程引擎,所谓“协程支持”需依赖 Swow 或 Swoole 等外部扩展;原生 mail()/PHPMailer 同步调用仍会阻塞,必须用 Swow\Coroutine\Socket 替代 fsockopen 并手动封装 SMTP 流程,配合连接复用、限速重试与异常捕获方可实现高效并发发信。

批量发邮件用 php 8.5.7 协程,速度快哭了【异步实战】

PHP 8.5.7 自带 Swoole 协程支持(需编译启用)或可搭配 Swow 使用,但注意:**PHP 官方不内置协程引擎**,所谓“PHP 8.5.7 协程”实际指你在该版本上运行了兼容的协程扩展(如 Swow 1.4+ 或 Swoole 5.1+)。直接用原生 mail() 或 PHPMailer 同步发 1000 封,哪怕在 PHP 8.5.7 上也照样卡死——协程不是自动魔法,得你亲手调度。

用 Swow 启动并发 SMTP 连接,别碰 fsockopen 阻塞模式

常见错误是把旧式 fsockopen 套进协程里还设 stream_set_blocking($fp, 0),这在 Swow 下无效且易出 Broken pipe。正确做法是用 Swow\Coroutine\Socket 原生非阻塞套接字:

  • 先确认已安装 swow 扩展(php -m | grep swow),且版本 ≥ 1.4.0
  • SMTP 连接必须复用 Swow\Coroutine\Socket 实例,每次 connect() + send() + recv() 都要 yield
  • 避免在协程里调用 sleep()、usleep(),改用 Swow\Coroutine::sleep()
  • 连接池不是必须,但单个 Socket 并发发 5–10 封后再换新连接,比每封都新建更稳

PHPMailer 不能直接协程化,得包装成 Swow 友好接口

PHPMailer 内部大量使用同步 fsockopen 和 stream_get_contents(),直接 new PHPMailer() 在协程里会阻塞整个调度器。必须剥离其网络层:

  • 复制 PHPMailer\SMTP 类,把所有 fsockopen/stream_socket_client 替换为 Swow\Coroutine\Socket 调用
  • 把 smtp->hello()、smtp->auth()、smtp->data() 拆成独立协程函数,每个含 yield
  • 别试图 patch PHPMailer::send() 全流程——只取它拼 RAW 邮件体的能力($mail->getSentMIMEMessage()),网络层全自己写
  • 示例关键片段:
    $socket = new Swow\Coroutine\Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    $socket->connect('smtp.example.com', 587);
    $socket->send("EHLO localhost\r\n");
    $socket->recv(1024); // yield 自动发生
    

并发数别瞎设 100,真实瓶颈在 SMTP 服务端限流

本地跑 Swow 发 1000 封,设 go(function () { ... }) 100 次,并不等于 SMTP 服务器真能同时收 100 连接。Gmail、腾讯企业邮箱、阿里云 DirectMail 等普遍限制:

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载
  • 单 IP 每分钟新建连接 ≤ 10–20 个(非并发数)
  • 单连接每分钟发信 ≤ 5–15 封(视认证等级而定)
  • 未认证连接可能被直接 RST,或返回 421 Too many connections

所以实际策略是:用 5–8 个长期复用的协程连接,每连接串行发 100 封,中间加 Swow\Coroutine::sleep(0.3)——比盲目并发更稳、更快、更少被封。

立即学习“PHP免费学习笔记(深入)”;

失败重试和日志必须落盘,协程挂了任务就丢了

协程崩溃不会像 FPM 进程那样留下完整错误堆栈;Swow 的 Coroutine::create() 抛异常时,若没显式 try/catch,任务直接静默消失:

  • 每封邮件发送逻辑外层包 try { ... } catch (\Throwable $e) { error_log("Mail #{$id} failed: " . $e->getMessage()); }
  • 成功/失败状态必须立刻写入数据库或 Redis(用 Swow\Coroutine\Redis,别用 phpredis 同步驱动)
  • 别依赖 register_shutdown_function 清理——协程退出不触发它
  • 临时文件(如附件)路径要绝对,且确保 CLI 用户有读权限;Swow 不继承 Web 服务器的 umask
真正快的不是“用了协程”,而是你绕开了同步阻塞、压住了服务端限流、扛住了异常丢失。协程只是工具,不是银弹——连 SMTP 认证都通不过的连接,开 1000 个协程也发不出一封。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9324

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5641

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2035

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3508

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4194

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3291

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4657

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3642

2023.11.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn