<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zend Studio</title>
	<atom:link href="http://www.zendstudio.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zendstudio.net</link>
	<description>提供zend studio教程、zend studio下载等相关资源的公益性站点。</description>
	<lastBuildDate>Fri, 30 Jul 2010 06:05:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>zend studio 8.0 beta1已经可以下载</title>
		<link>http://www.zendstudio.net/archives/zend-studio-8-beta-is-now-available/</link>
		<comments>http://www.zendstudio.net/archives/zend-studio-8-beta-is-now-available/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 05:55:39 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[DownLoads]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zendstudio]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1114</guid>
		<description><![CDATA[zend studio 8.0 Beta居然这么快就发布了，和以往一样，zend studio在发布了6.0,6.1之后突然将版本号提升到7.0，这次又是在发布zend studio 7.0,7.1,7.2之后，一下子上升到了8.0，牛逼的版本号！
8.0新版具有以下几个亮点：
1、Zend Studio编辑器支持javascript以及常见js库，例如jquery,dojo,Extjs,prototype
2、更好的支持javascript，html，css等的编辑和调试（gently认为是否不用再做和Aptana的整合工作了？）
3、集成的新的ajax调试器，将javascript和php的调试工作趋于统一
4、PHP编辑器的编辑功能和导航功能的改进和增强。
您也可以参考原文：http://www.zend.com/en/products/studio/studio-8-beta
在zend studio下载页面已经统一提供各版本的下载。

	相关日志
	
	netbeans 6.9正式版 (6)
	zend studio 7.0、7.1 注册码、注册机、激活码 (29)
	让调试利器zend debugger与zend Optimizer共存，和谐！ (7)
	Zend studio教程已隆重更新到10.28 欢迎参观指导 (4)
	zend studio视频教程更新3篇和新的网站结构说明 (3)


]]></description>
			<content:encoded><![CDATA[<p>zend studio 8.0 Beta居然这么快就发布了，和以往一样，zend studio在发布了6.0,6.1之后突然将版本号提升到7.0，这次又是在发布zend studio 7.0,7.1,7.2之后，一下子上升到了8.0，牛逼的版本号！</p>
<p>8.0新版具有以下几个亮点：</p>
<p><strong>1、Zend Studio编辑器支持javascript以及常见js库，例如jquery,dojo,Extjs,prototype</strong></p>
<p><strong>2、更好的支持javascript，html，css等的编辑和调试</strong>（gently认为是否不用再做<a href="http://www.zendstudio.net/archives/zend-studio-7-1-and-aptana-are-good-brothers/">和Aptana的整合工作</a>了？）</p>
<p><strong>3、集成的新的ajax调试器，将javascript和php的调试工作趋于统一</strong></p>
<p><strong>4、PHP编辑器的编辑功能和导航功能的改进和增强。</strong></p>
<p>您也可以参考原文：<a href="http://www.zend.com/en/products/studio/studio-8-beta">http://www.zend.com/en/products/studio/studio-8-beta</a></p>
<p>在<a href="http://www.zendstudio.net/zend-studio-all-in-one-download/">zend studio下载页</a>面已经统一提供各版本的下载。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/netbeans-6-9-released/" title="netbeans 6.9正式版 (06/24/2010)">netbeans 6.9正式版</a> (6)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-70-key-code/" title="zend studio 7.0、7.1 注册码、注册机、激活码 (06/29/2009)">zend studio 7.0、7.1 注册码、注册机、激活码</a> (29)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-debugger-and-zend-optimizer-are-peaceful/" title="让调试利器zend debugger与zend Optimizer共存，和谐！ (10/28/2009)">让调试利器zend debugger与zend Optimizer共存，和谐！</a> (7)</li>
	<li><a href="http://www.zendstudio.net/archives/zend_studio-tutorial-is-updated-to-20081028/" title="Zend studio教程已隆重更新到10.28 欢迎参观指导 (10/27/2008)">Zend studio教程已隆重更新到10.28 欢迎参观指导</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/new-zend-studio-video-tutorial-and-new-site-struct/" title="zend studio视频教程更新3篇和新的网站结构说明 (04/26/2009)">zend studio视频教程更新3篇和新的网站结构说明</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/zend-studio-8-beta-is-now-available/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>入门级的讲讲soap这个php webservice</title>
		<link>http://www.zendstudio.net/archives/php-webservice-soap/</link>
		<comments>http://www.zendstudio.net/archives/php-webservice-soap/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 13:32:01 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[web service]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1109</guid>
		<description><![CDATA[写在前面的话：某天中午，我和同事们一起吃饭，期间我们聊到《XXX》游戏，不可否认，它确实很令人称赞，然后我问JJ，你多少级？他回8级，另个同事已经13级（高玩啊），然后我便开玩笑，JJ你个位数也好意思拿出来说，然后大家问我几级，我6级，哈哈哈，大家都笑了。。。师傅这时候说：“五十步笑百步，有意义么？”，当然这仅仅是我们几个开的一个玩笑。鲁迅先生曾说“文人相轻”，从我这么久泡论坛的经历来看，我们程序员也爱相轻，很多时候，我都觉得这个太不可思议了，技术本是拿来促进社会进步，改善生存环境的一种手段，大家都是同行，又有什么好互相看不起的呢？
进入正题，今天我打算总结下php自带的soap类的使用，总结才有进步。
1、通过开放的webservice获取天气预报数据
这里通过一个开放的提供soap webservice接口的网站说明下如何根据wsdl(什么是wsdl?)使用php调用现有的soap服务！

&#60;?php
/**
 * 从开放的天气预报服务中获得数据
 *
**/
&#160;
$c = new SoapClient&#40; 'http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl',
			     array&#40; 'trace' =&#62; true, 'exceptions' =&#62; true &#41; &#41;;
&#160;
//var_dump( $c-&#62;__getFunctions() );
//var_dump( $c-&#62;__getTypes() );
//不需要参数的情况
$pr =$c-&#62;getRegionProvince&#40;&#41;;
//var_dump( $pr-&#62;getRegionProvinceResult-&#62;string );
&#160;
//带有参数的情况
$scs = $c-&#62;getSupportCityString&#40; array&#40; 'theRegionCode' =&#62; '福建' &#41; &#41;;
var_dump&#40; $scs-&#62;getSupportCityStringResult-&#62;string &#41;;
&#160;
//也可以这样做
$we = $c-&#62;__call&#40;'getWeather', array&#40; array&#40; 'theCityCode' =&#62; 2210 &#41; &#41; &#41;;
var_dump&#40; $we &#41;;
?&#62;

2、如何实现php的soapServer和SoapClient
还是看代码不说话，我这里有个简单的例子，注意，实际应用中一定要对异常进行处理，否则不方便和php以外的程序通信。
这是服务端代码：

&#60;?php
$ss = new SoapServer&#40; null, [...]]]></description>
			<content:encoded><![CDATA[<p>写在前面的话：某天中午，我和同事们一起吃饭，期间我们聊到《XXX》游戏，不可否认，它确实很令人称赞，然后我问JJ，你多少级？他回8级，另个同事已经13级（高玩啊），然后我便开玩笑，JJ你个位数也好意思拿出来说，然后大家问我几级，我6级，哈哈哈，大家都笑了。。。师傅这时候说：“五十步笑百步，有意义么？”，当然这仅仅是我们几个开的一个玩笑。鲁迅先生曾说“文人相轻”，从我这么久泡论坛的经历来看，我们程序员也爱相轻，很多时候，我都觉得这个太不可思议了，技术本是拿来促进社会进步，改善生存环境的一种手段，大家都是同行，又有什么好互相看不起的呢？</p>
<p>进入正题，今天我打算总结下php自带的soap类的使用，总结才有进步。<span id="more-1109"></span></p>
<h3>1、通过开放的webservice获取天气预报数据</h3>
<p>这里通过一个开放的提供soap webservice接口的网站说明下如何根据wsdl(<a href="http://www.w3school.com.cn/wsdl/index.asp">什么是wsdl?</a>)使用php调用现有的soap服务！</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * 从开放的天气预报服务中获得数据
 *
**/</span>
&nbsp;
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapClient<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl'</span><span style="color: #339933;">,</span>
			     <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'trace'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'exceptions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//var_dump( $c-&gt;__getFunctions() );</span>
<span style="color: #666666; font-style: italic;">//var_dump( $c-&gt;__getTypes() );</span>
<span style="color: #666666; font-style: italic;">//不需要参数的情况</span>
<span style="color: #000088;">$pr</span> <span style="color: #339933;">=</span><span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRegionProvince</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//var_dump( $pr-&gt;getRegionProvinceResult-&gt;string );</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//带有参数的情况</span>
<span style="color: #000088;">$scs</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSupportCityString</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'theRegionCode'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'福建'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$scs</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSupportCityStringResult</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">string</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//也可以这样做</span>
<span style="color: #000088;">$we</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span>__call<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'getWeather'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'theCityCode'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2210</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$we</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<h3>2、如何实现php的soapServer和SoapClient</h3>
<p>还是看代码不说话，我这里有个简单的例子，注意，实际应用中一定要对异常进行处理，否则不方便和php以外的程序通信。<br />
这是服务端代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$ss</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapServer<span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'uri'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://zendstudio.Net'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ss</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'t'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'参数1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'参数2'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ss</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//$request = file_get_contents( 'php://input' );</span>
<span style="color: #666666; font-style: italic;">//file_put_contents( 'request.txt', $request );</span>
<span style="color: #000000; font-weight: bold;">class</span> t<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$p1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$p2</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> im8<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$g</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'OK----'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$g</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>客户端代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$ss</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapClient<span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'uri'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://zendstudio.Net'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'location'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://localhost/soap.php'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$header</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapHeader<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'zendHeader'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mmcYY'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'12345678'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ss</span><span style="color: #339933;">-&gt;</span>__setSoapHeaders<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$header</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$ss</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">im8</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'gently'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<h3>3、如何在php的soap客户端和服务端添加SoapHeader头</h3>
<p>实际上，上面的例子已经实现了在客户端添加SoapHeader,而服务端的添加SoapHeader同样的简单，实例化一个SoapHeader，然后使用SoapServer的addSoapHeader方法添加进去即可，这个头一般是学习php soap的一个难点，通常我们做的最多的是用soap的方式和其他程序通信，用php如何构造soapheader显得有些不容易，以至于依赖于这个头的服务端总是返回不正确。</p>
<h3>4、从php的服务端如何获取SoapHeader</h3>
<p>这个大概就是很多人认为php对soap支持不完整的一个原因，目前的php版本无法直接获取SoapHeader，因此我想了一个笨方法，先通过使用php://input，获取所有POST上来的数据，然后使用正则表达式分离出SoapHeader的XML部分，然后再整理出想要的格式。</p>
<p>另外，在PHP的SoapServer端可以通过转存$_SERVER和上面讲到的php://input获取soap的“原始”通信内容。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/run-php-from-context-menu-in-windows/" title="曲径通幽，小谈win下右键菜单实现PHP文件预览 (11/17/2007)">曲径通幽，小谈win下右键菜单实现PHP文件预览</a> (3)</li>
	<li><a href="http://www.zendstudio.net/archives/php-header-function-examples/" title="PHP header() examples -完整代码 (01/29/2007)">PHP header() examples -完整代码</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/websocket-protocol/" title="websocket 通信协议 (05/11/2010)">websocket 通信协议</a> (7)</li>
	<li><a href="http://www.zendstudio.net/archives/php-function-callback-type/" title="php的callback类型小记 (06/28/2010)">php的callback类型小记</a> (5)</li>
	<li><a href="http://www.zendstudio.net/archives/marry-the-jquery/" title="接触伟大的jquery -优雅的JS库 (09/13/2007)">接触伟大的jquery -优雅的JS库</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/php-webservice-soap/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>狗日的腾讯</title>
		<link>http://www.zendstudio.net/archives/%e7%8b%97%e6%97%a5%e7%9a%84%e8%85%be%e8%ae%af/</link>
		<comments>http://www.zendstudio.net/archives/%e7%8b%97%e6%97%a5%e7%9a%84%e8%85%be%e8%ae%af/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 14:48:12 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1105</guid>
		<description><![CDATA[狗日的腾讯，这句话说出了我多年的积郁，其实延伸一些讲，我是很憎恨垄断的。然而在中国，垄断是我们一手造成的。


	相关日志
	
	2009年的上班开始了 (0)
	谷歌真不带我们玩儿了么？ (4)
	真正找资料的人都是用google (2)


]]></description>
			<content:encoded><![CDATA[<p>狗日的腾讯，这句话说出了我多年的积郁，其实延伸一些讲，我是很憎恨垄断的。然而在中国，垄断是我们一手造成的。<span id="more-1105"></span></p>
<p style="text-align: center;"><a href="http://www.zendstudio.net/wp-content/uploads/2010/07/78m402fc.jpg"><img class="size-full wp-image-1106    aligncenter" title="狗日的腾讯" src="http://www.zendstudio.net/wp-content/uploads/2010/07/78m402fc.jpg" alt="" width="480" height="591" /></a></p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/2009-works-has-started/" title="2009年的上班开始了 (02/08/2009)">2009年的上班开始了</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/google-had-left/" title="谷歌真不带我们玩儿了么？ (03/24/2010)">谷歌真不带我们玩儿了么？</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/google-is-the-real-search-engine/" title="真正找资料的人都是用google (07/14/2010)">真正找资料的人都是用google</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/%e7%8b%97%e6%97%a5%e7%9a%84%e8%85%be%e8%ae%af/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>基于php托管的视频点播业务分级系统</title>
		<link>http://www.zendstudio.net/archives/vod-system-build-on-php-proxy/</link>
		<comments>http://www.zendstudio.net/archives/vod-system-build-on-php-proxy/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 14:31:07 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[header()]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1101</guid>
		<description><![CDATA[这实在不是一篇很新的技术文章，只是想起几年前参与的一个项目，当时通过php托管这项技术解决了购买昂贵的视频（VOD）点播系统的资金不足，并且还算自主研发，跟外界如此的吹牛说！这个。。。:-(，其实，写这篇文章我还是很有压力的，从谈到的技术来看，一定有人认为我是江郎才尽吃老本了，翻些陈辞滥调出来充数，可见我是顶着很大的舆论压力来写这篇文字的。不过，我还真的觉得这个php托管技术应用场景应该还是可以拓展的，姑且分享下这个“烂”技术吧。
当时的需求是这样的，只有我们的收费会员才可以看到我们精心制作的外语教程，这个教程是花费了很大成本的原创教程，因此很珍贵。我们打算按照观看时长来消费，而视频的格式居然是flv，当时我们找寻了很多的视频点播解决方案，要么就是昂贵的服务器、播放器+独有加密格式的全套解决方案，要么就是不靠谱的VIP在线电影播放系统。
经过很长时间的纠结和不断尝试以后，我们决定将视频教程切为5分钟一段，分段存储。然后使用php来托管组织这些零散的文件，播放器是网路上到处都是flv player，只是进行了一些优化和改进，好的，到了不得不解释下php托管是啥概念的时候了。哈！简单的说就是flv player不是直接播放我们提供的flv文件的地址，而是去请求一个php文件地址，这样我们就能在php中对访问进行分级限制和统计。为了防止用户从缓存中轻易的得到完整的教程文件，我们将其切为5分钟一段是很好的。代码大致是这样子的

&#60;?php
//权限验证部分
//……
//逻辑处理，回写数据等操作
header&#40;&#34;Content-Type: flv-application/octet-stream\n&#34;&#41;;
readfile&#40;'flv-file-path.flv'&#41;;
?&#62;


是的，你不会大呼上当了吧？嘿嘿！核心代码着实就是这样子的，分级不是大家惯性的认为的R级、PG级、G级这样子分的哈！而是指的不同等级的VIP会员，例如白金级、黄金级的，php托管实际上就是用php作一个proxy，以便控制用户不能直接得到原始地址，这个和下载权限控制是一个道理的。

本文不止是将Php托管技术，也不是单单的讲视频点播系统，而是讲一种综合解决方案，很低成本的基于php托管的视频点播业务分级系统。OK!这就是全部。

	相关日志
	
	令人纠结的php几率算法问题 (15)
	入门级的讲讲soap这个php webservice (3)
	在网页中调用实现显示最新的QQ签名 PHP代码 (6)
	新浪在线可视化web编辑器PHP版（08.02.27最新版） (103)
	在PHP中实现中文汉字验证码 (4)


]]></description>
			<content:encoded><![CDATA[<p>这实在不是一篇很新的技术文章，只是想起几年前参与的一个项目，当时通过php托管这项技术解决了购买昂贵的视频（VOD）点播系统的资金不足，并且还算自主研发，跟外界如此的吹牛说！这个。。。:-(，其实，写这篇文章我还是很有压力的，从谈到的技术来看，一定有人认为我是江郎才尽吃老本了，翻些陈辞滥调出来充数，可见我是顶着很大的舆论压力来写这篇文字的。不过，我还真的觉得这个php托管技术应用场景应该还是可以拓展的，姑且分享下这个“烂”技术吧。</p>
<p>当时的需求是这样的，只有我们的收费会员才可以看到我们精心制作的外语教程，这个教程是花费了很大成本的原创教程，因此很珍贵。我们打算按照观看时长来消费，而视频的格式居然是flv，当时我们找寻了很多的视频点播解决方案，要么就是昂贵的服务器、播放器+独有加密格式的全套解决方案，要么就是不靠谱的VIP在线电影播放系统。<span id="more-1101"></span></p>
<p>经过很长时间的纠结和不断尝试以后，我们决定将视频教程切为5分钟一段，分段存储。然后使用php来托管组织这些零散的文件，播放器是网路上到处都是flv player，只是进行了一些优化和改进，好的，到了不得不解释下php托管是啥概念的时候了。哈！简单的说就是flv player不是直接播放我们提供的flv文件的地址，而是去请求一个php文件地址，这样我们就能在php中对访问进行分级限制和统计。为了防止用户从缓存中轻易的得到完整的教程文件，我们将其切为5分钟一段是很好的。代码大致是这样子的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//权限验证部分</span>
<span style="color: #666666; font-style: italic;">//……</span>
<span style="color: #666666; font-style: italic;">//逻辑处理，回写数据等操作</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Type: flv-application/octet-stream<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">readfile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'flv-file-path.flv'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>
是的，你不会大呼上当了吧？嘿嘿！核心代码着实就是这样子的，分级不是大家惯性的认为的R级、PG级、G级这样子分的哈！而是指的不同等级的VIP会员，例如白金级、黄金级的，php托管实际上就是用php作一个proxy，以便控制用户不能直接得到原始地址，这个和下载权限控制是一个道理的。
</p>
<p>本文不止是将Php托管技术，也不是单单的讲视频点播系统，而是讲一种综合解决方案，很低成本的基于php托管的视频点播业务分级系统。OK!这就是全部。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/heartbreak-for-php-probability-algorithm/" title="令人纠结的php几率算法问题 (06/24/2010)">令人纠结的php几率算法问题</a> (15)</li>
	<li><a href="http://www.zendstudio.net/archives/php-webservice-soap/" title="入门级的讲讲soap这个php webservice (07/28/2010)">入门级的讲讲soap这个php webservice</a> (3)</li>
	<li><a href="http://www.zendstudio.net/archives/get-the-newest-qqsign-from-api/" title="在网页中调用实现显示最新的QQ签名 PHP代码 (01/15/2008)">在网页中调用实现显示最新的QQ签名 PHP代码</a> (6)</li>
	<li><a href="http://www.zendstudio.net/archives/xinlang-editor-php-version/" title="新浪在线可视化web编辑器PHP版（08.02.27最新版） (11/02/2007)">新浪在线可视化web编辑器PHP版（08.02.27最新版）</a> (103)</li>
	<li><a href="http://www.zendstudio.net/archives/chinese-verification-code-by-php/" title="在PHP中实现中文汉字验证码 (07/25/2007)">在PHP中实现中文汉字验证码</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/vod-system-build-on-php-proxy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>萧瑟秋风今又是，换了人间</title>
		<link>http://www.zendstudio.net/archives/a-new-theme-for-zend-studio/</link>
		<comments>http://www.zendstudio.net/archives/a-new-theme-for-zend-studio/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 09:58:41 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[幸福]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1093</guid>
		<description><![CDATA[啊哈！经过几个周末艰苦卓绝的奋斗，ZendStudio.Net终于换上了新的主题（我现在就想围观）！真是一件大喜事啊。新的首页多出了一块快速导航，是的，别看现在没有什么内容，我是打算将有用的东西都填进去，这样来到zend studio的人就更快的各取所需了，这是一片和谐的土地，每个人来到这里都感到快乐（你甚至感到，即使在天上人间也没有这么快乐）。
同时，征集一下！你希望什么样的内容应该放在首页的快速导航区域？请给我留言。
新的样式来自Prower最初的设计，这里特别感谢Prower!之前我们有过邮件沟通，他很爽快的表示我可以修改使用他的神来之笔。再次的谢谢！如果没有这个我很喜欢的Prower V3主题，我想对于一个程序员来说，从头开始设计一款自己中意的WordPress主题，还是有些困难的，因为我真的没有学过设计，显然是会让我花费更多的时间，而不见得能取得既定成效的一项工作。
这也是我第一次制作（和修改有着本质的不同）wordpress主题，期间还是遇到了一些小小的阻碍的，幸好我知道该在哪里找到答案，也就顺利的解决问题了。在修改了部分的html结构以后，我也对css部分做了改动，但比较遗憾的是我放弃了使用html5结构，同时如果你使用IE6，也有可能打开的zend studio呈现给你的是凌乱不堪，抱歉了！我不支持IE6.
同时，卸载了诸多wp插件，那些插件大多是为了支持上一个主题的，现在似乎打开的速度也变快了一些，希望这能给你带来好的体验~
最后，非常感谢所有长期以来一直关注zend studio的朋友，谢谢你们！zend studio还将走下去，有你们的陪伴真是幸福！

	相关日志
	
	[转]让你每天幸福的十四个方法 (4)
	新年快乐 (0)


]]></description>
			<content:encoded><![CDATA[<p>啊哈！经过几个周末艰苦卓绝的奋斗，ZendStudio.Net终于换上了新的主题（<a href="http://www.zendstudio.net/" target="_blank">我现在就想围观</a>）！真是一件大喜事啊。新的首页多出了一块快速导航，是的，别看现在没有什么内容，我是打算将有用的东西都填进去，这样来到zend studio的人就更快的各取所需了，这是一片和谐的土地，每个人来到这里都感到快乐（你甚至感到，即使在天上人间也没有这么快乐）。</p>
<p><strong>同时，征集一下！你希望什么样的内容应该放在首页的快速导航区域？请给我留言。</strong></p>
<p>新的样式来自Prower最初的设计，这里特别感谢<a href="http://www.prower.cn/">Prower</a>!之前我们有过邮件沟通，他很爽快的表示我可以修改使用他的神来之笔。再次的谢谢！如果没有这个我很喜欢的Prower V3主题，我想对于一个程序员来说，从头开始设计一款自己中意的WordPress主题，还是有些困难的，因为我真的没有学过设计，显然是会让我花费更多的时间，而不见得能取得既定成效的一项工作。</p>
<p>这也是我第一次制作（和修改有着本质的不同）wordpress主题，期间还是遇到了一些小小的阻碍的，幸好我知道该在哪里找到答案，也就顺利的解决问题了。在修改了部分的html结构以后，我也对css部分做了改动，但比较遗憾的是我放弃了使用html5结构，同时如果你使用IE6，也有可能打开的zend studio呈现给你的是凌乱不堪，<strong>抱歉了！我不支持IE6</strong>.</p>
<p>同时，卸载了诸多wp插件，那些插件大多是为了支持上一个主题的，现在似乎打开的速度也变快了一些，希望这能给你带来好的体验~</p>
<p>最后，非常感谢所有长期以来一直关注zend studio的朋友，谢谢你们！zend studio还将走下去，有你们的陪伴真是幸福！</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/happy-every-day-from-14-methods/" title="[转]让你每天幸福的十四个方法 (03/08/2008)">[转]让你每天幸福的十四个方法</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/happy-new-year-2010/" title="新年快乐 (02/07/2010)">新年快乐</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/a-new-theme-for-zend-studio/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>真正找资料的人都是用google</title>
		<link>http://www.zendstudio.net/archives/google-is-the-real-search-engine/</link>
		<comments>http://www.zendstudio.net/archives/google-is-the-real-search-engine/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 15:27:48 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1080</guid>
		<description><![CDATA[我甚至成了一个G粉，在上一篇文字《谷歌真的不带我们玩儿了么？》中，我提到我所使用的google服务，是的，我有点离不开她们。就像我始终离不开dropbox的云存储服务一样。
欣闻前些日子《谷歌通过了ICP牌照》（这当然和唐先生最终还是拿到了加州理工学院的博士迥然不同），这让我们感到，谷歌依然在我们身边，后来推出的google 加密搜索https://encrypted.google.com/webhp?hl=zh-CN ，也让我们搜索不再撞墙，出现连接被重置的现象大大改善（实际上还有个好用的办法访问google加密搜索——通过 http://www.ggssl.com/ ），google又变的好用了起来。
程序员总是需要很多很多的科学资料（其他学科应该也一样吧），同时知识又在突飞猛进，这就不得不让我们不断的学习掌握新知识，搜索引擎就是学习的一个必要工具，而有些无良商人为了钱，活生生用竞价排名来让你搜广告，那不是搜索引擎，那是广告联盟。只有google找到的东西还他妈算个东西，所以，你真的学习，真的想掌握科学知识，还是用google作为你的搜索引擎吧。衷心 的希望大家能找到真正自己想要的东西，而不是让广告遮蔽了你的双眼。
题外的话：本站即将要进行一次换皮，新的主题还在制作之中，但很快就要做好了，先放个截图出来给大伙儿先睹为快一下，这里特别感谢Prower。


	相关日志
	
	谷歌真不带我们玩儿了么？ (4)
	狗日的腾讯 (5)
	2009年的上班开始了 (0)


]]></description>
			<content:encoded><![CDATA[<p>我甚至成了一个G粉，在上一篇文字《<a href="http://www.zendstudio.net/archives/google-had-left/">谷歌真的不带我们玩儿了么</a>？》中，我提到我所使用的google服务，是的，我有点离不开她们。就像我始终离不开dropbox的云存储服务一样。</p>
<p>欣闻前些日子《<a href="http://www.williamlong.info/archives/2237.html">谷歌通过了ICP牌照</a>》（这当然和<a href="http://zh.wikipedia.org/zh-cn/%E5%94%90%E9%AA%8F">唐先生</a>最终还是拿到了加州理工学院的博士迥然不同），这让我们感到，谷歌依然在我们身边，后来推出的google 加密搜索<a href="https://encrypted.google.com/webhp?hl=zh-CN">https://encrypted.google.com/webhp?hl=zh-CN</a> ，也让我们搜索不再撞墙，出现连接被重置的现象大大改善（实际上还有个好用的办法访问google加密搜索——通过 <a href="http://www.ggssl.com">http://www.ggssl.com</a>/ ），google又变的好用了起来。</p>
<p>程序员总是需要很多很多的科学资料（其他学科应该也一样吧），同时知识又在突飞猛进，这就不得不让我们不断的学习掌握新知识，搜索引擎就是学习的一个必要工具，而有些无良商人为了钱，活生生用竞价排名来让你搜广告，那不是搜索引擎，那是广告联盟。只有google找到的东西还他妈算个东西，所以，你真的学习，真的想掌握科学知识，还是用google作为你的搜索引擎吧。衷心 的希望大家能找到真正自己想要的东西，而不是让广告遮蔽了你的双眼。<span id="more-1080"></span></p>
<p>题外的话：本站即将要进行一次换皮，新的主题还在制作之中，但很快就要做好了，先放个截图出来给大伙儿先睹为快一下，这里特别感谢Prower。</p>
<p><a href="http://www.zendstudio.net/wp-content/uploads/2010/07/new-zendstudio-themes.png"><img class="aligncenter size-full wp-image-1081" title="new-zendstudio-themes" src="http://www.zendstudio.net/wp-content/uploads/2010/07/new-zendstudio-themes.png" alt="新版zend studio主题的截图" width="513" height="324" /></a></p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/google-had-left/" title="谷歌真不带我们玩儿了么？ (03/24/2010)">谷歌真不带我们玩儿了么？</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/%e7%8b%97%e6%97%a5%e7%9a%84%e8%85%be%e8%ae%af/" title="狗日的腾讯 (07/26/2010)">狗日的腾讯</a> (5)</li>
	<li><a href="http://www.zendstudio.net/archives/2009-works-has-started/" title="2009年的上班开始了 (02/08/2009)">2009年的上班开始了</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/google-is-the-real-search-engine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[重要]zend studio现安全漏洞</title>
		<link>http://www.zendstudio.net/archives/zend-studio-location-cross/</link>
		<comments>http://www.zendstudio.net/archives/zend-studio-location-cross/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 05:36:38 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[zendstudio]]></category>
		<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1074</guid>
		<description><![CDATA[这是国内的安全界牛人Saiy发现的zend studio的代码提示功能存在安全缺陷，从代码来看，本漏洞在windows下的zend studio 6.0以上发行版本显得更为令人恐惧！在zend studio代码注释中植入脚本，则在下一次的提示中会被执行！
详情参见：http://80vul.com/Zend%20studio/Zend%20studio%20location%20Cross.htm
Zend 官方目前没有对此提供修复方案,zendstudio.net提醒各位phper，在打开不受信任的代码之前，请暂时关闭zend studio的代码自动提示功能。否则，您并不需要感到惊慌，除非你自己想要整死自己。

	相关日志
	
	ZendStudio 下载(含注册机) 最新版(5.5.0a.270) (4)
	Zend studio视频教程(1)——项目管理和服务器调试 (25)
	目前国内使用zend studio版本的分布情况调查结果 (6)
	给初学者：Zend Studio 不是全部 (11)
	Zend Studio for Eclipse 6.0 在线注册机测试地址 (10)


]]></description>
			<content:encoded><![CDATA[<p>这是国内的安全界牛人Saiy发现的zend studio的代码提示功能存在安全缺陷，从代码来看，本漏洞在windows下的zend studio 6.0以上发行版本显得更为令人恐惧！在zend studio代码注释中植入脚本，则在下一次的提示中会被执行！</p>
<p>详情参见：<a href="http://80vul.com/Zend%20studio/Zend%20studio%20location%20Cross.htm">http://80vul.com/Zend%20studio/Zend%20studio%20location%20Cross.htm</a></p>
<p>Zend 官方目前没有对此提供修复方案,zendstudio.net提醒各位phper，在打开不受信任的代码之前，请暂时关闭zend studio的代码自动提示功能。否则，您并不需要感到惊慌，除非你自己想要整死自己。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/zend-studio-550-download-page/" title="ZendStudio 下载(含注册机) 最新版(5.5.0a.270) (01/28/2007)">ZendStudio 下载(含注册机) 最新版(5.5.0a.270)</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/zendstudio-video-tutorial-1/" title="Zend studio视频教程(1)——项目管理和服务器调试 (01/05/2009)">Zend studio视频教程(1)——项目管理和服务器调试</a> (25)</li>
	<li><a href="http://www.zendstudio.net/archives/the-vote-result-of-zend-studio-version/" title="目前国内使用zend studio版本的分布情况调查结果 (06/11/2009)">目前国内使用zend studio版本的分布情况调查结果</a> (6)</li>
	<li><a href="http://www.zendstudio.net/archives/the-zend-studio-is-not-part-of-learn-the-php/" title="给初学者：Zend Studio 不是全部 (05/05/2010)">给初学者：Zend Studio 不是全部</a> (11)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-for-eclipse-6x-online-keygen-url/" title="Zend Studio for Eclipse 6.0 在线注册机测试地址 (04/13/2008)">Zend Studio for Eclipse 6.0 在线注册机测试地址</a> (10)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/zend-studio-location-cross/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>360软件管家通信协议分析</title>
		<link>http://www.zendstudio.net/archives/360-softmanager-http-protocol/</link>
		<comments>http://www.zendstudio.net/archives/360-softmanager-http-protocol/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 12:29:10 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[JS/DIV/CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[360]]></category>
		<category><![CDATA[360安全卫士]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1068</guid>
		<description><![CDATA[曾经说过360利用云计算打压竞争对手的事情，今日一改往事之郁闷，我专门来篇文章夸奖下360安全卫士。咳咳！今天不完全是写360安全卫士的，我喜欢其中的一个叫做软件管家的功能，坦白说，我有点喜欢新软件，喜欢没事升级升级，尤其是chrome，一有新版本出来，我立马升级，好不含糊！国内这种软件管家很多的，不过我个人觉得360软件管家速度比较快。这点上，360的软件管家立功了，因为公司强制每台机器必须安装360，所以在公司，软件升级这很轻松，可是家里电脑我不想安装这玩意儿，于是我想，我只要弄到我想要升级的软件URL不就可以下载了么？基于这么一点朴素的想法，我就打算分析下360软件管家是通信协议是啥？
随便弄一个抓包工具，比如Wireshark，一看，原来是HTTP协议，这样的话实际上可以用我以前介绍的神器-Fiddler来分析更简单。经过一段时间的抓包，有了一点比较笨的思路：先通过关键字定位到想要的软件，然后获得该软件的ID，再查询一次，得到下载地址。比较有用的数据是这样子的：

GET http://soft.360.cn/baoku/index.php?c=Search&#38;a=getSoftList&#38;cver=v1&#38;kw=91&#38;appver=2.6.1.1004&#38;uid=1&#38;pid=h_home&#38;m=da13c0cdf6109a3c58e0e378826fd01c HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E)
Host: soft.360.cn
Connection: Keep-Alive
Pragma: no-cache
Cookie: B=ID=497891276160941:V=2:S=41529b7136

看请求部分，GET的几个传值kw是搜索关键字，就是在360软件管家界面搜索框中输入的东西，appver很明显就是软件管家的版本号，不用理会，m是一个固定串不知道是否和机器相关，目前这部分都没有做校检，保持不变即可，另外服务端也没有检测Cookie，所以上面的请求Cookie也可以不用修改，只要修改kw后面的内容即可.
返回的格式是这样的：

&#60;?xml version=&#34;1.0&#34; encoding=&#34;gbk&#34; ?&#62; 
&#60;ret&#62;
&#60;retinfo/&#62;
&#60;softs title=&#34;&#34;&#62;
&#60;soft&#62;
&#60;id&#62;103326&#60;/id&#62;
&#60;os&#62;Win7/Vista/Win2003/WinXP/Win2000/WinNT/WinME/Win9x&#60;/os&#62;
&#60;ver&#62;1.12.1.109625&#60;/ver&#62;
&#60;surl&#62;
http://soft.360.cn/static/baoku/info_5_0/softinfo_103326.html
&#60;/surl&#62;
−
&#60;logo&#62;
http://img.360.cn/images/2008/360baoku/logo2/91Divine2.png
&#60;/logo&#62;
&#60;size&#62;51818131&#60;/size&#62;
&#60;free&#62;2&#60;/free&#62;
&#60;brief&#62;一款由网龙公司自主研发的免费算命软件。知命而...&#60;/brief&#62;
&#60;ptime&#62;2010-07-01&#60;/ptime&#62;
&#60;bname&#62;91算命&#60;/bname&#62;
&#60;vname&#62;91算命 1.12.1&#60;/vname&#62;
&#60;plugin&#62;2&#60;/plugin&#62;
&#60;/soft&#62;
&#60;/softs&#62;
&#60;/ret&#62;

就是个标准的XML了，如果软件的版本比你安装的新，就可以考虑下载了哈！ID已经包含在上面的XML里面了，下面再进行一个请求，获得指定软件ID的下载地址，RAW数据是这样子的：

GET http://q.soft.360.cn/get_download_url.php?type=download_url&#38;soft_ids=10149&#38;appver=2.6.1.1004&#38;uid=1&#38;pid=h_home&#38;m=da13c0cdf6109a3c58e0e378826fd01c HTTP/1.1
Accept: */*
Accept-Encoding: gzip, [...]]]></description>
			<content:encoded><![CDATA[<p>曾经说过<a href="http://www.zendstudio.net/archives/cloud-computing-with-chinese-characteristics/">360利用云计算打压竞争对手</a>的事情，今日一改往事之郁闷，我专门来篇文章夸奖下360安全卫士。咳咳！今天不完全是写360安全卫士的，我喜欢其中的一个叫做软件管家的功能，坦白说，我有点喜欢新软件，喜欢没事升级升级，尤其是chrome，一有新版本出来，我立马升级，好不含糊！国内这种软件管家很多的，不过我个人觉得360软件管家速度比较快。这点上，360的软件管家立功了，因为公司强制每台机器必须安装360，所以在公司，软件升级这很轻松，可是家里电脑我不想安装这玩意儿，于是我想，我只要弄到我想要升级的软件URL不就可以下载了么？基于这么一点朴素的想法，我就打算分析下360软件管家是通信协议是啥？<span id="more-1068"></span></p>
<p>随便弄一个抓包工具，比如Wireshark，一看，原来是HTTP协议，这样的话实际上可以用<a href="http://www.zendstudio.net/archives/recommend-the-use-of-fiddler/">我以前介绍的神器-Fiddler</a>来分析更简单。经过一段时间的抓包，有了一点比较笨的思路：<strong>先通过关键字定位到想要的软件，然后获得该软件的ID，再查询一次，得到下载地址</strong>。比较有用的数据是这样子的：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">GET http://soft.360.cn/baoku/index.php?c=Search<span style="color: #ddbb00;">&amp;a=getSoftList&amp;cver=v1&amp;kw=91&amp;appver=2.6.1.1004&amp;uid=1&amp;pid=h_home&amp;m=da13c0cdf6109a3c58e0e378826fd01c HTTP/1.1</span>
<span style="color: #ddbb00;">Accept: */*</span>
<span style="color: #ddbb00;">Accept-Encoding: gzip, deflate</span>
<span style="color: #ddbb00;">User-Agent: Mozilla/4.0 (compatible;</span> MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E)
Host: soft.360.cn
Connection: Keep-Alive
Pragma: no-cache
Cookie: B=ID=497891276160941:V=2:S=41529b7136</pre></div></div>

<p>看请求部分，GET的几个传值kw是搜索关键字，就是在360软件管家界面搜索框中输入的东西，appver很明显就是软件管家的版本号，不用理会，m是一个固定串不知道是否和机器相关，目前这部分都没有做校检，保持不变即可，另外服务端也没有检测Cookie，所以上面的请求Cookie也可以不用修改，只要修改kw后面的内容即可.<br />
返回的格式是这样的：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;gbk&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;retinfo</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;softs</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;soft<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>103326<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;os<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Win7/Vista/Win2003/WinXP/Win2000/WinNT/WinME/Win9x<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/os<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ver<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.12.1.109625<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ver<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;surl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
http://soft.360.cn/static/baoku/info_5_0/softinfo_103326.html
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/surl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
−
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
http://img.360.cn/images/2008/360baoku/logo2/91Divine2.png
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>51818131<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;free<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/free<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;brief<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>一款由网龙公司自主研发的免费算命软件。知命而...<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/brief<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ptime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2010-07-01<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ptime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>91算命<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>91算命 1.12.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/soft<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/softs<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>就是个标准的XML了，如果软件的版本比你安装的新，就可以考虑下载了哈！ID已经包含在上面的XML里面了，下面再进行一个请求，获得指定软件ID的下载地址，RAW数据是这样子的：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">GET http://q.soft.360.cn/get_download_url.php?type=download_url<span style="color: #ddbb00;">&amp;soft_ids=10149&amp;appver=2.6.1.1004&amp;uid=1&amp;pid=h_home&amp;m=da13c0cdf6109a3c58e0e378826fd01c HTTP/1.1</span>
<span style="color: #ddbb00;">Accept: */*</span>
<span style="color: #ddbb00;">Accept-Encoding: gzip, deflate</span>
<span style="color: #ddbb00;">User-Agent: Mozilla/4.0 (compatible;</span> MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E)
Host: q.soft.360.cn
Connection: Keep-Alive
Pragma: no-cache
Cookie: B=ID=497891276160941:V=2:S=41529b7136</pre></div></div>

<p>这就不解释了哈，从服务端返回的数据是这样子的：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;gbk&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span> 
- <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;retinfo</span> <span style="color: #000066;">code</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">msg</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">total</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">success</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">empty</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
- <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;softs<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
- <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;soft<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pnum<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/pnum<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10149<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;os<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Win7/Vista/Win2003/WinXP/Win2000/WinNT/WinME/Win9x<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/os<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ver<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.8.2.126<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ver<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>38735006<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>91手机助手 for iPhone 2.8.2.126<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
- <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;durls<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
- <span style="color: #339933;">&lt;![CDATA[ pdown://p2=301DBDF56E9D9DE308244E5967248D82C7FAE017|p3=20|p4=4800|p5=6|h1=10149_109492|h3=120|h7=5|b5=360软件管理|b6=91手机助手 for iPhone 2.8.2.126|b7=1|http://softdl1.360.cn/91assistant/91assistant_iphone_2.8.2.126.exe;http://softdl4.360.cn/91assistant/91assistant_iphone_2.8.2.126.exe</span>
<span style="color: #339933;">  ]]&gt;</span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/durls<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
- <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
- <span style="color: #339933;">&lt;![CDATA[ 91手机助手 for iPhone_2.8.2.126.exe</span>
<span style="color: #339933;">  ]]&gt;</span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/soft<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/softs<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>呃。。。。上下数据不配套哈！！不过没有关系，这并不影响讲解，看到上面xml的durls了么？那就是华丽的下载地址哈，这里我们也明白了为什么360软件管家下载的比别人快了吧？它有自己的N台加速服务器，而官方的原始下载链接通常被放在最后面，显然优先级是最低的。至于前面pdown://p2这样子的地址猜测是P2P下载用的，可以不用理会。<br />
到这里就完全OK了，你可以用任何语言来写一个客户端，这样可以不用安装庞大的360安全卫士了！最后，我想说下：本文纯属闲的蛋疼、消遣作乐、学习研究之目的而撰，并没有任何商业企图或者阴谋攻击之成分。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/a-boring-records/" title="八卦+闲扯 两句 -中毒后的最专业解决方案 (07/17/2007)">八卦+闲扯 两句 -中毒后的最专业解决方案</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/web-game-and-360-safe-browser/" title="网页游戏与360浏览器 (05/31/2010)">网页游戏与360浏览器</a> (7)</li>
	<li><a href="http://www.zendstudio.net/archives/cloud-computing-with-chinese-characteristics/" title="有中国特色的云计算正在建设中 (05/28/2010)">有中国特色的云计算正在建设中</a> (6)</li>
	<li><a href="http://www.zendstudio.net/archives/360safe-is-narcissistic/" title="360安全卫士严重存在自恋倾向 (08/02/2007)">360安全卫士严重存在自恋倾向</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/360-softmanager-http-protocol/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>php数组的字符型索引是否应该遵循变量命名规则？</title>
		<link>http://www.zendstudio.net/archives/use-string-as-php-array-index/</link>
		<comments>http://www.zendstudio.net/archives/use-string-as-php-array-index/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 06:18:24 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[数组]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1061</guid>
		<description><![CDATA[这个问题对于大牛们来说，也许根本就不是个问题，我在以前的项目里，对于php数组中的所有的字符型索引（下标）都是采用变量的命名规则，即不使用关键字，不以数字开头，只包含大小写字母、数字和下划线，慢慢的这都快形成一个定势（思维定势是一件可怕的事情），然而在当下的项目中，语言包文件的数组，其字符索引形态万千，百花齐放。这让我颇不适应，就在我打算将其作为BUG提交上去的时候，QA以及外网内测数据反馈回来了，都没有在语言包这里出问题。我勒个擦！PHP的数组到底是怎么个回事？
今天，趁项目暂时不用冒烟赶进度的上来look look，总算是有些弄清楚这个问题了，这里要特别感谢鸟哥的数篇PHP内核级文章，例如：《PHP中的Hash算法》、《深入理解PHP之数组(遍历顺序)》等等。先来段测试代码：

&#60;?php
$arr = array&#40; 'te4 x' =&#62; 123,
		  'te4 ' =&#62; 456,
		  ' tes' =&#62; 88,
		  '4' =&#62; 77,
		  4 =&#62; &#34;xoo&#34;,
		  '4 ' =&#62; &#34;TMD&#34;,
		  ' 4' =&#62; &#34;yours&#34;,
		  '4test' =&#62; '9981',
		  ' ' =&#62; &#34;KG！&#34;,
		  '  ' =&#62; 'RR',
		  'backpack,2cell' =&#62; '无语',
		 [...]]]></description>
			<content:encoded><![CDATA[<p>这个问题对于大牛们来说，也许根本就不是个问题，我在以前的项目里，对于php数组中的所有的字符型索引（下标）都是采用变量的命名规则，即不使用关键字，不以数字开头，只包含大小写字母、数字和下划线，慢慢的这都快形成一个定势（思维定势是一件可怕的事情），然而在当下的项目中，语言包文件的数组，其字符索引形态万千，百花齐放。这让我颇不适应，就在我打算将其作为BUG提交上去的时候，QA以及外网内测数据反馈回来了，都没有在语言包这里出问题。我勒个擦！PHP的数组到底是怎么个回事？<span id="more-1061"></span></p>
<p>今天，趁项目暂时不用冒烟赶进度的上来look look，总算是有些弄清楚这个问题了，这里要特别感谢<a href="http://www.laruence.com/">鸟哥</a>的数篇PHP内核级文章，例如：《<a href="http://www.laruence.com/2009/07/23/994.html">PHP中的Hash算法</a>》、《<a href="http://www.laruence.com/2009/08/23/1065.html">深入理解PHP之数组(遍历顺序)</a>》等等。先来段测试代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'te4 x'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">123</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'te4 '</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">456</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">' tes'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">88</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'4'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">77</span><span style="color: #339933;">,</span>
		  <span style="color: #cc66cc;">4</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;xoo&quot;</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'4 '</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;TMD&quot;</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">' 4'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;yours&quot;</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'4test'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'9981'</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">' '</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;KG！&quot;</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'  '</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'RR'</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'backpack,2cell'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'无语'</span><span style="color: #339933;">,</span>
		  <span style="color: #0000ff;">'您真的不想再说'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'O(∩_∩)O哈哈哈~，就这样吧~'</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arr</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$k</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$v</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$k</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arr</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>输出结果中，除了索引&#8217;4&#8242;和4被合并了以外，其他的数组均正常！查了下鸟哥的关于PHP数组的分析，关键位置大概是在以下的代码中：</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span> bucket <span style="color: #008000;">&#123;</span>
ulong h<span style="color: #008080;">;</span>                        <span style="color: #ff0000; font-style: italic;">/* 数字索引/hash值 */</span>
uint nKeyLength<span style="color: #008080;">;</span>                <span style="color: #ff0000; font-style: italic;">/* 字符索引的长度 */</span>
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>pData<span style="color: #008080;">;</span>                    <span style="color: #ff0000; font-style: italic;">/* 数据 */</span>
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>pDataPtr<span style="color: #008080;">;</span>                 <span style="color: #ff0000; font-style: italic;">/* 数据指针 */</span>
<span style="color: #0000ff;">struct</span> bucket <span style="color: #000040;">*</span>pListNext<span style="color: #008080;">;</span>               <span style="color: #ff0000; font-style: italic;">/* 下一个元素, 用于线性遍历 */</span>
<span style="color: #0000ff;">struct</span> bucket <span style="color: #000040;">*</span>pListLast<span style="color: #008080;">;</span>       <span style="color: #ff0000; font-style: italic;">/* 上一个元素, 用于线性遍历 */</span>
<span style="color: #0000ff;">struct</span> bucket <span style="color: #000040;">*</span>pNext<span style="color: #008080;">;</span>                   <span style="color: #ff0000; font-style: italic;">/* 处于同一个拉链中的下一个元素 */</span>
<span style="color: #0000ff;">struct</span> bucket <span style="color: #000040;">*</span>pLast<span style="color: #008080;">;</span>                   <span style="color: #ff0000; font-style: italic;">/* 处于同一拉链中的上一个元素 */</span>
<span style="color: #0000ff;">char</span> arKey<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #ff0000; font-style: italic;">/* 节省内存,方便初始化的技巧 */</span>
<span style="color: #008000;">&#125;</span> Bucket<span style="color: #008080;">;</span></pre></div></div>

<p>鸟哥在文章中提到：</p>
<blockquote><p>
h是元素的Hash值,对于数字索引的元素,h为直接索引值(通过nKeyLength=0来表示是数字索引).而对于字符串索引来说, 索引值保存在arKey中, 索引的长度保存在nKeyLength中.
</p></blockquote>
<p>因此，PHP的字符型索引是作为字符串存储在arKey中，而这和变量没有任何关系，使用任何字符都没有关系，都可以正常被读写。除非我们需要使用extract或者类似的功能需要将PHP数组的字符型索引转换成PHP变量，否则，可以将其设置为任意的字符串，并没有太多的坏处。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/chinese-verification-code-by-php/" title="在PHP中实现中文汉字验证码 (07/25/2007)">在PHP中实现中文汉字验证码</a> (4)</li>
	<li><a href="http://www.zendstudio.net/archives/notice-about-strpos-function-in-php/" title="php函数strpos另外一个需要注意的地方 (06/05/2010)">php函数strpos另外一个需要注意的地方</a> (3)</li>
	<li><a href="http://www.zendstudio.net/archives/regular-rule-1/" title="正则表达式示例——除了佛经就是这个语法最晦涩难懂了 (07/30/2007)">正则表达式示例——除了佛经就是这个语法最晦涩难懂了</a> (2)</li>
	<li><a href="http://www.zendstudio.net/archives/php-header-function-examples/" title="PHP header() examples -完整代码 (01/29/2007)">PHP header() examples -完整代码</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/have4-guestbook-source-download/" title="有事留言本(have4)2.0 下载 (08/01/2007)">有事留言本(have4)2.0 下载</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/use-string-as-php-array-index/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>php的callback类型小记</title>
		<link>http://www.zendstudio.net/archives/php-function-callback-type/</link>
		<comments>http://www.zendstudio.net/archives/php-function-callback-type/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 08:36:52 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[callback]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1057</guid>
		<description><![CDATA[很早以前在学习session的时候，其中有个session_set_save_handler()方法可以自定义session读写、销毁、回收动作，也就是通过这个方法实现将session保存进数据库的。当然，大多数时候看到的代码是定义几个函数：function sess_open(){} function sess_close(){}……，然后使用session_set_save_handler()将前面的函数名一一对应起来，这里是用字符串来表示函数名的。这就是php的callback类型，这是php4时代的写法，在php5和php面向对象编程迅速流行起来以后，在callback这里起了一点点的变化，我们看到了使用数组,即形如：session_set_save_handler( array( &#8217;session_cls&#8217;, &#8216;open&#8217; ), array( &#8217;session_cls&#8217;, &#8216;close&#8217; ), array( &#8217;session_cls&#8217;, &#8216;read&#8217; ), array( &#8217;session_cls&#8217;, &#8216;write&#8217; ), array( &#8217;session_cls&#8217;, &#8216;destroy&#8217; ), array( &#8217;session_cls&#8217;, &#8216;gc&#8217; ) )，明显多出一个类名，并且随着我阅读的优秀的开源项目的代码越来越多，这种callback的调用形式越发频繁，到后来就干脆全是这样子的了。
我并没有去深究这个东西，只是觉得略微不适应，看的多了也就懂了，还有很多的插件机制里的call_user_func()，call_user_func_array() ，写的时候有些依样画葫芦的意思，因为结果是正确的，企图翻阅php手册无果，便上google 百度了一把，功夫不负有心人，不负有心人！找到了颇为有力的确切说明，示例代码如下：

&#60;?php
// An example callback function
function my_callback_function&#40;&#41; &#123;
    echo 'hello world!';
&#125;
&#160;
// An example callback method
class MyClass &#123;
    function myCallbackMethod&#40;&#41; &#123;
 [...]]]></description>
			<content:encoded><![CDATA[<p>很早以前在学习session的时候，其中有个<a href="http://cn2.php.net/manual/en/function.session-set-save-handler.php">session_set_save_handler()</a>方法可以自定义session读写、销毁、回收动作，也就是通过这个方法实现将session保存进数据库的。当然，大多数时候看到的代码是定义几个函数：function sess_open(){} function sess_close(){}……，然后使用session_set_save_handler()将前面的函数名一一对应起来，这里是用字符串来表示函数名的。这就是php的callback类型，这是php4时代的写法，在php5和php面向对象编程迅速流行起来以后，在callback这里起了一点点的变化，我们看到了使用数组,即形如：session_set_save_handler( array( &#8217;session_cls&#8217;, &#8216;open&#8217; ), array( &#8217;session_cls&#8217;, &#8216;close&#8217; ), array( &#8217;session_cls&#8217;, &#8216;read&#8217; ), array( &#8217;session_cls&#8217;, &#8216;write&#8217; ), array( &#8217;session_cls&#8217;, &#8216;destroy&#8217; ), array( &#8217;session_cls&#8217;, &#8216;gc&#8217; ) )，明显多出一个类名，并且随着我阅读的优秀的开源项目的代码越来越多，这种callback的调用形式越发频繁，到后来就干脆全是这样子的了。<span id="more-1057"></span></p>
<p>我并没有去深究这个东西，只是觉得略微不适应，看的多了也就懂了，还有很多的插件机制里的<a href="http://cn2.php.net/manual/en/function.call-user-func.php">call_user_func()</a>，<a href="http://cn2.php.net/manual/en/function.call-user-func-array.php">call_user_func_array()</a> ，写的时候有些依样画葫芦的意思，因为结果是正确的，企图翻阅php手册无果，便上google 百度了一把，功夫不负有心人，不负有心人！找到了颇为有力的确切说明，示例代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// An example callback function</span>
<span style="color: #000000; font-weight: bold;">function</span> my_callback_function<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'hello world!'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// An example callback method</span>
<span style="color: #000000; font-weight: bold;">class</span> MyClass <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> myCallbackMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hello World!'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Type 1: Simple callback</span>
<span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'my_callback_function'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Type 2: Static class method call</span>
<span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MyClass'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'myCallbackMethod'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Type 3: Object method call</span>
<span style="color: #000088;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'myCallbackMethod'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>居然还是来自php手册，搜索我还是习惯谷歌啊。是的，从上面的代码可以看出，callback类型可以是一个字符串表示的函数名，可以是一个数组包括类名和方法名，还可以是一个实例化了的对象和方法名。挺灵活，艾哈！今日的知识虽然显得“很是陈旧”，但还是让我豁然开朗，找到确切的答案真是一件让人痛快的事情！</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/php-code-of-lunarcalendar/" title="博大精深的农历算法PHP代码 (04/10/2008)">博大精深的农历算法PHP代码</a> (3)</li>
	<li><a href="http://www.zendstudio.net/archives/notice-about-strpos-function-in-php/" title="php函数strpos另外一个需要注意的地方 (06/05/2010)">php函数strpos另外一个需要注意的地方</a> (3)</li>
	<li><a href="http://www.zendstudio.net/archives/special-error-report-level-by-ip/" title="根据IP地址设置不同错误报告级别 (04/24/2010)">根据IP地址设置不同错误报告级别</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/regular-rule-1/" title="正则表达式示例——除了佛经就是这个语法最晦涩难懂了 (07/30/2007)">正则表达式示例——除了佛经就是这个语法最晦涩难懂了</a> (2)</li>
	<li><a href="http://www.zendstudio.net/archives/php-ob-prefix-functions/" title="php输出控制函数——ob系列的几个区别 (11/25/2007)">php输出控制函数——ob系列的几个区别</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/php-function-callback-type/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 2.175 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-07-31 17:13:18 -->
<!-- Compression = gzip -->