<?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 &#187; PHP</title>
	<atom:link href="http://www.zendstudio.net/category/php/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下载页面已经统一提供各版本的下载。

	相关日志
	
	[调查]你目前使用的zend studio版本是？ (5)
	zend studio 5.5无法打开主界面故障解决方法一例 (2)
	zend studio使用中的常见问题专门收集 (10)
	[重要]zend studio现安全漏洞 (1)
	给初学者：Zend Studio 不是全部 (11)


]]></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/the-zend-studio-version-vote/" title="[调查]你目前使用的zend studio版本是？ (05/02/2009)">[调查]你目前使用的zend studio版本是？</a> (5)</li>
	<li><a href="http://www.zendstudio.net/archives/zde_can_not_open/" title="zend studio 5.5无法打开主界面故障解决方法一例 (03/12/2008)">zend studio 5.5无法打开主界面故障解决方法一例</a> (2)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-faq-special-post/" title="zend studio使用中的常见问题专门收集 (04/30/2009)">zend studio使用中的常见问题专门收集</a> (10)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-location-cross/" title="[重要]zend studio现安全漏洞 (07/12/2010)">[重要]zend studio现安全漏洞</a> (1)</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>
</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/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/pea-of-fuzhou-barbecue-activities-pictures/" title="福州PEA烧烤交流活动照片(组图) (11/05/2007)">福州PEA烧烤交流活动照片(组图)</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/a-good-adsense-system/" title="php广告系统应该具备哪些功能才是一个好用的广告系统 (04/09/2009)">php广告系统应该具备哪些功能才是一个好用的广告系统</a> (3)</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/heartbreak-for-php-probability-algorithm/" title="令人纠结的php几率算法问题 (06/24/2010)">令人纠结的php几率算法问题</a> (15)</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>基于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向MYSQL中插入图片、二进制文件 (4)
	在PHP中实现中文汉字验证码 (4)
	接触伟大的jquery -优雅的JS库 (0)
	令人纠结的php几率算法问题 (15)
	根据IP地址设置不同错误报告级别 (0)


]]></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/insert-binary-data-to-mysq/" title="用PHP向MYSQL中插入图片、二进制文件 (10/14/2007)">用PHP向MYSQL中插入图片、二进制文件</a> (4)</li>
	<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/marry-the-jquery/" title="接触伟大的jquery -优雅的JS库 (09/13/2007)">接触伟大的jquery -优雅的JS库</a> (0)</li>
	<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/special-error-report-level-by-ip/" title="根据IP地址设置不同错误报告级别 (04/24/2010)">根据IP地址设置不同错误报告级别</a> (0)</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还将走下去，有你们的陪伴真是幸福！

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


]]></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-new-year-2010/" title="新年快乐 (02/07/2010)">新年快乐</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/happy-every-day-from-14-methods/" title="[转]让你每天幸福的十四个方法 (03/08/2008)">[转]让你每天幸福的十四个方法</a> (4)</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>[重要]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的代码自动提示功能。否则，您并不需要感到惊慌，除非你自己想要整死自己。

	相关日志
	
	zend studio使用中的常见问题专门收集 (10)
	zend studio 使用中常遇见的问题已整理发布 (4)
	Zend Studio教程 (0)
	zend studio 6.1集成php手册之完全解决方案 (32)
	zend studio总是不好用？试试NB吧 (34)


]]></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-faq-special-post/" title="zend studio使用中的常见问题专门收集 (04/30/2009)">zend studio使用中的常见问题专门收集</a> (10)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-faq-is-posted/" title="zend studio 使用中常遇见的问题已整理发布 (06/28/2009)">zend studio 使用中常遇见的问题已整理发布</a> (4)</li>
	<li><a href="http://www.zendstudio.net/zend-studio-tutorial/" title="Zend Studio教程 (04/15/2009)">Zend Studio教程</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/php-manual-integrated-into-zend-studio/" title="zend studio 6.1集成php手册之完全解决方案 (07/02/2009)">zend studio 6.1集成php手册之完全解决方案</a> (32)</li>
	<li><a href="http://www.zendstudio.net/archives/netbeans-introduction/" title="zend studio总是不好用？试试NB吧 (12/13/2009)">zend studio总是不好用？试试NB吧</a> (34)</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/cloud-computing-with-chinese-characteristics/" title="有中国特色的云计算正在建设中 (05/28/2010)">有中国特色的云计算正在建设中</a> (6)</li>
	<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/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/heartbreak-for-php-probability-algorithm/" title="令人纠结的php几率算法问题 (06/24/2010)">令人纠结的php几率算法问题</a> (15)</li>
	<li><a href="http://www.zendstudio.net/archives/php-time-zone-set/" title="在php中让用户自定义时区 正确显示当前时间 (03/02/2008)">在php中让用户自定义时区 正确显示当前时间</a> (1)</li>
	<li><a href="http://www.zendstudio.net/archives/a-good-adsense-system/" title="php广告系统应该具备哪些功能才是一个好用的广告系统 (04/09/2009)">php广告系统应该具备哪些功能才是一个好用的广告系统</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/marry-the-jquery/" title="接触伟大的jquery -优雅的JS库 (09/13/2007)">接触伟大的jquery -优雅的JS库</a> (0)</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/heartbreak-for-php-probability-algorithm/" title="令人纠结的php几率算法问题 (06/24/2010)">令人纠结的php几率算法问题</a> (15)</li>
	<li><a href="http://www.zendstudio.net/archives/php-cli-mode-2/" title="《右键实现PHP文件预览》一文补遗 PHP的CLI模式 (12/14/2007)">《右键实现PHP文件预览》一文补遗 PHP的CLI模式</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/oop-language-c-plus-plus/" title="面向对象的程序设计语言C++ (10/12/2008)">面向对象的程序设计语言C++</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/fix-a-ubb-bug-in-boblog/" title="修正bo-blog 2.1.0中UBB正则替换的一个小BUG (11/03/2007)">修正bo-blog 2.1.0中UBB正则替换的一个小BUG</a> (0)</li>
	<li><a href="http://www.zendstudio.net/archives/consider-your-server-network-card/" title="高并发、大流量网站架构时你考虑网卡流量了吗？ (02/07/2010)">高并发、大流量网站架构时你考虑网卡流量了吗？</a> (10)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/php-function-callback-type/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>令人纠结的php几率算法问题</title>
		<link>http://www.zendstudio.net/archives/heartbreak-for-php-probability-algorithm/</link>
		<comments>http://www.zendstudio.net/archives/heartbreak-for-php-probability-algorithm/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 14:56:27 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[几率]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1038</guid>
		<description><![CDATA[唉！现在终于发现上学时不好好念书有多少的坏处了，概率几率对于我来说一直是一个很难弄清楚的问题。今天，我又继续让这个问题纠结上了。好吧！来说说我的那点事儿，首先注明一下：这是一篇求助性文字，我的几率算法也许根本就是不对的。如果恰巧有数学系专家学者路过，那希望您能留言说两句。问题是这样子的：在一个物品合成系统中，需要使用几件不同的物品来合成宝石，有不同的几率生成一颗（50%）、两颗（16%）和三颗（2%）宝石，其余的为爆掉，即什么也得不到。
我的PHP代码实现是这样子的：

&#60;?php
//初始化数组
$stone_arr = array&#40; 
		array&#40; 'num' =&#62; 1, 'prob' =&#62; '50%' &#41;,
		array&#40; 'num' =&#62; 2, 'prob' =&#62; '16%' &#41;,
		array&#40; 'num' =&#62; 3, 'prob' =&#62; '2%' &#41;
		 &#41;;
//随机获得一个幸运数字
$luck_num = mt_rand&#40; 0, 99 &#41;;
//初始化几率区间和最终宝石生产数目
$lucky_range = $made_num = 0;
&#160;
foreach&#40; $stone_arr as $sa &#41;&#123;
	$prob = intval&#40; $sa&#91;'prob'&#93; &#41;;
	if&#40; $luck_num &#62;= $lucky_range &#38;&#38; $luck_num &#60; $lucky_range + $prob &#41;&#123;
		$made_num = $sa&#91;'num'&#93;;
		break;
	&#125;
	else&#123;
		$lucky_range [...]]]></description>
			<content:encoded><![CDATA[<p>唉！现在终于发现上学时不好好念书有多少的坏处了，<span style="text-decoration: line-through;">概率</span>几率对于我来说一直是一个很难弄清楚的问题。今天，我又继续让这个问题纠结上了。好吧！来说说我的那点事儿，首先注明一下：这是一篇求助性文字，我的几率算法也许根本就是不对的。如果恰巧有数学系专家学者路过，那希望您能留言说两句。问题是这样子的：在一个物品合成系统中，需要使用几件不同的物品来合成宝石，有不同的几率生成一颗（50%）、两颗（16%）和三颗（2%）宝石，其余的为爆掉，即什么也得不到。</p>
<p>我的PHP代码实现是这样子的：</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: #000088;">$stone_arr</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;">'num'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'prob'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'50%'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'num'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'prob'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'16%'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'num'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'prob'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'2%'</span> <span style="color: #009900;">&#41;</span>
		 <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//随机获得一个幸运数字</span>
<span style="color: #000088;">$luck_num</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mt_rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">99</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//初始化几率区间和最终宝石生产数目</span>
<span style="color: #000088;">$lucky_range</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$made_num</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$stone_arr</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$sa</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$prob</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sa</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prob'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$luck_num</span> <span style="color: #339933;">&gt;=</span> <span style="color: #000088;">$lucky_range</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$luck_num</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$lucky_range</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$prob</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$made_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sa</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'num'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$lucky_range</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$prob</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$made_num</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//生产宝石的逻辑</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>左思右想，我总觉得这个并没有问题，可我的同事坚持认为$luck_num = mt_rand( 0, 99 )这一行应该放到循环体的里面，说的也有道理呀！不过我觉得这样是不是多给了玩家机会？（当然，从玩家的角度来说，机会越多越好。呵呵～），截至记者发稿时止，我还是没有弄清楚是不是该把随机数放到循环里面？或者这两种方法都不对？麻烦路过的明眼人给俺说道说道，不甚感激</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zendstudio.net/archives/php-redirect-function/" title="一段功能齐全的PHP常用重定向代码html+js+header (11/27/2007)">一段功能齐全的PHP常用重定向代码html+js+header</a> (2)</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/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/use-string-as-php-array-index/" title="php数组的字符型索引是否应该遵循变量命名规则？ (06/29/2010)">php数组的字符型索引是否应该遵循变量命名规则？</a> (2)</li>
	<li><a href="http://www.zendstudio.net/archives/a-good-adsense-system/" title="php广告系统应该具备哪些功能才是一个好用的广告系统 (04/09/2009)">php广告系统应该具备哪些功能才是一个好用的广告系统</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/heartbreak-for-php-probability-algorithm/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>netbeans 6.9正式版</title>
		<link>http://www.zendstudio.net/archives/netbeans-6-9-released/</link>
		<comments>http://www.zendstudio.net/archives/netbeans-6-9-released/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 13:27:36 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[ITer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[zendstudio]]></category>

		<guid isPermaLink="false">http://www.zendstudio.net/?p=1036</guid>
		<description><![CDATA[为开发者推荐好的工具一直是本人不遗余力和乐此不疲的爱干的一件事情，zend studio不是我们的唯一选择，虽然Oracle吃了sun，但netbeans社区依然保持活跃。在我的上一篇文章中介绍《试试NB吧》中，更多的朋友知道了netbeans，相比zend studio，她似乎更让我们喜欢，呵呵！～如果取名叫做zend studio的站点每天铺天盖地的介绍zend studio，并到处吹嘘zend studio无所不能，我想总有一天所有的人们都会明白我在撒谎吧！～是的！netbeans仍然是一款优秀的IDE。至于更多好处，大家可以参考我的上一篇文章中的介绍。
netbeans 6.9的大的改进之处个人认为是formatter的增强，我们公司项目中，团队成员的代码风格迥异，但为了统一，大家尽可能多的保持一致，空格是其中的一个部分，而我是个很爱加空格的人，但显然不是所有人都喜爱不断的敲击那个长长的空格键，formatter解决了这个问题！尽管如此，也许同样的代码，我写出来的东西的体积要比别人的大的多！吼吼～如果按文件体积算绩效，那是个多么令人神往的事情呀！！！和其他软件一样，netbeans 6.9正式版的发布，修复了很多6.8以来的已知bug，甚至让人感觉打开的速度也变得更加快速了！enjoy~~~
netbeans官方网站：http://netbeans.org ,有中文页面，快去看看吧，体验一下netbeans6.9给你带来的编程乐趣。

	相关日志
	
	zend studio 7.0、7.1 注册码、注册机、激活码 (29)
	zend studio使用中的常见问题专门收集 (10)
	Zend studio视频教程(1)——项目管理和服务器调试 (25)
	zend studio 教程临时性围观列表 (7)
	zend studio 使用中常遇见的问题已整理发布 (4)


]]></description>
			<content:encoded><![CDATA[<p>为开发者推荐好的工具一直是本人不遗余力和乐此不疲的爱干的一件事情，zend studio不是我们的唯一选择，虽然Oracle吃了sun，但netbeans社区依然保持活跃。在我的上一篇文章中介绍《<a href="http://www.zendstudio.net/archives/netbeans-introduction/">试试NB吧</a>》中，更多的朋友知道了netbeans，相比zend studio，她似乎更让我们喜欢，呵呵！～如果取名叫做zend studio的站点每天铺天盖地的介绍zend studio，并到处吹嘘zend studio无所不能，我想总有一天所有的人们都会明白我在撒谎吧！～是的！netbeans仍然是一款优秀的IDE。至于更多好处，大家可以参考<a href="http://www.zendstudio.net/archives/netbeans-introduction/">我的上一篇文章</a>中的介绍。</p>
<p>netbeans 6.9的大的改进之处个人认为是formatter的增强，我们公司项目中，团队成员的代码风格迥异，但为了统一，大家尽可能多的保持一致，空格是其中的一个部分，而我是个很爱加空格的人，但显然不是所有人都喜爱不断的敲击那个长长的空格键，formatter解决了这个问题！尽管如此，也许同样的代码，我写出来的东西的体积要比别人的大的多！吼吼～如果按文件体积算绩效，那是个多么令人神往的事情呀！！！和其他软件一样，netbeans 6.9正式版的发布，修复了很多6.8以来的已知bug，甚至让人感觉打开的速度也变得更加快速了！enjoy~~~</p>
<p>netbeans官方网站：<a href="http://netbeans.org">http://netbeans.org</a> ,有中文页面，快去看看吧，体验一下netbeans6.9给你带来的编程乐趣。</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<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-studio-faq-special-post/" title="zend studio使用中的常见问题专门收集 (04/30/2009)">zend studio使用中的常见问题专门收集</a> (10)</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/zend-studio-tutorial-temp-list/" title="zend studio 教程临时性围观列表 (03/14/2010)">zend studio 教程临时性围观列表</a> (7)</li>
	<li><a href="http://www.zendstudio.net/archives/zend-studio-faq-is-posted/" title="zend studio 使用中常遇见的问题已整理发布 (06/28/2009)">zend studio 使用中常遇见的问题已整理发布</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/netbeans-6-9-released/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
