客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果。 有时服务器需要执行很耗时的操作,这个操作的结果并不需要返回给客户端。但因为php是同步执行的,所以客户端需要等待服务处理完才可以进行下一步。 因此对于耗时的操作适合异步执行,服务器接收到请求后,处理完客户端需要的数据就返回,再异步在服务器执行耗时的操作。 1.使用Ajax 与 img 标记 原理,服务器返回的html中插入Ajax 代码或 img 标记,img的src为需要执行的程序。 优点:实现简单,服务端无需执行任何调用 缺点:在执行期间,浏览器会一直处于loading状态,因此这种方法并不算真正的异步调用。 <div class="line number1 index0 alt2">$.get("doRequest.php", { name: "fdipzone"} );</div><div class="line number2 index1 alt1"><img src="</code"></img>"doRequest.php?name=fdipzone"></div>
- 2).不能传递大量参数
3).访问量高时会创建很多进程
3.使用curl 设置curl的超时时间 CURLOPT\_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒
</div><div><div class="line number1 index0 alt2">`<?php </code?>`</div><div class="line number2 index1 alt1">`$ch` `= curl_init(); `</div><div class="line number3 index2 alt2">`$curl_opt` `=array( `</div><div class="line number4 index3 alt1">`CURLOPT_URL,'<a href="http://www.example.com/doRequest.php">http://www.example.com/doRequest.php</a>'`</div><div class="line number5 index4 alt2">`CURLOPT_RETURNTRANSFER,1,</div><div class="line number6 index5 alt1">CURLOPT_TIMEOUT,1 `</div><div class="line number7 index6 alt2">`); `</div><div class="line number8 index7 alt1">`curl_setopt_array($ch,$curl_opt); `</div><div class="line number9 index8 alt2">`curl_exec($ch); `</div><div class="line number10 index9 alt1">`curl_close($ch); `</div><div class="line number11 index10 alt2">`?>`</div> </div><div class="syntaxhighlighter php"></div><div></div> </div> **4.使用fsockopen** fsockopen是最好的,缺点是需要自己拼接header部分。 <div class="jb51code"><div class="syntaxhighlighter php" id="highlighter_378781"><div class="toolbar"></div><?php </code?>$url=`'http://www.example.com/doRequest.php'; `</div><div class="line number4 index3 alt1">`$param` `=array( `</div><div class="line number5 index4 alt2">`'name'=>'fdipzone', `</div><div class="line number6 index5 alt1">`'gender'=>'male', `</div><div class="line number7 index6 alt2">`'age'=>30 `</div><div class="line number8 index7 alt1">`); `</div><div class="line number9 index8 alt2">` `</div><div class="line number10 index9 alt1">`doRequest($url,$param); `</div><div class="line number11 index10 alt2">` `</div><div class="line number12 index11 alt1">`function` `doRequest($url,$param=array()){ `</div><div class="line number13 index12 alt2">` `</div><div class="line number14 index13 alt1">`$urlinfo=parse_url($url);</div><div class="line number15 index14 alt2"></div><div class="line number16 index15 alt1">$host` `=$urlinfo['host']; `</div><div class="line number17 index16 alt2">`$path=$urlinfo['path'];</div><div class="line number18 index17 alt1">$query` `= isset($param)? http_build_query($param) :''; `</div><div class="line number19 index18 alt2">` `</div><div class="line number20 index19 alt1">`$port= 80;</div><div class="line number21 index20 alt2">$errno` `= 0; `</div><div class="line number22 index21 alt1">`$errstr='';</div><div class="line number23 index22 alt2">$timeout` `= 10; `</div><div class="line number24 index23 alt1">` `</div><div class="line number25 index24 alt2">`$fp=fsockopen($host,$port,$errno,$errstr,$timeout);</div><div class="line number26 index25 alt1"></div><div class="line number27 index26 alt2">$out` `="POST ".$path." HTTP/1.1\r\n"; `</div><div class="line number28 index27 alt1">`$out.="host:".$host."\r\n";</div><div class="line number29 index28 alt2">$out` `.="content-length:".strlen($query)."\r\n"; `</div><div class="line number30 index29 alt1">`$out.="content-type:application/x-www-form-urlencoded\r\n";</div><div class="line number31 index30 alt2">$out` `.="connection:close\r\n\r\n"; `</div><div class="line number32 index31 alt1">`$out.=$query;</div><div class="line number33 index32 alt2"></div><div class="line number34 index33 alt1">fputs($fp,$out);</div><div class="line number35 index34 alt2">fclose($fp); `</div><div class="line number36 index35 alt1">`} `</div><div class="line number37 index36 alt2">` `</div><div class="line number38 index37 alt1">`?>`</div> </div><div class="syntaxhighlighter php"></div> </div> 注意:当执行过程中,客户端连接断开或连接超时,都会有可能造成执行不完整,因此需要加上 <div class="jb51code"><div class="syntaxhighlighter php" id="highlighter_512299"><div class="toolbar"></div>ignore_user_abort(true);`// 忽略客户端断开</div><div class="line number2 index1 alt1">set_time_limit(0);`// 设置执行不超时本文作者: 小罗同学
原文链接: 4种PHP异步执行的常用方式
版权声明: 本站所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
免责声明: 文中如涉及第三方资源,均来自互联网,仅供学习研究,禁止商业使用,如有侵权,联系我们24小时内删除!
- « 上一篇apache 图片重定向
- 下一篇 »JS 对象封装的常用方式
评论1
暂时没有评论