<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.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://www.jackxiang.com/post//</link>
<title><![CDATA[使用proc_open()打开一个指向进程的管道]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 24 Nov 2008 06:01:10 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 手机视频广告，用PHP发送视频广告，需要通过PHP执行一个外部发送视频命令。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以写PHP扩展来完成，本人没有那个能力及时间，故使用exec()这个函数来完成。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passthru(),exec(),system() 这三个函数功能相似.passthru无法接受输出值,system只接收最后以行输出,exec可以完全接收输出.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 见如下passthru的一个例子:<br/><br/>文件名称：../passthru.php<br/><br/><br/><div class="code">&nbsp;&nbsp; 1. &lt;?php<br/>&nbsp;&nbsp; 2. ob_start();<br/>&nbsp;&nbsp; 3. ignore_user_abort();&nbsp;&nbsp;&nbsp;&nbsp;// run script in background<br/>&nbsp;&nbsp; 4. set_time_limit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// run script forever<br/>&nbsp;&nbsp; 5.<br/>&nbsp;&nbsp; 6. echo &#039;单独dddd&#039;;<br/>&nbsp;&nbsp; 7. ob_end_clean();<br/>&nbsp;&nbsp; 8.<br/>&nbsp;&nbsp; 9. passthru(&#039;python E:/webroot/test/dtree.py&#039;, $return_var);<br/>&nbsp;&nbsp;10. $output = ob_get_contents();<br/>&nbsp;&nbsp;11. ob_end_clean();<br/>&nbsp;&nbsp;12.<br/>&nbsp;&nbsp;13. echo $output;<br/>&nbsp;&nbsp;14.<br/>&nbsp;&nbsp;15. //数据保存<br/>&nbsp;&nbsp;16. file_put_contents(&#039;output.txt&#039;, $output);<br/>&nbsp;&nbsp;17. file_put_contents(&#039;return.txt&#039;, $return_var);<br/>&nbsp;&nbsp;18.<br/>&nbsp;&nbsp;19. die();<br/>&nbsp;&nbsp;20. ?&gt;</div><br/><br/>使用如上的方法,当发送若干视频广告时候,需要使用exec调用若干次发送程序,或者让发送程序一次接收若干手机号码,有发送程序循环处理.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 较好的办法是打开一个指向进程的管道,然后每次发送一个广告,如下:<br/><br/>文件名称：../popen.php<br/><br/><br/><div class="code">&nbsp;&nbsp; 1. &lt;?php<br/>&nbsp;&nbsp; 2. ignore_user_abort();&nbsp;&nbsp;&nbsp;&nbsp;// run script in background<br/>&nbsp;&nbsp; 3. set_time_limit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// run script forever<br/>&nbsp;&nbsp; 4.<br/>&nbsp;&nbsp; 5. //popen是单向的，如果需要双向支持，使用 proc_open()。<br/>&nbsp;&nbsp; 6. $handle = popen(&#039;python E:/webroot/test/dtree.py&#039;, &#039;r&#039;);<br/>&nbsp;&nbsp; 7.<br/>&nbsp;&nbsp; 8. while(!feof($handle))<br/>&nbsp;&nbsp; 9. &#123;<br/>&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp; $buffer .= fread($handle, 1024);<br/>&nbsp;&nbsp;11. &#125;<br/>&nbsp;&nbsp;12.<br/>&nbsp;&nbsp;13. pclose($handle);<br/>&nbsp;&nbsp;14.<br/>&nbsp;&nbsp;15. echo $buffer;<br/>&nbsp;&nbsp;16.<br/>&nbsp;&nbsp;17. //数据保存<br/>&nbsp;&nbsp;18. file_put_contents(&#039;output.txt&#039;, $buffer);<br/>&nbsp;&nbsp;19. die();<br/>&nbsp;&nbsp;20.<br/>&nbsp;&nbsp;21. //写入的例子<br/>&nbsp;&nbsp;22. //$handle = popen (&quot;python&quot;,&quot;w&quot;);<br/>&nbsp;&nbsp;23. //fwrite($handle, &#039;3 + 6&#039;);<br/>&nbsp;&nbsp;24. //pclose($handle);<br/>&nbsp;&nbsp;25. ?&gt;</div><br/><br/><br/><br/>&nbsp;&nbsp;popen() 它是单向的（只能用于读或写），我们需要获得发送结果，proc_open()来完成双向支持功能：<br/><br/>文件名称：../proc_open.php<br/><br/><br/><div class="code">&nbsp;&nbsp; 1. &lt;?php<br/>&nbsp;&nbsp; 2. ignore_user_abort();&nbsp;&nbsp;&nbsp;&nbsp;// run script in background<br/>&nbsp;&nbsp; 3. set_time_limit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// run script forever<br/>&nbsp;&nbsp; 4.<br/>&nbsp;&nbsp; 5. $descriptorspec = array(<br/>&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 =&gt; array(&#039;pipe&#039;, &#039;r&#039;),<br/>&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 =&gt; array(&#039;pipe&#039;, &#039;w&#039;),<br/>&nbsp;&nbsp; 8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 =&gt; array(&#039;file&#039;, &#039;c:/temp/error-output4.txt&#039;, &#039;w&#039;)<br/>&nbsp;&nbsp; 9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br/>&nbsp;&nbsp;10.<br/>&nbsp;&nbsp;11. $cwd = &#039;D:/Python24/&#039;;<br/>&nbsp;&nbsp;12. $env = array(&#039;some_option&#039; =&gt; &#039;aeiou&#039;);<br/>&nbsp;&nbsp;13.<br/>&nbsp;&nbsp;14. $process = proc_open(&#039;python.exe&#039;, $descriptorspec, $pipes, $cwd, $env);<br/>&nbsp;&nbsp;15.<br/>&nbsp;&nbsp;16. if (is_resource($process))<br/>&nbsp;&nbsp;17. &#123;<br/>&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp; // $pipes now looks like this:<br/>&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 0 =&gt; writeable handle connected to child stdin<br/>&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 1 =&gt; readable handle connected to child stdout<br/>&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Any error output will be appended to /tmp/error-output.txt<br/>&nbsp;&nbsp;22.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//echo stream_get_contents($pipes&#91;1&#93;);<br/>&nbsp;&nbsp;23.<br/>&nbsp;&nbsp;24.&nbsp;&nbsp;&nbsp;&nbsp; fwrite($pipes&#91;0&#93;, &quot;print 61+10&#92;n&quot;);<br/>&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp; fwrite($pipes&#91;0&#93;, &quot;print 31+10&#92;n&quot;);<br/>&nbsp;&nbsp;26.&nbsp;&nbsp;&nbsp;&nbsp; fwrite($pipes&#91;0&#93;, &quot;print 41+10&#92;n&quot;);<br/>&nbsp;&nbsp;27.&nbsp;&nbsp;&nbsp;&nbsp; fwrite($pipes&#91;0&#93;, &quot;print 61+10&#92;n&quot;);<br/>&nbsp;&nbsp;28.&nbsp;&nbsp;&nbsp;&nbsp; fclose($pipes&#91;0&#93;);<br/>&nbsp;&nbsp;29.<br/>&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp; //echo stream_get_contents($pipes&#91;1&#93;);<br/>&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp; $buffer = &#039;&#039;;<br/>&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!feof($pipes&#91;1&#93;))<br/>&nbsp;&nbsp;33.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;34.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buffer .= fgets($pipes&#91;1&#93;, 1024);<br/>&nbsp;&nbsp;35.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;36.<br/>&nbsp;&nbsp;37.&nbsp;&nbsp;&nbsp;&nbsp; fclose($pipes&#91;1&#93;);<br/>&nbsp;&nbsp;38.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $buffer;<br/>&nbsp;&nbsp;39.<br/>&nbsp;&nbsp;40.&nbsp;&nbsp;&nbsp;&nbsp; //数据保存<br/>&nbsp;&nbsp;41.&nbsp;&nbsp;&nbsp;&nbsp; file_put_contents(&#039;output.txt&#039;, $buffer);<br/>&nbsp;&nbsp;42.<br/>&nbsp;&nbsp;43.&nbsp;&nbsp;&nbsp;&nbsp; //返回值为1，则发生语法错误！<br/>&nbsp;&nbsp;44.&nbsp;&nbsp;&nbsp;&nbsp; $return_value = proc_close($process);<br/>&nbsp;&nbsp;45.<br/>&nbsp;&nbsp;46.&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;47.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;command returned $return_value&#92;n&quot;;<br/>&nbsp;&nbsp;48. &#125;<br/>&nbsp;&nbsp;49. ?&gt;</div><br/><br/><br/><br/><br/><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 使用proc_open()打开一个指向进程的管道]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>