PHP 有没有类似异步的功能?

2017-04-27 18:13:32 +08:00
 cstome

大概情况

我是做前端的,会点 PHP,但不打算花太多时间深入学 PHP (正在学 Python ),所以想问问有没有捷径。

大概需求

最近做个小项目,用 PHP 输出 JSON 并发送邮件,大概逻辑是这样的:

处理 JSON...

返回 JSON...

发邮件(调用 PHPMailer )...

但是这样的话会等待发邮件任务完成在返回 JSON,想知道有什么方法可以先返回(即结束当前脚本),在处理发邮件的任务?

9193 次点击
所在节点    PHP
55 条回复
kran
2017-04-27 21:32:50 +08:00
fastcgi_finish_request
hainuo
2017-04-27 21:59:12 +08:00
有两个东西可以做到 异步编程对 php 来说是服务端变成 你可以看一下 reactphp swoole workman 等
cstome
2017-04-27 22:32:15 +08:00
@murusu 这个思路很可以!
sagaxu
2017-04-27 23:13:20 +08:00
PHP 太残了,别的语言一个线程池和 Queue 就搞定的事,到了 php 这里还要各种绕路
jssngz
2017-04-27 23:26:03 +08:00
php 看了语法和 jsp asp 是一个等级的,还没有到语言的层级
dream7758521
2017-04-28 02:04:59 +08:00
教你一个最简单的方法,先处理完 json,然后将相关信息存到数据库。
然后在写一个单独处理邮件发送的 php,在这个页面最后面加入跳转到本页的功能,
然后用浏览器打开这一页 php,放着别动就可以了,发送完毕后又会自动跳转到本页,然后又会继续运行!
Mitt
2017-04-28 02:46:55 +08:00
@jssngz
@sagaxu

本来 PHP 设计也不是来干这种事的呀 选语言也要先搞清楚自己需要什么把 动不动就把一个语言说的那么残废 总想要个万能语言又想成本低又简单
dangyuluo
2017-04-28 07:20:45 +08:00
beanstalkd
dangyuluo
2017-04-28 07:21:26 +08:00
@sagaxu
@jssngz

两位大神,服。
simapple
2017-04-28 08:07:26 +08:00
gearman
wwolf
2017-04-28 08:11:13 +08:00
swoole
MushishiXian
2017-04-28 08:12:01 +08:00
别人问个 php 问题都有人黑语言的,也不看自己什么水平,就说一门语言怎样怎样
jininij
2017-04-28 08:46:11 +08:00
yield 协程可以实现异步。伪代码长这样

function sendEmail($argv){
$message = yield ;
//1.发送邮件
sleep(3);
}
$y = sendEmail($a);
//前期工作
$y->send($m);
//2.其他工作,输出内容。
sleep(2);

1 和 2 会在不同线程中执行,脚本实际执行时间是 1 和 2 中最长的。3 秒,而不是 5 秒。
KAAAsS
2017-04-28 08:50:39 +08:00
ignore_user_abortb 吧……但是还是考虑考虑 VPS 吧
ic2y
2017-04-28 09:04:06 +08:00
都做成 ajax 调用。后两部 分拆为两个 ajax。
silenceeeee
2017-04-28 09:04:50 +08:00
private $_queue = array();
function send() {
// ...
// echo JSON
// $this->_queue[] = array('addr'=> 'XXX@xx.com', ...);
}

public function __destruct() {
// send email
}
mikej
2017-04-28 09:14:22 +08:00
可以试试 fastcgi_finish_request,看鸟哥的 blog: http://www.laruence.com/2011/04/13/1991.html
Felldeadbird
2017-04-28 09:15:29 +08:00
我司是这么处理的。
用户触发发送邮件(通知类)。先将待发送的内容保存到数据库(缓存)。然后马上返回给前台告知操作成功。
后台有 cron 定时去处理这些任务。
falcon05
2017-04-28 09:36:25 +08:00
用 ajax 处理队列的做法我好像在某个 O2O 系统看过。
tabris17
2017-04-28 09:42:04 +08:00
传统 cli 或者 fcgi 模式的 PHP 是不支持异步的,可以用 Swoole 或者 workerman

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/357776

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX