<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[PHP实现异步调用方法研究]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Fri, 18 Mar 2016 14:20:01 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	浏览器和服务器之间是通过 HTTP 协议进行连接通讯的。这是一种基于请求和响应模型的协议。浏览器通过 URL 向服务器发起请求，Web 服务器接收到请求，执行一段程序，然后做出响应，发送相应的html代码给客户端。<br/>这就有了一个问题，Web 服务器执行一段程序，可能几毫秒就完成，也可能几分钟都完不成。如果程序执行缓慢，用户可能没有耐心等下去，就关闭浏览器了。<br/>而有的时候，我们更本不关心这些耗时的脚本的返回结果，但却还要等他执行完返回，才能继续下一步。<br/>那么有没有什么办法，只是简单的触发调用这些耗时的脚本然后就继续下一步，让这些耗时的脚本在服务端慢慢执行？<br/>经过试验，总结出来几种方法，和大家share：<br/>1. 最简单的办法，就是在返回给客户端的HTML代码中，嵌入AJAX调用，或者，嵌入一个img标签，src指向要执行的耗时脚本。<br/>这种方法最简单，也最快。服务器端不用做任何的调用。<br/>但是缺点是，一般来说Ajax都应该在onLoad以后触发，也就是说，用户点开页面后，就关闭，那就不会触发我们的后台脚本了。<br/>而使用img标签的话，这种方式不能称为严格意义上的异步执行。用户浏览器会长时间等待php脚本的执行完成，也就是用户浏览器的状态栏一直显示还在load。<br/>当然，还可以使用其他的类似原理的方法，比如script标签等等。<br/>2. popen()<br/>resource popen ( string command, string mode );<br/>//打开一个指向进程的管道，该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道，该进程由派生给定的 command 命令执行而产生。<br/>所以可以通过调用它，但忽略它的输出。<br/>pclose(popen(&quot;/home/xinchen/backend.php &amp;&quot;<br/>这个方法避免了第一个方法的缺点，并且也很快。但是问题是，这种方法不能通过HTTP协议请求另外的一个WebService，只能执行本地的脚本文件。并且只能单向打开，无法穿大量参数给被调用脚本。<br/>并且如果，访问量很高的时候，会产生大量的进程。如果使用到了外部资源，还要自己考虑竞争。<br/>3. 使用CURL<br/>这个方法，设置CUROPT_TIMEOUT为1（最小为1，郁闷）。也就是说，客户端至少必须等待1秒钟。<br/>$ch = curl_init(); $curl_opt = array(CURLOPT_URL, &#039;http://www.example.com/backend.php&#039;, CURLOPT_RETURNTRANSFER, 1, CURLOPT_TIMEOUT, 1,); curl_setopt_array($ch, $curl_opt); curl_exec($ch); curl_close($ch);<br/>4. 使用fsockopen<br/>这个方法应该是最完美的，但是缺点是，你需要自己拼出HTTP的header部分。<br/>$fp = fsockopen(&quot;www.example.com&quot;, 80, $errno, $errstr, 30); if (!$fp) &#123; echo &quot;$errstr ($errno)&lt;br /&gt;&#92;n&quot;; &#125; else &#123; $out = &quot;GET /backend.php / HTTP/1.1&#92;r&#92;n&quot;; $out .= &quot;Host: www.example.com&#92;r&#92;n&quot;; $out .= &quot;Connection: Close&#92;r&#92;n&#92;r&#92;n&quot;; fwrite($fp, $out); /*忽略执行结果 while (!feof($fp)) &#123; echo fgets($fp, 128); &#125;*/ fclose($fp); &#125;<br/>所以，总体来看，最好用，最简单的还是第一种方法。<br/>最完美的应该是最后一种，但是比较复杂<br/>如果有更好的办法，欢迎交流。<br/>来自:http://www.laruence.com/2008/04/14/318.html<br/><br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] PHP实现异步调用方法研究]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>