<?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/"
	>

<channel>
	<title>十年踪迹</title>
	<atom:link href="http://www.silverna.org/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.silverna.org/blog</link>
	<description>专注于前端开发</description>
	<pubDate>Thu, 05 Apr 2012 02:27:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>用sublime构建phonegap项目</title>
		<link>http://www.silverna.org/blog/?p=256</link>
		<comments>http://www.silverna.org/blog/?p=256#comments</comments>
		<pubDate>Thu, 05 Apr 2012 02:21:21 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=256</guid>
		<description><![CDATA[有了sublime，利用xcode的命令行，可以在不启动xcode的情况下正确build出phonegap的app并在模拟器中运行。
具体步骤如下：

首先安装最新的 ios-sim
(OSX 使用命令 rake install prefix=/usr/bin/)
之后使用xcode命令的build脚本（保存到 sim-run.sh）就可以编译和载入模拟器运行
接下来要做的事情是将build脚本加入到sublime的Build System中
具体方法如下：
Sublime菜单 > Tools > Build System > New Build System
编辑打开的文件：
{
&#160; &#160; &#34;cmd&#34;: [&#34;$project_path/sim-run.sh&#34;, &#34;$project_name&#34;, &#34;$project_name&#34;]
}
保存到 $Packages/User目录下
保存后，将sublime的project文件放在sim-run所在的目录下：
菜单 Project > Save Project As （目录选择当前编辑的项目的目录，并将前面download的sim-run.sh文件也放在这个目录）
接下来选择Build System > 之前保存的sublime-build文件， 之后command+B就可以看到模拟器中的运行结果了。
（注意上面的配置要求project的名字和build的app的名字要一样，如果xcode中改了target，那么将第二个$project_name替换成实际target的名字就行了）
参考文章：http://shazronatadobe.wordpress.com/2011/02/23/running-your-iphone-app-in-the-simulator-without-xcode/
]]></description>
			<content:encoded><![CDATA[<p>有了sublime，利用xcode的命令行，可以在不启动xcode的情况下正确build出phonegap的app并在模拟器中运行。<br />
具体步骤如下：<br />
<span id="more-256"></span></p>
<p>首先安装最新的 <a href="https://github.com/fingertips/ios-sim">ios-sim</a><br />
(OSX 使用命令 rake install prefix=/usr/bin/)</p>
<p>之后使用xcode命令的<a href="https://gist.github.com/1314458">build脚本（保存到 sim-run.sh）</a>就可以编译和载入模拟器运行</p>
<p>接下来要做的事情是将build脚本加入到sublime的Build System中<br />
具体方法如下：</p>
<p>Sublime菜单 > Tools > Build System > New Build System<br />
编辑打开的文件：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cmd</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">: </span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">$project_path/sim-run.sh</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">$project_name</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">$project_name</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>保存到 $Packages/User目录下</p>
<p>保存后，将sublime的project文件放在sim-run所在的目录下：<br />
菜单 Project > Save Project As （目录选择当前编辑的项目的目录，并将前面download的sim-run.sh文件也放在这个目录）</p>
<p>接下来选择Build System > 之前保存的sublime-build文件， 之后command+B就可以看到模拟器中的运行结果了。<br />
（注意上面的配置要求project的名字和build的app的名字要一样，如果xcode中改了target，那么将第二个$project_name替换成实际target的名字就行了）</p>
<p>参考文章：http://shazronatadobe.wordpress.com/2011/02/23/running-your-iphone-app-in-the-simulator-without-xcode/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=256</wfw:commentRss>
		</item>
		<item>
		<title>使用PyV8解析HTML文档</title>
		<link>http://www.silverna.org/blog/?p=252</link>
		<comments>http://www.silverna.org/blog/?p=252#comments</comments>
		<pubDate>Thu, 23 Feb 2012 03:05:36 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=252</guid>
		<description><![CDATA[什么是PyV8?
PyV8是一个Python封装V8引擎的壳。它提供了简单可用的API，能够利用python来构建出JavaScript的运行时环境。

PyV8能用来干什么？
在nodejs火热流行的时代，或许很少人关注这个基于python简单封装的v8引擎。在某些方面，它比nodejs简洁，而它们拥有同样的本质基础，使得它具有和nodejs相似的潜力。
既然是基于v8的，那么利用它来解析dom和执行javascript是理所当然的。试想一下，如果我们能够建立一个系统把html文档结构解析成w3c dom树，那么我们就可以在上面运行任何javascript，使得这个系统事实上成为一个浏览器（尽管缺少渲染和显示的部分）。
不过，pyv8提供的是纯js运行环境，因此，要解析html文档，还需要为它构建出w3c dom以及浏览器的环境。实现dom和浏览器接口毫无疑问是件力气活，幸运的是，pyv8的官方demo中为我们做了80%以上的工作，提供了w3c.py和browser.py的支持！我们所要做的是在这基础上做一些基本的修改。
好吧，让我们来实践一下：
首先我们构建一个基本的js运行环境，参考commonjs的api实现js基础的模块加载和执行。这一部分还不涉及dom和浏览器，基本上是js原生环境。
import os, re, platform
from&#160;PyV8 import JSContext, JSError
&#160;
from&#160;logger import logger
&#160;
class&#160;CommonJS():
&#160; &#160; _js_path = [os.path.dirname(__file__), os.path.join(os.path.dirname(__file__),'core')]
&#160; &#160; _js_logger = logger().instance()
&#160;
&#160; &#160; def&#160;__init__(self):
&#160; &#160; &#160; &#160; self._js_threadlock = False
&#160; &#160; &#160; &#160; self._js_ctx = JSContext(self)
&#160; &#160; &#160; &#160; self._js_modules = {}
&#160; &#160; &#160; &#160; self._loaded_modules = {}
&#160;
&#160; &#160; &#160; &#160; for&#160;jsroot in CommonJS._js_path:
&#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>什么是PyV8?</p>
<p><a href="http://code.google.com/p/pyv8/">PyV8</a>是一个Python封装<a href="http://code.google.com/p/v8/">V8引擎</a>的壳。它提供了简单可用的API，能够利用python来构建出JavaScript的运行时环境。</p>
<p><span id="more-252"></span></p>
<p>PyV8能用来干什么？</p>
<p>在nodejs火热流行的时代，或许很少人关注这个基于python简单封装的v8引擎。在某些方面，它比nodejs简洁，而它们拥有同样的本质基础，使得它具有和nodejs相似的潜力。</p>
<p>既然是基于v8的，那么利用它来解析dom和执行javascript是理所当然的。试想一下，如果我们能够建立一个系统把html文档结构解析成w3c dom树，那么我们就可以在上面运行任何javascript，使得这个系统事实上成为一个浏览器（尽管缺少渲染和显示的部分）。</p>
<p>不过，pyv8提供的是纯js运行环境，因此，要解析html文档，还需要为它构建出w3c dom以及浏览器的环境。实现dom和浏览器接口毫无疑问是件力气活，幸运的是，pyv8的官方demo中为我们做了80%以上的工作，提供了w3c.py和browser.py的支持！我们所要做的是在这基础上做一些基本的修改。</p>
<p>好吧，让我们来实践一下：</p>
<p>首先我们构建一个基本的js运行环境，参考<a href="commonjs.org/">commonjs</a>的api实现js基础的模块加载和执行。这一部分还不涉及dom和浏览器，基本上是js原生环境。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">os</span><span style="color: Gray;">, </span><span style="color: Blue;">re</span><span style="color: Gray;">, </span><span style="color: Blue;">platform</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">PyV8</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">JSContext</span><span style="color: Gray;">, </span><span style="color: Blue;">JSError</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">logger</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">logger</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">CommonJS</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">_js_path</span><span style="color: Gray;"> = </span><span style="color: Olive;">[</span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Blue;">__file__</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">join</span><span style="color: Olive;">(</span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Blue;">__file__</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">core</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">_js_logger</span><span style="color: Gray;"> = </span><span style="color: Blue;">logger</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">instance</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_threadlock</span><span style="color: Gray;"> = </span><span style="color: Green;">False</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;"> = </span><span style="color: Blue;">JSContext</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_modules</span><span style="color: Gray;"> = {}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_loaded_modules</span><span style="color: Gray;"> = {}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">jsroot</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">CommonJS</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_path</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">root</span><span style="color: Gray;">, </span><span style="color: Blue;">dirs</span><span style="color: Gray;">, </span><span style="color: Blue;">files</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">walk</span><span style="color: Olive;">(</span><span style="color: Blue;">jsroot</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_file</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">files</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">m</span><span style="color: Gray;"> = </span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Teal;">compile</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">(.*)</span><span style="color: Navy;">\.</span><span style="color: Red;">js$</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: Blue;">_file</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">relpath</span><span style="color: Gray;"> = </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">relpath</span><span style="color: Olive;">(</span><span style="color: Blue;">root</span><span style="color: Gray;">, </span><span style="color: Blue;">jsroot</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">namespace</span><span style="color: Gray;"> = </span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Blue;">sub</span><span style="color: Olive;">(</span><span style="color: Blue;">r</span><span style="color: #8b0000;">'</span><span style="color: Red;">^</span><span style="color: Navy;">\.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">''</span><span style="color: Gray;">, </span><span style="color: Blue;">relpath</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">namespace</span><span style="color: Gray;"> = </span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Blue;">sub</span><span style="color: Olive;">(</span><span style="color: Blue;">r</span><span style="color: #8b0000;">'</span><span style="color: Red;">^</span><span style="color: Navy;">\\</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">namespace</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">namespace</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">namespace</span><span style="color: Gray;"> = </span><span style="color: Blue;">namespace</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">/</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">m</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_modules</span><span style="color: Gray;">.</span><span style="color: Blue;">update</span><span style="color: Olive;">(</span><span style="color: Gray;">{</span><span style="color: Blue;">namespace</span><span style="color: Gray;"> + </span><span style="color: Blue;">m</span><span style="color: Gray;">.</span><span style="color: Blue;">group</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">join</span><span style="color: Olive;">(</span><span style="color: Blue;">root</span><span style="color: Gray;">,</span><span style="color: Blue;">_file</span><span style="color: Olive;">)</span><span style="color: Gray;">}</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var exports;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">classmethod</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">CommonJS</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_path</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">CommonJS</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_path</span><span style="color: Gray;">.</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">require</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">module</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Green;">not</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_modules</span><span style="color: Gray;">.</span><span style="color: Blue;">has_key</span><span style="color: Olive;">(</span><span style="color: Blue;">module</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">raise</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">unknown module `</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">module</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">`</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">path</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_modules</span><span style="color: Olive;">[</span><span style="color: Blue;">module</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Green;">not</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_loaded_modules</span><span style="color: Gray;">.</span><span style="color: Blue;">has_key</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">info</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">loading module &lt;%s&gt;...</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">module</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Teal;">file</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">read</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;">.</span><span style="color: Blue;">decode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">platform</span><span style="color: Gray;">.</span><span style="color: Blue;">system</span><span style="color: Olive;">()</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">Windows</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;">.</span><span style="color: Blue;">encode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;">.</span><span style="color: Teal;">eval</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">JSError</span><span style="color: Gray;">, </span><span style="color: Blue;">ex</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">error</span><span style="color: Olive;">(</span><span style="color: Blue;">ex</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">ex</span><span style="color: Gray;">.</span><span style="color: Blue;">stackTrace</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">raise</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;">, </span><span style="color: Blue;">ex</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_loaded_modules</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;">.</span><span style="color: Blue;">locals</span><span style="color: Gray;">.</span><span style="color: Blue;">exports</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_loaded_modules</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_loaded_modules</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">code</span><span style="color: Gray;">, </span><span style="color: Blue;">args</span><span style="color: Gray;"> = </span><span style="color: Olive;">[])</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;">.</span><span style="color: Blue;">enter</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;"># use lock while jscode executing to make mutil-thread work</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_threadlock</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">pass</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_threadlock</span><span style="color: Gray;"> = </span><span style="color: Green;">True</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Teal;">isinstance</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Gray;">, </span><span style="color: Blue;">basestring</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;">.</span><span style="color: Blue;">decode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">platform</span><span style="color: Gray;">.</span><span style="color: Blue;">system</span><span style="color: Olive;">()</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">Windows</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;">.</span><span style="color: Blue;">encode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">r</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;">.</span><span style="color: Teal;">eval</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">r</span><span style="color: Gray;"> = </span><span style="color: Teal;">apply</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Gray;">, </span><span style="color: Blue;">args</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">r</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">JSError</span><span style="color: Gray;">, </span><span style="color: Blue;">ex</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">error</span><span style="color: Olive;">(</span><span style="color: Blue;">ex</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">ex</span><span style="color: Gray;">.</span><span style="color: Blue;">stackTrace</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">raise</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;">, </span><span style="color: Blue;">ex</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">finally</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_threadlock</span><span style="color: Gray;"> = </span><span style="color: Green;">False</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_ctx</span><span style="color: Gray;">.</span><span style="color: Blue;">leave</span><span style="color: Olive;">()</span></li></ol></div>
<p>好了，我们可以测试一下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">commonjs</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">CommonJS</span></li>
<li><span style="color: Blue;">ctx</span><span style="color: Gray;"> = </span><span style="color: Blue;">CommonJS</span><span style="color: Olive;">()</span></li>
<li><span style="color: Blue;">ctx</span><span style="color: Gray;">.</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">/my/js/path</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Green;">print</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">ctx</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">require(&quot;base&quot;); QW.provide(&quot;Test&quot;,{}); exports = QW.Test</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>结果是<br />
[JSObject]</p>
<p>在这基础上，我们进一步实现整个运行时环境和一些内置方法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">#JavaScript HTML Context for PyV8</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">PyV8</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">JSClass</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">logger</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">logger</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">re</span><span style="color: Gray;">, </span><span style="color: Blue;">threading</span><span style="color: Gray;">, </span><span style="color: Blue;">hashlib</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">urllib</span><span style="color: Gray;">,</span><span style="color: Blue;">urllib2</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">w3c</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">parseString</span><span style="color: Gray;">, </span><span style="color: Blue;">Document</span><span style="color: Gray;">, </span><span style="color: Blue;">HTMLElement</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">commonjs</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">CommonJS</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">browser</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">StringIO</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">StringIO</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">gzip</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">JSR</span><span style="color: Olive;">(</span><span style="color: Blue;">CommonJS</span><span style="color: Gray;">, </span><span style="color: Blue;">browser</span><span style="color: Gray;">.</span><span style="color: Blue;">HtmlWindow</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">url_or_dom</span><span style="color: Gray;">, </span><span style="color: Blue;">charset</span><span style="color: Gray;">=</span><span style="color: Green;">None</span><span style="color: Gray;">, </span><span style="color: Blue;">headers</span><span style="color: Gray;">={}, </span><span style="color: Blue;">body</span><span style="color: Gray;">={}, </span><span style="color: Blue;">timeout</span><span style="color: Gray;">=</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">urllib2</span><span style="color: Gray;">.</span><span style="color: Blue;">socket</span><span style="color: Gray;">.</span><span style="color: Blue;">setdefaulttimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">timeout</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">jsonp</span><span style="color: Gray;"> = </span><span style="color: Green;">False</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Teal;">isinstance</span><span style="color: Olive;">(</span><span style="color: Blue;">url_or_dom</span><span style="color: Gray;">, </span><span style="color: Blue;">Document</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">localhost:document</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">dom</span><span style="color: Gray;"> = </span><span style="color: Blue;">url_or_dom</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elif</span><span style="color: Olive;">(</span><span style="color: Blue;">url_or_dom</span><span style="color: Gray;">.</span><span style="color: Blue;">startswith</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">localhost:string</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">dom</span><span style="color: Gray;"> = </span><span style="color: Blue;">parseString</span><span style="color: Olive;">(</span><span style="color: Blue;">url_or_dom</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">: </span><span style="color: #ffa500;">#url</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;"> = </span><span style="color: Blue;">url_or_dom</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Green;">not</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: Blue;">r</span><span style="color: #8b0000;">'</span><span style="color: Navy;">\w</span><span style="color: Red;">+</span><span style="color: Navy;">\:\/\/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">url</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">url</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">request</span><span style="color: Gray;"> = </span><span style="color: Blue;">urllib2</span><span style="color: Gray;">.</span><span style="color: Blue;">Request</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Gray;">, </span><span style="color: Blue;">urllib</span><span style="color: Gray;">.</span><span style="color: Blue;">urlencode</span><span style="color: Olive;">(</span><span style="color: Blue;">body</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">headers</span><span style="color: Gray;">=</span><span style="color: Blue;">headers</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">response</span><span style="color: Gray;"> = </span><span style="color: Blue;">urllib2</span><span style="color: Gray;">.</span><span style="color: Blue;">urlopen</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">contentType</span><span style="color: Gray;"> = </span><span style="color: Blue;">response</span><span style="color: Gray;">.</span><span style="color: Blue;">headers</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Content-Type</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">contentType</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#print contentType</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">t</span><span style="color: Gray;"> = </span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Blue;">search</span><span style="color: Olive;">(</span><span style="color: Blue;">r</span><span style="color: #8b0000;">'</span><span style="color: Red;">x-javascript|json</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">contentType</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">jsonp</span><span style="color: Gray;"> = </span><span style="color: Green;">True</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">m</span><span style="color: Gray;"> = </span><span style="color: Blue;">re</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: Blue;">r</span><span style="color: #8b0000;">'</span><span style="color: Red;">^.*;</span><span style="color: Navy;">\s</span><span style="color: Red;">*charset=(.*)$</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">contentType</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">m</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">charset</span><span style="color: Gray;"> = </span><span style="color: Blue;">m</span><span style="color: Gray;">.</span><span style="color: Blue;">group</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#print charset</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Green;">not</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">charset</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">charset</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">#default charset</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;"># guess charset from httpheader</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">html</span><span style="color: Gray;"> = </span><span style="color: Blue;">response</span><span style="color: Gray;">.</span><span style="color: Blue;">read</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">encoding</span><span style="color: Gray;"> = </span><span style="color: Blue;">response</span><span style="color: Gray;">.</span><span style="color: Blue;">headers</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Content-Encoding</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">encoding</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">and</span><span style="color: Gray;"> </span><span style="color: Blue;">encoding</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">gzip</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">buf</span><span style="color: Gray;"> = </span><span style="color: Blue;">StringIO</span><span style="color: Olive;">(</span><span style="color: Blue;">html</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">f</span><span style="color: Gray;"> = </span><span style="color: Blue;">gzip</span><span style="color: Gray;">.</span><span style="color: Blue;">GzipFile</span><span style="color: Olive;">(</span><span style="color: Blue;">fileobj</span><span style="color: Gray;">=</span><span style="color: Blue;">buf</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">html</span><span style="color: Gray;"> = </span><span style="color: Blue;">f</span><span style="color: Gray;">.</span><span style="color: Blue;">read</span><span style="color: Olive;">()</span><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">__html__</span><span style="color: Gray;"> = </span><span style="color: Blue;">html</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">html</span><span style="color: Gray;"> = </span><span style="color: Teal;">unicode</span><span style="color: Olive;">(</span><span style="color: Blue;">html</span><span style="color: Gray;">, </span><span style="color: Blue;">encoding</span><span style="color: Gray;">=</span><span style="color: Blue;">charset</span><span style="color: Gray;">, </span><span style="color: Blue;">errors</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">ignore</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">dom</span><span style="color: Gray;"> = </span><span style="color: Blue;">parseString</span><span style="color: Olive;">(</span><span style="color: Blue;">html</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">navigator</span><span style="color: Gray;"> = </span><span style="color: Blue;">browser</span><span style="color: Gray;">.</span><span style="color: Blue;">matchNavigator</span><span style="color: Olive;">(</span><span style="color: Blue;">headers</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">User-Agent</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: #8b0000;">''</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">browser</span><span style="color: Gray;">.</span><span style="color: Blue;">HtmlWindow</span><span style="color: Gray;">.</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">url</span><span style="color: Gray;">, </span><span style="color: Blue;">dom</span><span style="color: Gray;">, </span><span style="color: Blue;">navigator</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">CommonJS</span><span style="color: Gray;">.</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">console</span><span style="color: Gray;"> = </span><span style="color: Blue;">JSConsole</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">module</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">base, array.h, function.h, helper.h, object.h, string.h, date.h, custevent, selector, dom_retouch</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">require</span><span style="color: Gray;">, </span><span style="color: Olive;">[</span><span style="color: Blue;">module</span><span style="color: Gray;">.</span><span style="color: Blue;">strip</span><span style="color: Olive;">()])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">jsonp</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">window.data=</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">html</span><span style="color: Gray;">.</span><span style="color: Blue;">encode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#print code</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">info</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">JavaScript runtime ready.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">_js_timer_map</span><span style="color: Gray;"> = {}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_js_execTimer</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">id</span><span style="color: Gray;">, </span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Gray;">, </span><span style="color: Blue;">repeat</span><span style="color: Gray;"> = </span><span style="color: Green;">False</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">(function f(){ _js_timers[</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">][1].code();</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">repeat</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">_js_execTimer(</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">, f, </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">delay</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">, true);</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">code</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">})();</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#thread locking</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">id</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">threading</span><span style="color: Gray;">.</span><span style="color: Blue;">Timer</span><span style="color: Olive;">(</span><span style="color: Blue;">delay</span><span style="color: Gray;"> / </span><span style="color: Maroon;">1000.0</span><span style="color: Gray;">, </span><span style="color: Green;">lambda</span><span style="color: Gray;">: </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">code</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">id</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">timerId</span><span style="color: Gray;"> = </span><span style="color: Teal;">super</span><span style="color: Olive;">(</span><span style="color: Blue;">JSR</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_execTimer</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Gray;">, </span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Gray;">, </span><span style="color: Green;">False</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">timerId</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">clearTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">timerId</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">timerId</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">cancel</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">timerId</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">None</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Teal;">super</span><span style="color: Olive;">(</span><span style="color: Blue;">JSR</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">clearTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">setInterval</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">timerId</span><span style="color: Gray;"> = </span><span style="color: Teal;">super</span><span style="color: Olive;">(</span><span style="color: Blue;">JSR</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">setInterval</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_execTimer</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Gray;">, </span><span style="color: Blue;">callback</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Gray;">, </span><span style="color: Green;">True</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">timerId</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">clearInterval</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">timerId</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">timerId</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">cancel</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_timer_map</span><span style="color: Olive;">[</span><span style="color: Blue;">timerId</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">None</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Teal;">super</span><span style="color: Olive;">(</span><span style="color: Blue;">JSR</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">clearTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">timerId</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">str</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">hashlib</span><span style="color: Gray;">.</span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: Blue;">str</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">hexdigest</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">JSConsole</span><span style="color: Olive;">(</span><span style="color: Blue;">JSClass</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">logger</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;"> = </span><span style="color: Blue;">logger</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">msg</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">_js_logger</span><span style="color: Gray;">.</span><span style="color: Blue;">info</span><span style="color: Olive;">(</span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">msg</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">decode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span></li></ol></div>
<p>到此为止，一个简单的运行时环境就实现了。</p>
<p>使用方法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">jsruntime</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">JSR</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">rt</span><span style="color: Gray;"> = </span><span style="color: Blue;">JSR</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">www.baidu.com</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Blue;">rt</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">alert(document.title)</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">#结果是“百度一下，你就知道”</span></li>
<li><span style="color: Blue;">rt</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">document.querySelector(&quot;body div&quot;)</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">#获得body下匹配的第一个div</span></li>
<li><span style="color: Gray;">...</span></li></ol></div>
<p>利用它，你就可以用js来处理抓取的页面元素，甚至通过运行页面上的js来获取动态加载的内容，只要继续扩展，可以用它来实现一个相当不错的页面内容采集服务，而采集规则，不再只能是简单的正则，而是可以用js像处理任何动态网页那样来处理抓取的页面。</p>
<p>有兴趣滴童鞋可以研究下，pyv8的潜力还是很大的，大家一起期待一下~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=252</wfw:commentRss>
		</item>
		<item>
		<title>让Kohana直接支持python——client篇</title>
		<link>http://www.silverna.org/blog/?p=244</link>
		<comments>http://www.silverna.org/blog/?p=244#comments</comments>
		<pubDate>Mon, 12 Dec 2011 06:45:07 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=244</guid>
		<description><![CDATA[最后，是让php和python”对接“起来
我们在php的auto_load的时候也让python加载对应的模块
&#60;?php defined('SYSPATH') or die('No direct script access.');
&#160;
Socket_Instance::$client = new&#160;Socket_Client('127.0.0.1', 1990);
&#160;
class&#160;Python_Env_Init extends Kohana{
&#160; &#160; /**
&#160; &#160;&#160; * add auto_load to create php local classes associate to remote python classes
&#160; &#160;&#160; */
&#160; &#160; public&#160;static function auto_load($class){
&#160; &#160; &#160; &#160; try{
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; $data = Socket_Instance::find_class($class, self::$_paths);
&#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>最后，是让php和python”对接“起来<br />
我们在php的auto_load的时候也让python加载对应的模块</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">defined</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">SYSPATH</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">No direct script access.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">Socket_Instance</span><span style="color: Gray;">::</span><span style="color: #00008b;">$client</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Socket_Client</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">127.0.0.1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Maroon;">1990</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Python_Env_Init</span><span style="color: Gray;"> </span><span style="color: Green;">extends</span><span style="color: Gray;"> </span><span style="color: Blue;">Kohana</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * add auto_load to create php local classes associate to remote python classes</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_load</span><span style="color: Olive;">(</span><span style="color: #00008b;">$class</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">Socket_Instance</span><span style="color: Gray;">::</span><span style="color: Blue;">find_class</span><span style="color: Olive;">(</span><span style="color: #00008b;">$class</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: #00008b;">$_paths</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$code</span><span style="color: Gray;"> = </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">class </span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$class</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;"> extends Socket_Instance</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected static $_class=&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$class</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">&quot;;</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function __construct(){</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $args = func_get_args();</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::__construct(self::$_class,$args);</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; static function __callStatic($func, $args){</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return self::_rpc_call(self::$client, </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array(</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;class&quot; =&gt; self::$_class, </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;func&quot; =&gt; $func, </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;args&quot; =&gt; $args, )</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">eval</span><span style="color: Olive;">(</span><span style="color: #00008b;">$code</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">true</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">catch</span><span style="color: Olive;">(</span><span style="color: Blue;">Exception</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$ex</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">spl_autoload_register</span><span style="color: Olive;">(</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Python_Env_Init</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">auto_load</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li></ol></div>
<p><span id="more-244"></span><br />
注意到，auto_load的时候动态定义一个class，这个class是一个叫做Socket_Instance的类的实例，这个类是这样的——</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">defined</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">SYSPATH</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">No direct script access.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;"> * the socket instanc handle an unique object instance from the socket server</span></li>
<li><span style="color: #ffa500;"> *</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @package </span><span style="color: #ffa500;">&nbsp;&nbsp; Python</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @category </span><span style="color: #ffa500;">&nbsp; Socket</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @author </span><span style="color: #ffa500;">&nbsp; &nbsp; </span><span style="color: Blue;">akira.cn@gmail.com</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @copyright </span><span style="color: #ffa500;"> (c) 2011 WED Team</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @license </span><span style="color: #ffa500;">&nbsp;&nbsp; </span><span style="color: Blue;">http://kohanaframework.org/license</span></li>
<li><span style="color: #ffa500;"> */</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Socket_Instance</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * unique identifier to hold the instance</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">protected</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_id</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * constructor</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">protected</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_constructor</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * constructor arguments</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">protected</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_args</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * socket client</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: #00008b;">$client</span><span style="color: Gray;"> = </span><span style="color: Green;">null</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * create a new socket instance to operate an object instance from the socket server </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; String&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $class&nbsp; &nbsp; class name</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Array&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $args&nbsp; &nbsp; construct arguments</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Socket_Client&nbsp; &nbsp; $client</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">__construct</span><span style="color: Olive;">(</span><span style="color: #00008b;">$class</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: #00008b;">$id</span><span style="color: Gray;"> = </span><span style="color: Green;">null</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$id</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$id</span><span style="color: Gray;"> = </span><span style="color: Blue;">uniqid</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">i</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_constructor</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$class</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_args</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$args</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_id</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$id</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: #00008b;">$client</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">instances</span><span style="color: Olive;">[</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_id</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$this</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * call a function from remote server</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; String&nbsp; &nbsp; $func&nbsp; &nbsp; method name</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Array&nbsp; &nbsp; $args&nbsp; &nbsp; method arguments</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">&nbsp;&nbsp; mixed</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">__call</span><span style="color: Olive;">(</span><span style="color: #00008b;">$func</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: Blue;">_rpc_call</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: #00008b;">$client</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">class</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_constructor</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">init</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_args</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">func</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #00008b;">$func</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">args</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #00008b;">$args</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">id</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_id</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * make a rpc_call, send data to server</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Socket_Client&nbsp; &nbsp; $client</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Array&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $data</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">&nbsp;&nbsp; mixed&nbsp; &nbsp; </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">protected</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">_rpc_call</span><span style="color: Olive;">(</span><span style="color: #00008b;">$client</span><span style="color: Gray;">, </span><span style="color: #00008b;">$data</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">json_encode</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$socket</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$client</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">socket</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$res</span><span style="color: Gray;"> = </span><span style="color: Blue;">socket_write</span><span style="color: Olive;">(</span><span style="color: #00008b;">$socket</span><span style="color: Gray;">, </span><span style="color: #00008b;">$data</span><span style="color: Gray;">, </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">===</span><span style="color: Green;">false</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$client</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error socket_write</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: Blue;">socket_strerror</span><span style="color: Olive;">(</span><span style="color: Blue;">socket_last_error</span><span style="color: Olive;">()))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$res</span><span style="color: Gray;"> = </span><span style="color: Blue;">socket_read</span><span style="color: Olive;">(</span><span style="color: #00008b;">$socket</span><span style="color: Gray;">, </span><span style="color: Maroon;">1024</span><span style="color: Gray;">, </span><span style="color: Blue;">PHP_BINARY_READ</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$size</span><span style="color: Gray;"> = </span><span style="color: Blue;">intval</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">8</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">while</span><span style="color: Olive;">(</span><span style="color: #00008b;">$size</span><span style="color: Gray;"> + </span><span style="color: Maroon;">8</span><span style="color: Gray;"> &gt; </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$res</span><span style="color: Gray;"> .= </span><span style="color: Blue;">socket_read</span><span style="color: Olive;">(</span><span style="color: #00008b;">$socket</span><span style="color: Gray;">, </span><span style="color: Maroon;">1024</span><span style="color: Gray;">, </span><span style="color: Blue;">PHP_BINARY_READ</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">while</span><span style="color: Olive;">(</span><span style="color: #00008b;">$size</span><span style="color: Gray;"> + </span><span style="color: Maroon;">8</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$res</span><span style="color: Gray;"> = </span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">, </span><span style="color: #00008b;">$size</span><span style="color: Gray;"> + </span><span style="color: Maroon;">8</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$size</span><span style="color: Gray;"> = </span><span style="color: Blue;">intval</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">8</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$res</span><span style="color: Gray;"> = </span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">, </span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #00008b;">$size</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$ret</span><span style="color: Gray;"> = </span><span style="color: Blue;">json_decode</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Gray;">, </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ret</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">throw</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Socket_Exception</span><span style="color: Olive;">(</span><span style="color: #00008b;">$res</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$ret</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">data</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//if python func returns a python object, create this object via php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">is_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@class</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@init</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Socket_Instance</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@class</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@init</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: #00008b;">$data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">@id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * find a class from remote server</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; String&nbsp; &nbsp; $class&nbsp; &nbsp; class name</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Array&nbsp; &nbsp; $paths&nbsp; &nbsp; root paths</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">&nbsp;&nbsp; boolean</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">find_class</span><span style="color: Olive;">(</span><span style="color: #00008b;">$class</span><span style="color: Gray;">, </span><span style="color: #00008b;">$paths</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: Blue;">_rpc_call</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">::</span><span style="color: #00008b;">$client</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">class</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$class</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">paths</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$paths</span><span style="color: Olive;">))</span><span style="color: Gray;">;&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>Socket_Instance及其派生类当实例化的时候生成一个唯一的id，用来标识这个实例，并利用魔术方法来处理静态方法和对象方法<br />
注意到实例化Sockiet_Instance的时候并不会连接python，因此python端的对应实例是延迟初始化的，只有当第一个对象方法被调用的时候，id被第一次传入python处理程序（见上一篇），python端的对象实例才被创建（调用static方法因为不传id，所以并不会导致python端的对象构造）。这样的话如果用户new了一个class但一次都没使用过，那么python那头就不会连接和构造，从而优化了效率。</p>
<p>最后为socket_instance封装一个socet client对象</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">defined</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">SYSPATH</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">No direct script access.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;"> * Creating socket handles connected to the socket server</span></li>
<li><span style="color: #ffa500;"> *</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @package </span><span style="color: #ffa500;">&nbsp;&nbsp; Python</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @category </span><span style="color: #ffa500;">&nbsp; Socket</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @author </span><span style="color: #ffa500;">&nbsp; &nbsp; </span><span style="color: Blue;">akira.cn@gmail.com</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @copyright </span><span style="color: #ffa500;"> (c) 2011 WED Team</span></li>
<li><span style="color: #ffa500;"> *</span><span style="color: Blue;"> @license </span><span style="color: #ffa500;">&nbsp;&nbsp; </span><span style="color: Blue;">http://kohanaframework.org/license</span></li>
<li><span style="color: #ffa500;"> */</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Socket_Client</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * socket server ip address</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_host</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * socket server port</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_port</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * socket connection</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_socket</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * error reports</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_error</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * the object instances handled</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$instances</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * create a new socket client object</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; String&nbsp; &nbsp; $host</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">&nbsp;&nbsp; Int&nbsp; &nbsp; &nbsp; &nbsp; $port </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__construct</span><span style="color: Olive;">(</span><span style="color: #00008b;">$host</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">127.0.0.1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$port</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1990</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_host</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$host</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_port</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$port</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_connect</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * create the connection</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">&nbsp;&nbsp; Socket </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">_connect</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$sock</span><span style="color: Gray;"> = </span><span style="color: Blue;">socket_create</span><span style="color: Olive;">(</span><span style="color: Blue;">AF_INET</span><span style="color: Gray;">, </span><span style="color: Blue;">SOCK_STREAM</span><span style="color: Gray;">, </span><span style="color: Blue;">SOL_TCP</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$sock</span><span style="color: Gray;"> === </span><span style="color: Green;">false</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error socket_create</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: Blue;">socket_strerror</span><span style="color: Olive;">(</span><span style="color: Blue;">socket_last_error</span><span style="color: Olive;">()))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$ret</span><span style="color: Gray;"> = </span><span style="color: Blue;">socket_connect</span><span style="color: Olive;">(</span><span style="color: #00008b;">$sock</span><span style="color: Gray;">, </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_host</span><span style="color: Gray;">, </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_port</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ret</span><span style="color: Gray;"> === </span><span style="color: Green;">false</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error socket_connect</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: Blue;">socket_strerror</span><span style="color: Olive;">(</span><span style="color: Blue;">socket_last_error</span><span style="color: Olive;">()))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_socket</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$sock</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * get the socket handle</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">Socket</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">socket</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_socket</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * remove the instances handled from the socket server</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">__destruct</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$socket</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_socket</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">socket_write</span><span style="color: Olive;">(</span><span style="color: #00008b;">$socket</span><span style="color: Gray;">, </span><span style="color: #8b0000;">''</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">socket_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$socket</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * provide errors</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; *</span><span style="color: Blue;"> @throws </span><span style="color: #ffa500;">Socket_Exception</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">_error</span><span style="color: Olive;">(</span><span style="color: #00008b;">$errMsg</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">_error</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$errMsg</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">throw</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Socket_Exception</span><span style="color: Olive;">(</span><span style="color: #00008b;">$errMsg</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>至此，kohana下python和php直连的机制基本上完成了，用户只需要像写php普通类的方法用python写那些类，在kohana中就可以像是用php写的那些类一样的调用，是不是非常简单呢？</p>
<p>最后，放上这个项目的开源地址——<br />
<a href="https://github.com/akira-cn/Kohana-python">https://github.com/akira-cn/Kohana-python</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=244</wfw:commentRss>
		</item>
		<item>
		<title>让Kohana直接支持python——RPC篇</title>
		<link>http://www.silverna.org/blog/?p=240</link>
		<comments>http://www.silverna.org/blog/?p=240#comments</comments>
		<pubDate>Mon, 12 Dec 2011 06:31:17 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=240</guid>
		<description><![CDATA[上一篇中，我们实现了基础的TCP Server，数据通过json协议进行传输
接下来，我们需要处理RPC请求的核心部分。
我们来看，在PHP代码中写：
$myObj = new&#160;Foo_Bar();
$myObj-&#62;test();

我们要python端做哪些事情

首先，我们要让python找到对应的模块加载（按kohana规则，这个模块叫 classes/foo/bar.py）
其次，我们用php new了一个python对象，对象名为Foo_Bar，接着，调用了test方法
在RPC请求中，我们先要通知python去new这个对象，并且将这个实例保存下来
再次，当我们调用test()方法时，python要知道调用这个方法的对象实例是我们刚才保存下来的那个Foo_Bar实例。所以这里，我们必须要维持一个唯一的id，作为这个实例的标识。
id有两个作用，一是避免对象的重复构造，二是让python知道该用哪个对象去调用方法。
对于让python找到对应的模块加载，这个可以放在php的autoload中进行，只要在autoload的过程中，将对应的路径classes加入到python的sys.path中，并且写好classes/foo/__init__.py，那么在python中通过import或__import__就能将正确的模块加载进来了。
至于new正确的python对象，只需要将Foo_Bar解析成foo.bar.Foo_Bar，应该不难。这只是简单的正则替换而已。
有了class，我们根据guid构造出实例，并且将这个实例保存在对应的guid的字典字段中。
完整的代码并不复杂：
# coding=utf-8
&#160;
import&#160;sys
import&#160;uuid
from&#160;types import *
&#160;
class&#160;Handler():
&#160; &#160; def&#160;__init__(self):
&#160; &#160; &#160; &#160; self.rpc_instances = {}
&#160; &#160; def&#160;execute(self, data):
&#160; &#160; &#160; &#160; rpc_instances = self.rpc_instances;
&#160;
&#160; &#160; &#160; &#160; if('paths'&#160;in data): #set auto loading paths
&#160; &#160; &#160; &#160; &#160; &#160; data['paths'].reverse()
&#160; &#160; &#160; &#160; &#160; &#160; for&#160;i in range(len(data['paths'])):
&#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>上一篇中，我们实现了基础的TCP Server，数据通过json协议进行传输</p>
<p>接下来，我们需要处理RPC请求的核心部分。<br />
我们来看，在PHP代码中写：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$myObj</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Foo_Bar</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$myObj</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">test</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>我们要python端做哪些事情</p>
<p><span id="more-240"></span><br />
首先，我们要让python找到对应的模块加载（按kohana规则，这个模块叫 classes/foo/bar.py）<br />
其次，我们用php new了一个python对象，对象名为Foo_Bar，接着，调用了test方法<br />
在RPC请求中，我们先要通知python去new这个对象，并且将这个实例保存下来<br />
再次，当我们调用test()方法时，python要知道调用这个方法的对象实例是我们刚才保存下来的那个Foo_Bar实例。所以这里，我们必须要维持一个唯一的id，作为这个实例的标识。<br />
id有两个作用，一是避免对象的重复构造，二是让python知道该用哪个对象去调用方法。</p>
<p>对于让python找到对应的模块加载，这个可以放在php的autoload中进行，只要在autoload的过程中，将对应的路径classes加入到python的sys.path中，并且写好classes/foo/__init__.py，那么在python中通过import或__import__就能将正确的模块加载进来了。</p>
<p>至于new正确的python对象，只需要将Foo_Bar解析成foo.bar.Foo_Bar，应该不难。这只是简单的正则替换而已。</p>
<p>有了class，我们根据guid构造出实例，并且将这个实例保存在对应的guid的字典字段中。</p>
<p>完整的代码并不复杂：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;"># coding=utf-8</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sys</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">uuid</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">types</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> *</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Handler</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;"> = {}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">paths</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">: </span><span style="color: #ffa500;">#set auto loading paths</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">paths</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">reverse</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Teal;">range</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">paths</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">path</span><span style="color: Gray;"> = </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">paths</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">classes</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">path</span><span style="color: Gray;">.</span><span style="color: Blue;">insert</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Blue;">path</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#call the object instance func - {id, func, args[class, init]}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">rpc_instances</span><span style="color: Olive;">)</span><span style="color: Gray;">:&nbsp; &nbsp; </span><span style="color: #ffa500;">#the object has been created</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">o</span><span style="color: Gray;"> = </span><span style="color: Blue;">rpc_instances</span><span style="color: Olive;">[</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;">#create new object instance</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">c</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">find_class</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">class</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">o</span><span style="color: Gray;"> = </span><span style="color: Teal;">apply</span><span style="color: Olive;">(</span><span style="color: Blue;">c</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">init</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">rpc_instances</span><span style="color: Olive;">[</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]]</span><span style="color: Gray;"> = </span><span style="color: Blue;">o</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> =&nbsp; </span><span style="color: Teal;">apply</span><span style="color: Olive;">(</span><span style="color: Teal;">getattr</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">func</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">args</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: #8b0000;">''</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#call class func - {class, [func, args]}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">c</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">find_class</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">class</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#if not 'func', only to test wether the class exists or not</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">not</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">func</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">data</span><span style="color: Olive;">))</span><span style="color: Gray;">: </span><span style="color: #ffa500;">#TODO: get the detail info of the class?</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Green;">True</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">apply</span><span style="color: Olive;">(</span><span style="color: Teal;">getattr</span><span style="color: Olive;">(</span><span style="color: Blue;">c</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">func</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">args</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: #8b0000;">''</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Teal;">type</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">is</span><span style="color: Gray;"> </span><span style="color: Blue;">InstanceType</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">uid</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">uuid</span><span style="color: Gray;">.</span><span style="color: Blue;">uuid4</span><span style="color: Olive;">())</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">rpc_instances</span><span style="color: Olive;">[</span><span style="color: Blue;">uid</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">res</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = {</span><span style="color: #8b0000;">'</span><span style="color: Red;">@id</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Blue;">uid</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">@class</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Blue;">res</span><span style="color: Gray;">.</span><span style="color: Blue;">__class__</span><span style="color: Gray;">.</span><span style="color: Blue;">__name__</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">@init</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Olive;">[]</span><span style="color: Gray;">}&nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;"> {</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">ok</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">data</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Blue;">res</span><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">find_class</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">class_name</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">#resolve the path from class name like 'Model_Logic_Test'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">path</span><span style="color: Gray;"> = </span><span style="color: Teal;">map</span><span style="color: Olive;">(</span><span style="color: Green;">lambda</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">s</span><span style="color: Gray;">: </span><span style="color: Blue;">s</span><span style="color: Gray;">.</span><span style="color: Blue;">lower</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">class_name</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">_</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">p</span><span style="color: Gray;"> = </span><span style="color: Teal;">__import__</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">join</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Teal;">range</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">path</span><span style="color: Olive;">))</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">p</span><span style="color: Gray;"> = </span><span style="color: Teal;">getattr</span><span style="color: Olive;">(</span><span style="color: Blue;">p</span><span style="color: Gray;">, </span><span style="color: Blue;">path</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">getattr</span><span style="color: Olive;">(</span><span style="color: Blue;">p</span><span style="color: Gray;">, </span><span style="color: Blue;">class_name</span><span style="color: Olive;">)</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=240</wfw:commentRss>
		</item>
		<item>
		<title>让Kohana直接支持python——Server篇</title>
		<link>http://www.silverna.org/blog/?p=236</link>
		<comments>http://www.silverna.org/blog/?p=236#comments</comments>
		<pubDate>Fri, 09 Dec 2011 06:46:19 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=236</guid>
		<description><![CDATA[最近写php用的是Kohana(http://kohanaframework.org/) MVC框架。这个框架用的人不是很多，不过确实是一个相当不错的轻量级PHP MVC框架。
php用于web开发还是很方便的，这门语言专注于web开发，作为前端工程师，非常喜欢这种简单的脚本语言。
不过有些后端的服务，如一些对异步要求较高的服务，用php写就稍稍有点费劲，而用python则是不错的选择。
因此，我自然开始考虑是否能将kohana和python结合起来。
我的设想是：在kohana中能直接new python写的class，就像php的原生方法那样简单
例如：
在koahan中，如果要直接加载一个php的类clas Foo_Bar，那么要求这个类定义放在 classes/foo/bar.php 文件中
现在如果我定义在classes/foo文件夹下的是一个python文件 bar.py，里面定义了一个python的类Foo_Bar
我希望也能用kohana调用这个类
即——

$myObj = new&#160;Foo_Bar(); //不论这个类是php还是python写的

首先的问题是python和php之间的通信问题，思考之后，我决定用tcp socketserver来解决它，数据协议就用json
python自带了一个socketserver，那是可以支持多线程的异步socket，试着拿它写了一个server——
# coding=utf-8
&#160;
import&#160;sys
import&#160;json
import&#160;traceback
import&#160;socket
from&#160;SocketServer import BaseRequestHandler, ThreadingTCPServer
from&#160;daemon import Daemon
&#160;
from&#160;handler import Handler
&#160;
from&#160;logger import logger
logger = logger().instance()
&#160;
class&#160;RequestHandler(BaseRequestHandler, Handler):
&#160; &#160; def&#160;setup(self):
&#160; &#160; &#160; &#160; logger.debug('setup')
&#160; &#160; &#160; &#160; self.request.settimeout(60)
&#160; &#160; &#160; &#160; self.rpc_instances = {}
&#160; &#160; def&#160;handle(self):
&#160; &#160; &#160; &#160; while&#160;True:
&#160; &#160; &#160; &#160; &#160; &#160; try:
&#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>最近写php用的是Kohana(http://kohanaframework.org/) MVC框架。这个框架用的人不是很多，不过确实是一个相当不错的轻量级PHP MVC框架。<br />
php用于web开发还是很方便的，这门语言专注于web开发，作为前端工程师，非常喜欢这种简单的脚本语言。<br />
不过有些后端的服务，如一些对异步要求较高的服务，用php写就稍稍有点费劲，而用python则是不错的选择。<br />
因此，我自然开始考虑是否能将kohana和python结合起来。<br />
我的设想是：在kohana中能直接new python写的class，就像php的原生方法那样简单</p>
<p>例如：<br />
在koahan中，如果要直接加载一个php的类clas Foo_Bar，那么要求这个类定义放在 classes/foo/bar.php 文件中<br />
现在如果我定义在classes/foo文件夹下的是一个python文件 bar.py，里面定义了一个python的类Foo_Bar<br />
我希望也能用kohana调用这个类<br />
即——</p>
<p><span id="more-236"></span></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$myObj</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Foo_Bar</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//不论这个类是php还是python写的</span></li>
</ol></div>
<p>首先的问题是python和php之间的通信问题，思考之后，我决定用tcp socketserver来解决它，数据协议就用json<br />
python自带了一个socketserver，那是可以支持多线程的异步socket，试着拿它写了一个server——</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;"># coding=utf-8</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sys</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">json</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">traceback</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">socket</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">SocketServer</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">BaseRequestHandler</span><span style="color: Gray;">, </span><span style="color: Blue;">ThreadingTCPServer</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">daemon</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">Daemon</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">handler</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">Handler</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">logger</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">logger</span></li>
<li><span style="color: Blue;">logger</span><span style="color: Gray;"> = </span><span style="color: Blue;">logger</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">instance</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">RequestHandler</span><span style="color: Olive;">(</span><span style="color: Blue;">BaseRequestHandler</span><span style="color: Gray;">, </span><span style="color: Blue;">Handler</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">setup</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">setup</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">settimeout</span><span style="color: Olive;">(</span><span style="color: Maroon;">60</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;"> = {}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">handle</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">True</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">data</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">recv</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">*</span><span style="color: Maroon;">1024</span><span style="color: Gray;">*</span><span style="color: Maroon;">1024</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Blue;">data</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">#end</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">data</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">loads</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">instance count:</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;">.</span><span style="color: Blue;">keys</span><span style="color: Olive;">())))</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">dumps</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">rjust</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">res</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">send</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">socket</span><span style="color: Gray;">.</span><span style="color: Blue;">timeout</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">err</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error in RequestHandler :%s, res:%s</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> % </span><span style="color: Olive;">(</span><span style="color: Blue;">traceback</span><span style="color: Gray;">.</span><span style="color: Blue;">format_exc</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">dumps</span><span style="color: Olive;">(</span><span style="color: Gray;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Blue;">format</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Olive;">)</span><span style="color: Gray;">}</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">rjust</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">res</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">send</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">close</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">break</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">err</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error in RequestHandler :%s, res:%s</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> % </span><span style="color: Olive;">(</span><span style="color: Blue;">traceback</span><span style="color: Gray;">.</span><span style="color: Blue;">format_exc</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">dumps</span><span style="color: Olive;">(</span><span style="color: Gray;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: Blue;">format</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Olive;">)</span><span style="color: Gray;">}</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">rjust</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">res</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">send</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">finish</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">finish</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">request</span><span style="color: Gray;">.</span><span style="color: Blue;">close</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">response</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">dumps</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">rjust</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">res</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">transport</span><span style="color: Gray;">.</span><span style="color: Blue;">write</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Server</span><span style="color: Olive;">(</span><span style="color: Blue;">Daemon</span><span style="color: Olive;">)</span><span style="color: Gray;">:&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">conf</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">host</span><span style="color: Gray;">, </span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">host</span><span style="color: Gray;"> = </span><span style="color: Blue;">host</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Blue;">port</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">ThreadingTCPServer</span><span style="color: Gray;">.</span><span style="color: Blue;">allow_reuse_address</span><span style="color: Gray;"> = </span><span style="color: Green;">True</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">run</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;"> = </span><span style="color: Blue;">ThreadingTCPServer</span><span style="color: Olive;">((</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">host</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">RequestHandler</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">serve_forever</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">err</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">traceback</span><span style="color: Gray;">.</span><span style="color: Blue;">format_exc</span><span style="color: Olive;">())</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__name__</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">__main__</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;"> = </span><span style="color: Blue;">Server</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">/tmp/daemon-tortoise.pid</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1990</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">3</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">2</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">conf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">0.0.0.0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">#change ip address if you want to call remotely</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">2</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">start</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">elif</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">stop</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">elif</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">restart</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">restart</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">print</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Unknown command</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">print</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">usage: %s start|stop|restart</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> % </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span></li></ol></div>
<p>继承自Daemon的Server是让操作系统管理进程的，关键的是——</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">server</span><span style="color: Gray;"> = </span><span style="color: Blue;">ThreadingTCPServer</span><span style="color: Olive;">((</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">host</span><span style="color: Gray;">, </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">RequestHandler</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">serve_forever</span><span style="color: Olive;">()</span></li></ol></div>
<p>这一步启动了一个tcp server，接下来在RequestHandler中处理逻辑</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li></ol></div>
<p>这一句将json数据解析成python类和方法来执行，具体的代码我们在后续的RPC篇中详细介绍</p>
<p>如果处理过程中有错误，记录日志，并把错误信息发送回php，以方便捕获异常进行调试</p>
<p>在这个模型下，python的整个过程是一个多线程的请求，每个php请求单独建立一个线程连接，处理完成之后或者请求超时之后，连接将被关闭，所有的资源得到释放。</p>
<p>上面用原生的SocketServer实现了简单的php和python通信的机制，它确实能稳定地跑起来，而且效率不差<br />
不过由于存在GIL机制的限制，python多线程模型不能完全占有CPU资源，因此考虑到进一步提高并发请求的效率，改用<strong>异步非阻塞单线程机制</strong>是一个合理的想法。<br />
对于异步非阻塞连接，php的twisted框架提供了一个相当不错的实现，因此安装twisted之后，利用这个框架写了一个新的server——<br />
server-twisted.py</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;"># coding=utf-8</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sys</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">traceback</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">daemon</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">Daemon</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">twisted</span><span style="color: Gray;">.</span><span style="color: Blue;">internet</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">reactor</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">twisted</span><span style="color: Gray;">.</span><span style="color: Blue;">internet</span><span style="color: Gray;">.</span><span style="color: Blue;">protocol</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">Protocol</span><span style="color: Gray;">, </span><span style="color: Blue;">Factory</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">twisted</span><span style="color: Gray;">.</span><span style="color: Blue;">protocols</span><span style="color: Gray;">.</span><span style="color: Blue;">policies</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">TimeoutMixin</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">handler</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">Handler</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">logger</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">logger</span></li>
<li><span style="color: Blue;">logger</span><span style="color: Gray;"> = </span><span style="color: Blue;">logger</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">instance</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">json</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">PHPRequest</span><span style="color: Olive;">(</span><span style="color: Blue;">Protocol</span><span style="color: Gray;">, </span><span style="color: Blue;">TimeoutMixin</span><span style="color: Gray;">, </span><span style="color: Blue;">Handler</span><span style="color: Olive;">)</span><span style="color: Gray;">:&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">connectionMade</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">connection opened</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">conn_timeout</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">clients</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">transport</span><span style="color: Gray;">.</span><span style="color: Blue;">getPeer</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">host</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">connections</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">connections</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">connections:</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">connections</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">connectionLost</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">,</span><span style="color: Blue;">reason</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</span><span style="color: Green;">None</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">connections</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">connections</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">connection closed:</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Blue;">reason</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">timeoutConnection</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = {</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> : </span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">timed out: %s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> % </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">clients</span><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">timed out: %s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> % </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">clients</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">response</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">transport</span><span style="color: Gray;">.</span><span style="color: Blue;">unregisterProducer</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">transport</span><span style="color: Gray;">.</span><span style="color: Blue;">loseConnection</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">dataReceived</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">,</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">data</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">loads</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">instance count:</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">rpc_instances</span><span style="color: Gray;">.</span><span style="color: Blue;">keys</span><span style="color: Olive;">())))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">Exception</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">err</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error in RequestHandler :%s, res:%s</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> % </span><span style="color: Olive;">(</span><span style="color: Blue;">traceback</span><span style="color: Gray;">.</span><span style="color: Blue;">format_exc</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = {</span><span style="color: #8b0000;">'</span><span style="color: Red;">err</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">sys.socket.error</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span><span style="color: Blue;">format</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Olive;">)</span><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">finally</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">response</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">response</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">data</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">json</span><span style="color: Gray;">.</span><span style="color: Blue;">dumps</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Teal;">str</span><span style="color: Olive;">(</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">rjust</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">res</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">transport</span><span style="color: Gray;">.</span><span style="color: Blue;">write</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">PHPRequestFactory</span><span style="color: Olive;">(</span><span style="color: Blue;">Factory</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">protocol</span><span style="color: Gray;"> = </span><span style="color: Blue;">PHPRequest</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">connections</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__init__</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">conn_timeout</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">conn_timeout</span><span style="color: Gray;"> = </span><span style="color: Blue;">conn_timeout</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Server</span><span style="color: Olive;">(</span><span style="color: Blue;">Daemon</span><span style="color: Olive;">)</span><span style="color: Gray;">:&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">conf</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">, </span><span style="color: Blue;">host</span><span style="color: Gray;">, </span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">host</span><span style="color: Gray;"> = </span><span style="color: Blue;">host</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Blue;">port</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">run</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">run</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">factory</span><span style="color: Gray;"> = </span><span style="color: Blue;">PHPRequestFactory</span><span style="color: Olive;">(</span><span style="color: Maroon;">60</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reactor</span><span style="color: Gray;">.</span><span style="color: Blue;">listenTCP</span><span style="color: Olive;">(</span><span style="color: Blue;">self</span><span style="color: Gray;">.</span><span style="color: Blue;">port</span><span style="color: Gray;">, </span><span style="color: Blue;">factory</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reactor</span><span style="color: Gray;">.</span><span style="color: Blue;">run</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">logger</span><span style="color: Gray;">.</span><span style="color: Blue;">debug</span><span style="color: Olive;">(</span><span style="color: Blue;">traceback</span><span style="color: Gray;">.</span><span style="color: Blue;">format_exc</span><span style="color: Olive;">())</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__name__</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">__main__</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;"> = </span><span style="color: Blue;">Server</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">/tmp/daemon-tortoise.pid</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1990</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">3</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">port</span><span style="color: Gray;"> = </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">2</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">conf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">0.0.0.0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">port</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">#change ip address if you want to call remotely</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">len</span><span style="color: Olive;">(</span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">2</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">start</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">elif</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">stop</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">elif</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">restart</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">server</span><span style="color: Gray;">.</span><span style="color: Blue;">restart</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">print</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Unknown command</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">print</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">usage: %s start|stop|restart</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> % </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span></li></ol></div>
<p>twisted是异步事件回调的模型，逻辑比之前的socketserver更简单，分别处理好connectionMade、connectionLost、dataRecevied和timeoutConnection几个事件就好了。<br />
到此为止，简单的server写好了，它可以和php的client之间相互通信。现在我们要做的事情是将php发送给python的json格式的数据解析成python的命令执行，并且组织好返回给php的数据格式。</p>
<p>关于php的client，将在下一篇文章中详细说明。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=236</wfw:commentRss>
		</item>
		<item>
		<title>show一段用Lafe写的代码</title>
		<link>http://www.silverna.org/blog/?p=233</link>
		<comments>http://www.silverna.org/blog/?p=233#comments</comments>
		<pubDate>Mon, 18 Jul 2011 07:45:37 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=233</guid>
		<description><![CDATA[class&#160;Layout_My_Layout extends Base_Layout{
&#160; &#160; function&#160;build(){
&#160; &#160; &#160; &#160; if($ua-&#62;isPc)&#160;$this-&#62;pc-&#62;display();
&#160; &#160; &#160; &#160; else&#160;if($ua-&#62;isPad) $this-&#62;pad-&#62;display();
&#160; &#160; &#160; &#160; else&#160;if($ua-&#62;isPhone) $this-&#62;phone-&#62;display();
&#160; &#160; }
&#160; &#160; public&#160;function layout_pc(){
&#160; &#160; &#160; &#160; $main_body = &#34;left_2_right_3_5.Right&#34;;
&#160; &#160; &#160; &#160; $side_bar = &#34;left_2_right_3_5.Left&#34;;
&#160;
&#160; &#160; &#160; &#160; if($ua-&#62;userReverse){
&#160; &#160; &#160; &#160; &#160; &#160; $main_body = &#34;left_3_right_2_5.Left&#34;; //用户选择把side_bar放在右边的设置
&#160; &#160; &#160; &#160; &#160; &#160; $side_bar [...]]]></description>
			<content:encoded><![CDATA[<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Layout_My_Layout</span><span style="color: Gray;"> </span><span style="color: Green;">extends</span><span style="color: Gray;"> </span><span style="color: Blue;">Base_Layout</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">build</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ua</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">isPc</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">pc</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">display</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ua</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">isPad</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">pad</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">display</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ua</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">isPhone</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">phone</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">display</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">layout_pc</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$main_body</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">left_2_right_3_5.Right</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$side_bar</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">left_2_right_3_5.Left</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ua</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">userReverse</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$main_body</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">left_3_right_2_5.Left</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//用户选择把side_bar放在右边的设置</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$side_bar</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">left_3_right_2_5.Right</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Header common_header</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$headder_data</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Body </span><span style="color: #00008b;">$main_body</span><span style="color: Red;"> main_panel</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$side_data</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Body </span><span style="color: #00008b;">$side_bar</span><span style="color: Red;"> side_panel</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$right_data</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Footer common_footer</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$footer_data</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">layout_pad</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ......</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">layout_phone</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ......</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
</ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=233</wfw:commentRss>
		</item>
		<item>
		<title>LAFE——基于Layout的前端开发方式简介</title>
		<link>http://www.silverna.org/blog/?p=228</link>
		<comments>http://www.silverna.org/blog/?p=228#comments</comments>
		<pubDate>Sun, 17 Jul 2011 18:22:36 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=228</guid>
		<description><![CDATA[LAFE是个神马东东呢？听起来像个新鲜玩艺儿吧？
要解释这个还蛮费劲的。而我这个人又比较懒，不喜欢长篇大论。（看我前一篇文章是啥时候更新的就知道我有多懒了=.=）
为什么我不经常更新呢，一是我比较懒，二是我一般不喜欢经常码字的，特别是比较忙的时候，如果废话就会被老大发现我工作不饱和，然后说不定就有更多的活要做了……
额……
还是言归正传，谈谈LAFE吧
好吧，我们天天说模块化模块化，但是没有人真正说清楚，一般的开发过程中，如果我们要把前端设计成模块化开发，究竟应该肿么写代码才比较爽。如果只是简单把页面分成一块块的，然后把这些模块一一载入进来，拼成页面，那再简单也不过了。
但是现实没这么理想化，如果一个页面足够复杂，那么可能包含一个头部、一个底部、中间包含一个边拦，一个主栏，主栏里边可能又嵌套包含一个有头、身子、底的复杂结构，然后这种结构还能多重嵌套，这时候你就知道有多烦了。
模块化不仅仅只是拆，更烦的是拼装，如何把一个复杂页面很快速拼装出来呢，好吧，我们看看传统的方式是如何工作滴——
最初的办法是全部写在views下的模板中，例如php有include和require，smarty有include，假如一个a模板要引入b和c，那么就在a中直接写
&#60;?php include('b.php')?&#62;
&#60;?php&#160;include('c.php')?&#62;
这种做法当然可以，但是在页面复杂的时候不可取，理由首先是不够灵活，现在我的a页面要套b和c，但是随着需求改变，如果我要新增一个把c换成d的页面，那么得重新写一个模板，写多了很难管理。另外页面模块加载会非常散乱，假如a引入b、c，b引入d、c引入e、f，一个维护网站的开发人员，如果不熟悉这个模块，他要改的东西在e中，得从页面开始找到a，从a找到b、c，从c找到e，才能定位到模板所在，在模块非常多的情况下，这会让维护人员抓狂。另外，联调的时候让写php的工程师拼页面本来就是一件繁琐的工作，而这种简单粗暴的模块拆分方式，无疑加重了他们的麻烦，拼接页面的时候找来找去，相信会让非常多工程师受不了。
那么有没有聪明的做法？当然有，例如，可以事先把模块规划成对象，然后利用php封装，采用搭积木的方式在统一的地方进行拼接，例如——
（以下代码参考某框架，感谢曾经有幸一起共事的几位开发者，感谢某优秀前端开发团队，我以曾经是团队中一员为荣!）
$page = new&#160;Page($data);&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; 
&#160; &#160; $page-&#62;add('header',new&#160;xHeader($hd));
&#160; &#160; $page-&#62;add('search',new&#160;xBase($b3search, 'search'));
&#160; &#160; $page-&#62;add('list',new&#160;xBase($show_list, 'list'));
&#160; &#160; $page-&#62;add('pager',new&#160;xBase($pager, 'pager'));
&#160; &#160; $page-&#62;add('footer',new&#160;xFooter());
&#160; &#160; &#160; &#160; $page-&#62;extJs('piao/ext/switchcity.js');

我们会看到，这种方式下，有了页面、层和模块的概念，而这些布局、模块和内容，可以在一段php代码中build出来，易于统一管理和维护。而且这种代码方式，对php程序员来说更亲切（这样，在忙的时候，我们就更容易骗他们为我们干活），页面像搭积木一样，这多简单~
不过这也有一些不足之处，首先你必须先约定Header、Footer和其他容器的命名和相互关系，其次，你必须封装和扩展对应的类，第三，在页面比较复杂的时候，比如层嵌套的时候，这种描述也不那么直观，你很难直接看出数据与结构模块之间的关联关系。最后，它并没有想象中的那么灵活，在不额外开发的情况下，你不能随意配置和使用各种Layout结构和模块。
那么，我们有什么解决方案呢？先看下面一段代码——
$layout-&#62;{'Header hd'} = $hd;
$layout-&#62;{'Header search'} = $b3search;
$layout-&#62;{'Body list'} = $showlist;
$layout-&#62;{'Body pager'} = $pager;
$layout-&#62;{'Footer footer'} = $footer;
$layout-&#62;{'Footer extJs'} = $extJs;

这段代码结构简单，它把页面分成Layout容器和模块两个层级，{}之间是结构和模块的描述，模块是可以对应到views下面的module目录的文件，可以设定一个查找目录的规则，例如先找模板当前目录下的module目录，找不到，再去找views下面的module目录，这样就建立起模板管理的层级依赖关系来。=右边是赋给模板的变量，在module中可以用到。这种写法和上面一种写法的不同在于，它不用事先准备对象，所有的模块一律同样对待。它形式上只做简单直观的赋值操作，但定义了一套描述模块位置的语法。它足够灵活，不限制你构建任何模块，它只负责将这些模块找到，拼接到页面中去。它能做到足够灵活，看下面的代码：
$layout-&#62;{'Header hd'} = $hd;
$layout-&#62;{'Header search'} = $b3search;
$layout-&#62;{'Body layer_gride_3_5.Left list'} [...]]]></description>
			<content:encoded><![CDATA[<p>LAFE是个神马东东呢？听起来像个新鲜玩艺儿吧？<br />
要解释这个还蛮费劲的。而我这个人又比较懒，不喜欢长篇大论。（看我前一篇文章是啥时候更新的就知道我有多懒了=.=）<br />
为什么我不经常更新呢，一是我比较懒，二是我一般不喜欢经常码字的，特别是比较忙的时候，如果废话就会被老大发现我工作不饱和，然后说不定就有更多的活要做了……</p>
<p>额……<br />
还是言归正传，谈谈LAFE吧<br />
好吧，我们天天说模块化模块化，但是没有人真正说清楚，一般的开发过程中，如果我们要把前端设计成模块化开发，究竟应该肿么写代码才比较爽。如果只是简单把页面分成一块块的，然后把这些模块一一载入进来，拼成页面，那再简单也不过了。</p>
<p>但是现实没这么理想化，如果一个页面足够复杂，那么可能包含一个头部、一个底部、中间包含一个边拦，一个主栏，主栏里边可能又嵌套包含一个有头、身子、底的复杂结构，然后这种结构还能多重嵌套，这时候你就知道有多烦了。</p>
<p>模块化不仅仅只是拆，更烦的是拼装，如何把一个复杂页面很快速拼装出来呢，好吧，我们看看传统的方式是如何工作滴——</p>
<p>最初的办法是全部写在views下的模板中，例如php有include和require，smarty有include，假如一个a模板要引入b和c，那么就在a中直接写</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">include</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">b.php</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Blue;">?&gt;</span></li>
<li><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">include</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">c.php</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Blue;">?&gt;</span></li></ol></div>
<p>这种做法当然可以，但是在页面复杂的时候不可取，理由首先是不够灵活，现在我的a页面要套b和c，但是随着需求改变，如果我要新增一个把c换成d的页面，那么得重新写一个模板，写多了很难管理。另外页面模块加载会非常散乱，假如a引入b、c，b引入d、c引入e、f，一个维护网站的开发人员，如果不熟悉这个模块，他要改的东西在e中，得从页面开始找到a，从a找到b、c，从c找到e，才能定位到模板所在，在模块非常多的情况下，这会让维护人员抓狂。另外，联调的时候让写php的工程师拼页面本来就是一件繁琐的工作，而这种简单粗暴的模块拆分方式，无疑加重了他们的麻烦，拼接页面的时候找来找去，相信会让非常多工程师受不了。</p>
<p>那么有没有聪明的做法？当然有，例如，可以事先把模块规划成对象，然后利用php封装，采用搭积木的方式在统一的地方进行拼接，例如——<br />
<em>（以下代码参考某框架，感谢曾经有幸一起共事的几位开发者，感谢某优秀前端开发团队，我以曾经是团队中一员为荣!）</em></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$page</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Page</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">header</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xHeader</span><span style="color: Olive;">(</span><span style="color: #00008b;">$hd</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">search</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xBase</span><span style="color: Olive;">(</span><span style="color: #00008b;">$b3search</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">search</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">list</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xBase</span><span style="color: Olive;">(</span><span style="color: #00008b;">$show_list</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">list</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">pager</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xBase</span><span style="color: Olive;">(</span><span style="color: #00008b;">$pager</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">pager</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">footer</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xFooter</span><span style="color: Olive;">())</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$page</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">extJs</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">piao/ext/switchcity.js</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>我们会看到，这种方式下，有了页面、层和模块的概念，而这些布局、模块和内容，可以在一段php代码中build出来，易于统一管理和维护。而且这种代码方式，对php程序员来说更亲切（这样，在忙的时候，我们就更容易骗他们为我们干活），页面像搭积木一样，这多简单~</p>
<p>不过这也有一些不足之处，首先你必须先约定Header、Footer和其他容器的命名和相互关系，其次，你必须封装和扩展对应的类，第三，在页面比较复杂的时候，比如层嵌套的时候，这种描述也不那么直观，你很难直接看出数据与结构模块之间的关联关系。最后，它并没有想象中的那么灵活，在不额外开发的情况下，你不能随意配置和使用各种Layout结构和模块。</p>
<p>那么，我们有什么解决方案呢？先看下面一段代码——</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Header hd</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$hd</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Header search</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$b3search</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Body list</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$showlist</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Body pager</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$pager</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Footer footer</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$footer</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Footer extJs</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$extJs</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>这段代码结构简单，它把页面分成Layout容器和模块两个层级，{}之间是结构和模块的描述，模块是可以对应到views下面的module目录的文件，可以设定一个查找目录的规则，例如先找模板当前目录下的module目录，找不到，再去找views下面的module目录，这样就建立起模板管理的层级依赖关系来。=右边是赋给模板的变量，在module中可以用到。这种写法和上面一种写法的不同在于，它不用事先准备对象，所有的模块一律同样对待。它形式上只做简单直观的赋值操作，但定义了一套描述模块位置的语法。它足够灵活，不限制你构建任何模块，它只负责将这些模块找到，拼接到页面中去。它能做到足够灵活，看下面的代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Header hd</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$hd</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Header search</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$b3search</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Body layer_gride_3_5.Left list</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$showlist</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Body layer_gride_3_5.Left pager</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$pager</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Body layer_gride_3_5.Right list</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$rightside</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Footer footer</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$footer</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$layout</span><span style="color: Gray;">-&gt;</span><span style="color: Olive;">{</span><span style="color: #8b0000;">'</span><span style="color: Red;">Footer extJs</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$extJs</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>在这里，我们在模板中嵌套了另一层Layout，也就是layer_gride_3_5，它至少有Left和Right两个结构，这样我们就做到了Layout的层级嵌套。<br />
用这套东西还能写出很多好玩的代码来，比如我可以在{}里面用变量，等等等等，还有很多可以想象的事情，这些在下一篇文章里我在详细介绍吧（=.=不过不知道下一篇啥时候更新）</p>
<p>最后，无码无真相，放上代码—— <a href="https://github.com/akira-cn/lafe">https://github.com/akira-cn/lafe</a></p>
<p>谢谢观赏~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=228</wfw:commentRss>
		</item>
		<item>
		<title>[偷懒]本地web开发的一体化解决方案</title>
		<link>http://www.silverna.org/blog/?p=223</link>
		<comments>http://www.silverna.org/blog/?p=223#comments</comments>
		<pubDate>Thu, 09 Jun 2011 09:37:55 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=223</guid>
		<description><![CDATA[最近在新公司研究PHP开发的前端方案，考虑用CodeIgniter+Smarty3的方案。研究了一下nginx+PHP+CI+Smarty的配置。
感谢明城(@gracecode)同学提供的Farseer，真是个方便实用的好东东~
整合的Farseer-QWDIY，windows下解压到任意目录就可以直接使用，集成CI和Smarty3，脚本库集成QWrap，无需修改配置，直接访问
http://localhost
就可以看到欢迎界面啦~
]]></description>
			<content:encoded><![CDATA[<p>最近在新公司研究PHP开发的前端方案，考虑用<a href="http://codeigniter.com/" target="_blank">CodeIgniter</a>+<a href="http://smarty.net/">Smarty3</a>的方案。研究了一下nginx+PHP+CI+Smarty的配置。</p>
<p>感谢明城(@gracecode)同学提供的<a href="http://code.google.com/p/gracecode/wiki/Farseer" target="_blank">Farseer</a>，真是个方便实用的好东东~</p>
<p>整合的<a href="https://github.com/akira-cn/Farseer-QWDIY" target="_blank">Farseer-QWDIY</a>，windows下解压到任意目录就可以直接使用，集成CI和Smarty3，脚本库集成<a href="http://www.qwrap.com/" target="_blank">QWrap</a>，无需修改配置，直接访问<br />
http://localhost<br />
就可以看到欢迎界面啦~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=223</wfw:commentRss>
		</item>
		<item>
		<title>【广告】《程序员成长的烦恼》</title>
		<link>http://www.silverna.org/blog/?p=219</link>
		<comments>http://www.silverna.org/blog/?p=219#comments</comments>
		<pubDate>Tue, 22 Mar 2011 09:11:40 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=219</guid>
		<description><![CDATA[低调滴做个广告。。。
http://book.douban.com/subject/6024321/

]]></description>
			<content:encoded><![CDATA[<p>低调滴做个广告。。。<br />
<a href="http://book.douban.com/subject/6024321/">http://book.douban.com/subject/6024321/</a></p>
<p><img src="http://www.silverna.org/blog/wp-content/uploads/2011/03/e7a88be5ba8fe59198e79a84e68890e995bfe783a6e681bc-e695b4e4bd93e5b081e99da2_20110321-e5b081e4b880-218x300.jpg" alt="程序员成长的烦恼" title="程序员成长的烦恼" width="218" height="300" class="alignnone size-medium wp-image-220" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=219</wfw:commentRss>
		</item>
		<item>
		<title>【小技巧】QWrap核心中的几个不起眼小方法使用技巧（一）</title>
		<link>http://www.silverna.org/blog/?p=211</link>
		<comments>http://www.silverna.org/blog/?p=211#comments</comments>
		<pubDate>Wed, 16 Mar 2011 09:28:37 +0000</pubDate>
		<dc:creator>月影</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[前端技术]]></category>

		<guid isPermaLink="false">http://www.silverna.org/blog/?p=211</guid>
		<description><![CDATA[http://www.qwrap.com/
1. ObjectH.dump
用ObjectH.dump 方法可以将非枚举类型的方法从原生对象中“提取”出来
QW.ObjectH.mix(window, QW);
&#160;
var&#160;ah = ObjectH.dump(Array, [&#34;join&#34;,&#34;reverse&#34;,&#34;push&#34;,&#34;pop&#34;,&#34;concat&#34;,&#34;slice&#34;,&#34;splice&#34;]); //提出Array的以上方法
ah.toString = function(arr){
&#160; &#160; return&#160;arr.toString();
}
&#160;
var&#160;List = function(arr){
&#160; &#160; this.items = arr;
}
&#160;
ah = HelperH.methodize(ah, &#34;items&#34;);
ObjectH.mix(List.prototype, ah, true);
&#160;
var&#160;myList = new List([1,2,3,4]);
myList.push(5);
alert(myList); //[1,2,3,4,5]

2.ObjectH.create
ObjectH.create方法可以利用对象的原型快速创建一个新对象，例如：
function Foo(x, y){
&#160; &#160; this.x = x;
&#160; &#160; this.y = y;
}
var&#160;f1 = new Foo(1,2);
var&#160;f2 = ObjectH.create(f1,{x:3,y:4}); //相当于 f2 = new Foo(3,4);
这个用在需要copy匿名类的对象或者多态类的设计模式里边的对象复制特别有效（例如在装饰器里，你在复制对象进行操作之前不必关心具体的装饰器类型是哪一个，因为你只要保证复制出来的那个对象的类型和原始对象的类型相同就好了，而create确实保证了这个）
3. FunctionH.bind
实际上在ECMA v5的标准里，bind除了绑定this，还有固化参数的作用的，所以它能起到的作用类似于currying
function Foo(x, y){
&#160; &#160; return&#160;x+y;
}
var&#160;Foo5 = FunctionH.bind(Foo, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.qwrap.com/">http://www.qwrap.com/</a></p>
<p><strong>1. ObjectH.dump</strong></p>
<p>用ObjectH.dump 方法可以将非枚举类型的方法从原生对象中“提取”出来</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">QW</span><span style="color: Gray;">.</span><span style="color: Blue;">ObjectH</span><span style="color: Gray;">.</span><span style="color: Blue;">mix</span><span style="color: Olive;">(</span><span style="color: Teal;">window</span><span style="color: Gray;">, </span><span style="color: Blue;">QW</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">ah</span><span style="color: Gray;"> = </span><span style="color: Blue;">ObjectH</span><span style="color: Gray;">.</span><span style="color: Blue;">dump</span><span style="color: Olive;">(</span><span style="color: Teal;">Array</span><span style="color: Gray;">, </span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">join</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">reverse</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">push</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pop</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">concat</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">slice</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">splice</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//提出Array的以上方法</span></li>
<li><span style="color: Blue;">ah</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">arr</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">arr</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">List</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">arr</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">items</span><span style="color: Gray;"> = </span><span style="color: Blue;">arr</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">ah</span><span style="color: Gray;"> = </span><span style="color: Blue;">HelperH</span><span style="color: Gray;">.</span><span style="color: Blue;">methodize</span><span style="color: Olive;">(</span><span style="color: Blue;">ah</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">items</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">ObjectH</span><span style="color: Gray;">.</span><span style="color: Blue;">mix</span><span style="color: Olive;">(</span><span style="color: Blue;">List</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;">, </span><span style="color: Blue;">ah</span><span style="color: Gray;">, </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">myList</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">List</span><span style="color: Olive;">([</span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Gray;">,</span><span style="color: Maroon;">3</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">myList</span><span style="color: Gray;">.</span><span style="color: Blue;">push</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">myList</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//[1,2,3,4,5]</span></li></ol></div>
<p><span id="more-211"></span></p>
<p><strong>2.ObjectH.create</strong></p>
<p>ObjectH.create方法可以利用对象的原型快速创建一个新对象，例如：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">Foo</span><span style="color: Olive;">(</span><span style="color: Blue;">x</span><span style="color: Gray;">, </span><span style="color: Blue;">y</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">x</span><span style="color: Gray;"> = </span><span style="color: Blue;">x</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">y</span><span style="color: Gray;"> = </span><span style="color: Blue;">y</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">f1</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Foo</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">f2</span><span style="color: Gray;"> = </span><span style="color: Blue;">ObjectH</span><span style="color: Gray;">.</span><span style="color: Blue;">create</span><span style="color: Olive;">(</span><span style="color: Blue;">f1</span><span style="color: Gray;">,</span><span style="color: Olive;">{</span><span style="color: Blue;">x</span><span style="color: Gray;">:</span><span style="color: Maroon;">3</span><span style="color: Gray;">,</span><span style="color: Blue;">y</span><span style="color: Gray;">:</span><span style="color: Maroon;">4</span><span style="color: Olive;">})</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//相当于 f2 = new Foo(3,4);</span></li></ol></div>
<p>这个用在需要copy匿名类的对象或者多态类的设计模式里边的对象复制特别有效（例如在装饰器里，你在复制对象进行操作之前不必关心具体的装饰器类型是哪一个，因为你只要保证复制出来的那个对象的类型和原始对象的类型相同就好了，而create确实保证了这个）</p>
<p><strong>3. FunctionH.bind</strong></p>
<p>实际上在ECMA v5的标准里，bind除了绑定this，还有固化参数的作用的，所以它能起到的作用类似于currying</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">Foo</span><span style="color: Olive;">(</span><span style="color: Blue;">x</span><span style="color: Gray;">, </span><span style="color: Blue;">y</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">x</span><span style="color: Gray;">+</span><span style="color: Blue;">y</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Foo5</span><span style="color: Gray;"> = </span><span style="color: Blue;">FunctionH</span><span style="color: Gray;">.</span><span style="color: Blue;">bind</span><span style="color: Olive;">(</span><span style="color: Blue;">Foo</span><span style="color: Gray;">, </span><span style="color: Green;">null</span><span style="color: Gray;">, </span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">Foo5</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Olive;">))</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//5+10</span></li></ol></div>
<p><strong>4. FunctionH.lazyApply</strong></p>
<p>懒惰执行是一个不起眼的方法，但是它有时候很有用。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">deal</span><span style="color: Olive;">(</span><span style="color: Blue;">x</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">y</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">10</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">y</span><span style="color: Gray;"> += </span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">pow</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">x</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">y</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">FunctionH</span><span style="color: Gray;">.</span><span style="color: Blue;">lazyApply</span><span style="color: Olive;">(</span><span style="color: Blue;">deal</span><span style="color: Gray;">,</span><span style="color: Green;">null</span><span style="color: Gray;">,</span><span style="color: Olive;">[</span><span style="color: Maroon;">2</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">0</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">random</span><span style="color: Olive;">()</span><span style="color: Gray;">&gt;</span><span style="color: Maroon;">0.5</span><span style="color: Gray;">?</span><span style="color: Maroon;">1</span><span style="color: Gray;">:-</span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span><span style="color: Olive;">})</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">//只有一半的机会执行deal方法</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.silverna.org/blog/?feed=rss2&amp;p=211</wfw:commentRss>
		</item>
	</channel>
</rss>

