PHP异步调用的实现方式
ringa_lee
ringa_lee 2017-04-10 15:02:05
[PHP讨论组]

比如现在有个需求,就是给大量用户发送邮件:

$i=0;
while ($i < 100000) {
    send_mail();    //发送邮件实现代码
    $i++;
}

对于以上事例代码的用户体验就很差,实际上也没人会这么干,那么怎样使用程序后台异步执行,而又不影响用户的体验呢?
求思路...

ringa_lee
ringa_lee

ringa_lee

全部回复(9)
阿神

用redis服务 消息队列做两个php进程的之间的通讯,实现多个进程异步执行

巴扎黑

使用消息队列。

PHP中文网

1、建立一个邮件队列数据表和一个插入邮件队列的PHP公共函数
2、在需要发送邮件的地方,调用上面的PHP公共函数,将邮件先写到邮件队列中。
3、用crontab建立一个定时任务,定期扫描邮件队列,如果有未发送的邮件,则进行发送

怪我咯

其实示例代码没有错,实际上也就是这么做的,只不过是作为单独一个进程来执行的,就像楼上几位说的一样。但是这依然是用阻塞模式运行的。

ringa_lee

redis队列和php多进程,和一楼思路一样的,之前项目中也是用的这种方式。

迷茫

推荐Gearman,百万级生产环境跑过。

怪我咯

我们的shopex为了兼容各种虚拟主机曾经这么干过:

页面下面挂个 <script src="....php" ...

内容:

ignore_user_abort(true);
set_time_limit(0);
header('Content-Lenght: 6');
echo 'void()';

...干一部分活...

curl / fsockopen 请求自己...

别忘了, 开头加个锁, 避免同时干活的太多.

怪我咯

使用Linux的CRON任务或者使用fsockopen来实现或者CURL

阿神

可以使用第三方邮件发送服务平台

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号