<?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[php中一个表单提交到两个action ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 10 Sep 2008 07:33:26 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在工作中遇到的一个问题，在现有的构架中，用户的信息被保存在了两台服务器上（一台保存了完整信息，另一台保存了某些需要的信息）。现在因为某些需要，要在信息不全的那台服务器上保存另外的一些信息。其实report(是re_port，自己起的名字：）)并不是唯一选择，解决这个问题的另一个办法就是每次在需要的时候跨服务器查询，但这样做在效率上似乎是一个问题，而且也不是那么安全。<br/> <br/>好了，不说废话了，函数如下：<br/> <br/>function posttohost($url, $data) {<br/>&nbsp;&nbsp;$url = parse_url($url);<br/>&nbsp;&nbsp;if (!$url) return &quot;couldn&#039;t parse url&quot;;<br/>&nbsp;&nbsp;if (!isset($url[&#039;port&#039;])) { $url[&#039;port&#039;] = &quot;&quot;; }<br/>&nbsp;&nbsp;if (!isset($url[&#039;query&#039;])) { $url[&#039;query&#039;] = &quot;&quot;; }<br/>&nbsp;&nbsp;$encoded = &quot;&quot;;<br/>&nbsp;&nbsp;while (list($k,$v) = each($data)) {<br/>&nbsp;&nbsp; $encoded .= ($encoded ? &quot;&amp;&quot; : &quot;&quot;);<br/>&nbsp;&nbsp; $encoded .= rawurlencode($k).&quot;=&quot;.rawurlencode($v);<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;$fp = fsockopen($url[&#039;host&#039;], $url[&#039;port&#039;] ? $url[&#039;port&#039;] : 80);<br/>&nbsp;&nbsp;if (!$fp) return &quot;Failed to open socket to $url[host]&quot;;<br/>&nbsp;&nbsp;fputs($fp, sprintf(&quot;POST %s%s%s HTTP/1.0&#92;n&quot;, $url[&#039;path&#039;], $url[&#039;query&#039;] ? &quot;?&quot; : &quot;&quot;, $url[&#039;query&#039;]));<br/>&nbsp;&nbsp;fputs($fp, &quot;Host: $url[host]&#92;n&quot;);<br/>&nbsp;&nbsp;fputs($fp, &quot;Content-type: application/x-www-form-urlencoded&#92;n&quot;);<br/>&nbsp;&nbsp;fputs($fp, &quot;Content-length: &quot; . strlen($encoded) . &quot;&#92;n&quot;);<br/>&nbsp;&nbsp;fputs($fp, &quot;Connection: close&#92;n&#92;n&quot;);<br/>&nbsp;&nbsp;fputs($fp, &quot;$encoded&#92;n&quot;);<br/>&nbsp;&nbsp;$line = fgets($fp,1024);<br/>&nbsp;&nbsp;if (!eregi(&quot;^HTTP/1&#92;.. 200&quot;, $line)) return;<br/>&nbsp;&nbsp;$results = &quot;&quot;; $inheader = 1;<br/>&nbsp;&nbsp;while(!feof($fp)) {<br/>&nbsp;&nbsp; $line = fgets($fp,1024);<br/>&nbsp;&nbsp; if ($inheader &amp;&amp; ($line == &quot;&#92;n&quot; &#124;&#124; $line == &quot;&#92;r&#92;n&quot;)) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;$inheader = 0;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; elseif (!$inheader) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;$results .= $line;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;fclose($fp);<br/>&nbsp;&nbsp;return $results;<br/> }<br/> <br/>再给一个简单的用法：<br/>在A服务器上有一个表单提交页面，a.php是A服务器上的表单处理程序，b.php是B服务器上的表单处理程序，我们要现实的功能是将表单的内容同时提交给两个程序来处理。假设b.php的绝对路径是http://www.b.com/b.php<br/>a.php:<br/>&lt;?php<br/>....<br/>$url = &#039;http://www.b.com/b.php&#039;;<br/>posttohost($url, $_POST);<br/>?&gt;<br/>在b.php中，只需要按照正常的程序来处理就行，很简单，对吧？<br/> <br/>有一点需要注意的是，通过这种方法建立的连接是一个全新的会话，会有一个全新的sessionid。也就是说，假如用户已经在B服务器上登录了，也保存了cookie，但这些状态并不会带到这个会话中。我解决的办法是这样的：<br/>a.php:<br/>&lt;?php<br/>....<br/>$_POST[username] = $username;//这里假设两台服务器使用同一个用户系统<br/>$url = &#039;http://www.b.com/b.php&#039;;<br/>posttohost($url, $_POST);<br/>?&gt;<br/> <br/>再补充一点，使用这个函数的时候，$_POST数组中不能有数组。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] php中一个表单提交到两个action ]]></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>