PHP异步执行程序的问题

wzwen 2010-04-28 09:07:14

比如在页面上点击发送邮件(要发100封邮件),怎样让程序后台自动执行?

点击发送邮件后,浏览器已经关闭了

...全文
755 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
imbafrog002 2011-08-25
  • 打赏
  • 举报
回复
采用Gearman异步处理
飞酒 2010-12-12
  • 打赏
  • 举报
回复
看看这个
http://hi.baidu.com/qai41/blog/item/4a99361e51c5961341341752.html
床上等您 2010-04-28
  • 打赏
  • 举报
回复
浏览器怎样后台运行?

php是基于浏览器里执行的

服务端还行
chenshuliang 2010-04-28
  • 打赏
  • 举报
回复
用smtp我就不知道了, 有sendmail为什么不用!
wzwen 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenshuliang 的回复:]
你会用linux的sendmail吗? 把sendmail配好后, 在网页上发邮件都提交到sendmail, 把网页关掉他自己也会发的。
[/Quote]

这样啊,sendmail已经装了,但是我现在用的是smtp发的
chenshuliang 2010-04-28
  • 打赏
  • 举报
回复
你会用linux的sendmail吗? 把sendmail配好后, 在网页上发邮件都提交到sendmail, 把网页关掉他自己也会发的。
cuiyang000 2010-04-28
  • 打赏
  • 举报
回复
6楼的解决思路是对的

做个数据库,存放临时数据

点发送后,无论是直接php还是ajax,把要发送的邮件的相关信息都存进那个临时数据库

然后用crontab每过一小段时间检测一次就是了,只要发现时间已到(send_time>time()),就执行发送

这样做也能增加定时发送功能.
williswatson 2010-04-28
  • 打赏
  • 举报
回复
学习一下了
cm_locke 2010-04-28
  • 打赏
  • 举报
回复
本身发邮件就是想把邮件提交给邮件服务器(SMTP)的发送队列里头
然后邮件服务器会按照自己的进程逐一发送邮件
如果邮件服务器和web服务器同一台机器的话,这种提交速度非常快
所以基本上不用担心队列的问题!

CodeBus 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wzwen 的回复:]

引用 6 楼 foolbirdflyfirst 的回复:
你可以用数据库模拟邮件队列嘛
比如数据库内建一个mail_send表,内有字段to_email,to_name,from_email,from_name,subject,body,issend ...
其中issend字段,1表示此封邮件已经发送过,0表示未发送过,你点击页面上的按钮,实际上只是将邮件信息入库,并将字段issend置……
[/Quote]
可以根據隊列裏的郵件數判斷是否開始發送阿。
jlzan1314 2010-04-28
  • 打赏
  • 举报
回复
ls 自己动手做吧.没什么难的.
wzwen 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 foolbirdflyfirst 的回复:]
你可以用数据库模拟邮件队列嘛
比如数据库内建一个mail_send表,内有字段to_email,to_name,from_email,from_name,subject,body,issend ...
其中issend字段,1表示此封邮件已经发送过,0表示未发送过,你点击页面上的按钮,实际上只是将邮件信息入库,并将字段issend置为0,表示等待后台的定时器发送。
然后后台shell写个ph……
[/Quote]

谢谢,就是在linux上搞个定时任务呀,这个间隔时间不太好设,多了,用户等邮件太久,设少了,占用资源。。。
foolbirdflyfirst 2010-04-28
  • 打赏
  • 举报
回复
你可以用数据库模拟邮件队列嘛
比如数据库内建一个mail_send表,内有字段to_email,to_name,from_email,from_name,subject,body,issend ...
其中issend字段,1表示此封邮件已经发送过,0表示未发送过,你点击页面上的按钮,实际上只是将邮件信息入库,并将字段issend置为0,表示等待后台的定时器发送。
然后后台shell写个php读mail_send表中issend为0的纪录,发送。。每封邮件间隔1秒都行(sleep(1)),可有效防止被目标邮箱丢入垃圾箱。
把这个php文件丢入定时器crontab,每隔一段时间就执行一次,这个看你需要了。
哦,还要注意搞个信号量,比如往某个文件写入1,表示邮件发送处理正在进行中,如果此时新的邮件发送定时进程再次被触发,则理应立即结束,让上次发送邮件的进程继续执行下去,执行完后把某个文件的值改成0,表示另一定时进程可再次读mail_send表,发email.
wzwen 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangball 的回复:]
浏览器怎样后台运行?

php是基于浏览器里执行的

服务端还行
[/Quote]

看帖不仔细

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧