Heim >Backend-Entwicklung >PHP-Tutorial > php异步子用 提高用户体验

php异步子用 提高用户体验

WBOY
WBOYOriginal
2016-06-13 13:06:35875Durchsuche

php异步调用 提高用户体验

这是我的一个技术很好的朋友写的,要我发表在我的博客上可让php爱好者的读者和爱好php学习的朋友们参考参考.
??????? 案例:PHP语言
某SNS社区,在系统里,用户给自己的好友(好友数量上百)发送邮件,每封邮件内容不一,发送后提示发送完毕!
常用PHP写法
sendmail.php

<?php $count=count($emailarr);//$emailarr数组为好友的邮件地址
for($i=0;$i<$count;$i++)
{
  sendmail(.....);//发送邮件
}
echo ''发送完毕';
?>

?
假设该次发送100封邮件。本次操作会出现什么结果呢?
用户体验:用户等待->发送数十封邮件出去->系统超时返回错误信息
本次操作由于需要发送大量的邮件,导致php执行时间过长,用户烦躁的等待。当apache或者nginx等待超过允许执行时间,返回超时错误。这个时候用户不明确本次操作到底成功与否,到底发出了几封邮件。
我们可以看出该代码用户体验极差,并且不能够顺利完成任务。
那应该怎么操作呢?
这里提到一个概念,异步执行
用户体验:用户等待->发送完毕
朋友们就会问,怎么缺少发信环节?
OK,发信环节就在用户提交请求的时候,把发信任务转给了一个单独处理发信的php程序处理了,当用户看见“发送完毕”的时候其实信还没发送完,这个时候,发信程序正在后台努力的工作着,一封一封的向外发送
sendmail.php

<?php $domain="www.***.com";
$url="/system_mail.php";
$par="email=".implode(',',$emailarr)."&........";
$header = "POST $url HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($par) . "\r\n\r\n";
$fp = @fsockopen ($domain, 80, $errno, $errstr, 30);
fputs ($fp, $header . $par);
fclose($fp);
echo ''发送完毕';
?>
system_mail.php
<?php ini_set("ignore_user_abort",true);
ignore_user_abort(true);//此处的代码需要php.ini开启相关的选项,保证php执行不超时的,不明白,参考我的另一篇文章 “关闭浏览器后,php脚本会不会继续运行”
/*
获取email地址,发信,此处为发信代码
*/
?>

?好了,改成异步方式后,用户提交信息,可以立即得到结果“发送完毕”。信呢,会在后台一封一封的发送,直到发送完毕
本文来源于php爱好者 http://www.phplover.cn/ , 原文地址:http://www.phplover.cn/post/phpyibugongzuotishengyonghutiyan.html

?

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn