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

<channel>
	<title>Thinkly Blog</title>
	<atom:link href="http://www.thinkly.cn/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.thinkly.cn</link>
	<description>Blog Your Think !</description>
	<lastBuildDate>Wed, 10 Mar 2010 15:44:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>通用php数组（array）与xml相互转换函数</title>
		<link>http://www.thinkly.cn/index.php/archives/416</link>
		<comments>http://www.thinkly.cn/index.php/archives/416#comments</comments>
		<pubDate>Wed, 10 Mar 2010 15:44:13 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[array2xml]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml2array]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/416</guid>
		<description><![CDATA[最近做一个项目，需要和其他的程序进行对接，xml是交互数据的首选，所以，我需要一个函数能把php的数组转换成xml字符串，又同时可以把字符串再还原回php数组，其实是很简单的递归调用，发出来备用
函数定义：
/* 将数组格式化为XML字符串 */
function array2xml($array,$level = 0){
    $return = '';
    if($level == 0){
        $return = '&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; ?&#62;&#60;root&#62;';
    }
    foreach($array as $key =&#62; $item){
        if(!is_array($item)){
     [...]]]></description>
			<content:encoded><![CDATA[<p>最近做一个项目，需要和其他的程序进行对接，xml是交互数据的首选，所以，我需要一个函数能把php的数组转换成xml字符串，又同时可以把字符串再还原回php数组，其实是很简单的递归调用，发出来备用</p>
<p>函数定义：</p>
<pre class="brush: php;">/* 将数组格式化为XML字符串 */
function array2xml($array,$level = 0){
    $return = '';
    if($level == 0){
        $return = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;root&gt;';
    }
    foreach($array as $key =&gt; $item){
        if(!is_array($item)){
            $return .= &quot;&lt;item key='{$key}'&gt;{$item}&lt;/item&gt;&quot;;
        }else{
            $return .= &quot;&lt;item key='{$key}'&gt;&quot;;
            $return .= array2xml($item,$level + 1);
            $return .= &quot;&lt;/item&gt;&quot;;
        }
    }
    if($level == 0){
        $return .= '&lt;/root&gt;';
    }
    return $return;
}

/* 辅助函数用来获取DOM跟节点 */
function getXmlRoot($xml){
	$doc = new DOMDocument();
	$doc-&gt;loadXML($xml);
	$root = $doc-&gt;documentElement;
	return $root;
}

/* 将被array2xml格式化的XML还原 */
function xml2array($xml){
	$return_array = array();
	foreach($xml-&gt;childNodes as $node){
		$length = $node-&gt;childNodes-&gt;length;
		$key = $node-&gt;getAttribute('key');
		if($length == 1 and $node-&gt;firstChild-&gt;nodeType == XML_TEXT_NODE){
			$return_array[$key] = $node-&gt;nodeValue;
		}else{
			$return_array[$key] = xml2array($node);
		}
	}
	return $return_array;
}</pre>
<p>使用方法：</p>
<p><span id="more-416"></span></p>
<p>1. array转换为xml</p>
<pre class="brush: php;">$array = array(
	'aaa' =&gt; array(
		'title' =&gt; 'random test',
		'value' =&gt; md5(microtime())
	),
	'bbb' =&gt; array(
		'title' =&gt; 'fixed test',
		'value' =&gt; '2010-01-01'
	),
	'ccc' =&gt; 'this is c',
	'ddd' =&gt; array(
		array(
			time()
		),
		array(
			time()
		),
		array(
			time()
		),
		array(
			time()
		)
	)
);

$xml = array2xml($array);
echo $xml;</pre>
<p>运行结果为：</p>
<pre class="brush: xml;">  &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
- &lt;root&gt;
- &lt;item key=&quot;aaa&quot;&gt;
  &lt;item key=&quot;title&quot;&gt;random test&lt;/item&gt;
  &lt;item key=&quot;value&quot;&gt;2880f538686cf239481a70366047a619&lt;/item&gt;
  &lt;/item&gt;
- &lt;item key=&quot;bbb&quot;&gt;
  &lt;item key=&quot;title&quot;&gt;fixed test&lt;/item&gt;
  &lt;item key=&quot;value&quot;&gt;2010-01-01&lt;/item&gt;
  &lt;/item&gt;
  &lt;item key=&quot;ccc&quot;&gt;this is c&lt;/item&gt;
- &lt;item key=&quot;ddd&quot;&gt;
- &lt;item key=&quot;0&quot;&gt;
  &lt;item key=&quot;0&quot;&gt;1268222560&lt;/item&gt;
  &lt;/item&gt;
- &lt;item key=&quot;1&quot;&gt;
  &lt;item key=&quot;0&quot;&gt;1268222560&lt;/item&gt;
  &lt;/item&gt;
- &lt;item key=&quot;2&quot;&gt;
  &lt;item key=&quot;0&quot;&gt;1268222560&lt;/item&gt;
  &lt;/item&gt;
- &lt;item key=&quot;3&quot;&gt;
  &lt;item key=&quot;0&quot;&gt;1268222560&lt;/item&gt;
  &lt;/item&gt;
  &lt;/item&gt;
  &lt;/root&gt;</pre>
<p>2. xml转换为array</p>
<pre class="brush: php;">&lt;?php
$array = array(
	'aaa' =&gt; array(
		'title' =&gt; 'random test',
		'value' =&gt; md5(microtime())
	),
	'bbb' =&gt; array(
		'title' =&gt; 'fixed test',
		'value' =&gt; '2010-01-01'
	),
	'ccc' =&gt; 'this is c',
	'ddd' =&gt; array(
		array(
			time()
		),
		array(
			time()
		),
		array(
			time()
		),
		array(
			time()
		)
	)
);

/* 使用方法 */
$xml = array2xml($array);
$array2 = xml2array(getXmlRoot($xml));
print_r($array);
echo '&lt;br&gt;&lt;br&gt;';
print_r($array2);
exit();
?&gt;</pre>
<p>运行结果为：</p>
<pre class="brush: text;">Array ( [aaa] =&gt; Array ( [title] =&gt; random test [value] =&gt; fb5519e565162c6ac69700bb4c4a13c2 ) [bbb] =&gt; Array ( [title] =&gt; fixed test [value] =&gt; 2010-01-01 ) [ccc] =&gt; this is c [ddd] =&gt; Array ( [0] =&gt; Array ( [0] =&gt; 1268235843 ) [1] =&gt; Array ( [0] =&gt; 1268235843 ) [2] =&gt; Array ( [0] =&gt; 1268235843 ) [3] =&gt; Array ( [0] =&gt; 1268235843 ) ) ) 

Array ( [aaa] =&gt; Array ( [title] =&gt; random test [value] =&gt; fb5519e565162c6ac69700bb4c4a13c2 ) [bbb] =&gt; Array ( [title] =&gt; fixed test [value] =&gt; 2010-01-01 ) [ccc] =&gt; this is c [ddd] =&gt; Array ( [0] =&gt; Array ( [0] =&gt; 1268235843 ) [1] =&gt; Array ( [0] =&gt; 1268235843 ) [2] =&gt; Array ( [0] =&gt; 1268235843 ) [3] =&gt; Array ( [0] =&gt; 1268235843 ) ) ) </pre>
<p>&#160;</p>
<p>enjoy！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/416/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery插件开发模式</title>
		<link>http://www.thinkly.cn/index.php/archives/414</link>
		<comments>http://www.thinkly.cn/index.php/archives/414#comments</comments>
		<pubDate>Thu, 04 Mar 2010 04:08:10 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/414</guid>
		<description><![CDATA[原文：
http://www.learningjquery.com/2007/10/a-plugin-development-pattern
翻译：
我已经开发基于JQuery的插件有一段时间了，对于各种形式和要求的插件开发有了较好的掌握。在这里，我将在本文中分享我认为十分有用的插件开发方式。当前前提是假定你对JQuery的插件开发有一定了解，如果你是插件开发的新手，不妨先看看jQuery官网上的the jQuery Authoring Guidelines。 
我认为以下插件开发模式是必须应该掌握的： 
1.在JQuery命名空间内声明一个特定的命名；   2.接收参数来控制插件的行为；    3.提供公有方法访问插件的配置项值；    4.提供公有方法来访问插件中其他的方法（如果可能的话）；    5.保证私有方法是私有的；    6.支持元数据插件； 
下面，我将逐一讲述上面的内容，并在同时给出相关的简单插件开发代码。 
 
1.在JQuery命名空间内声明一个特定的命名   这意味着开发的是一个单一命名的插件脚本，如果你的脚本包含多个插件或者有补充性质的插件，比如$.fn.doSomething() 和$.fn.undoSomething()，那你得声明多个命名了。但是总体来说，当开发一个插件时，我们应该努力做到用一个单一的命名来搞定整个插件。 
在例子中，我们将声明一个名为&#34;hilight&#34;的插件。
// plugin definition
$.fn.hilight = function() {
  // Our plugin implementation code goes here.
};
我们可以这样调用：
$('#myDiv').hilight();
但是假如我们需要打破这种单一的命名和调用方式呢？有很多理由支持我们这么做：设计上的需要；更加简单和可读的配置；而且那样将更加符合OO的要求。 
在没有给命名空间来到麻烦的前提下，将插件的部署打破成为多个函数的形式将是十分繁琐的。我们通过认识并利用JavaScript中functions是最高层的对象，和其他对象一样，functions可以被赋予属性，前面我们已经将hilight命名声明在了JQuery的原型对象上，那么，其实，其他的我们想扩展的属性或对象都能够在hilight上进行声明。稍后将详细讲述此点。 
2.接收参数来控制插件的行为；
  来为我们的hilight插件添加指定前景和背景色的功能，我们需要在函数中允许一个object类型的选项设置。如下所展示的那样：
// plugin definition
$.fn.hilight = function(options) {
 [...]]]></description>
			<content:encoded><![CDATA[<p>原文：</p>
<p><a title="http://www.learningjquery.com/2007/10/a-plugin-development-pattern" href="http://www.learningjquery.com/2007/10/a-plugin-development-pattern">http://www.learningjquery.com/2007/10/a-plugin-development-pattern</a></p>
<p>翻译：</p>
<p>我已经开发基于JQuery的插件有一段时间了，对于各种形式和要求的插件开发有了较好的掌握。在这里，我将在本文中分享我认为十分有用的插件开发方式。当前前提是假定你对JQuery的插件开发有一定了解，如果你是插件开发的新手，不妨先看看jQuery官网上的the jQuery Authoring Guidelines。 </p>
<p>我认为以下插件开发模式是必须应该掌握的： </p>
<p>1.在JQuery命名空间内声明一个特定的命名；   <br />2.接收参数来控制插件的行为；    <br />3.提供公有方法访问插件的配置项值；    <br />4.提供公有方法来访问插件中其他的方法（如果可能的话）；    <br />5.保证私有方法是私有的；    <br />6.支持元数据插件； </p>
<p>下面，我将逐一讲述上面的内容，并在同时给出相关的简单插件开发代码。 </p>
<p> <span id="more-414"></span>
<p>1.在JQuery命名空间内声明一个特定的命名   <br />这意味着开发的是一个单一命名的插件脚本，如果你的脚本包含多个插件或者有补充性质的插件，比如$.fn.doSomething() 和$.fn.undoSomething()，那你得声明多个命名了。但是总体来说，当开发一个插件时，我们应该努力做到用一个单一的命名来搞定整个插件。 </p>
<p>在例子中，我们将声明一个名为&quot;hilight&quot;的插件。</p>
<pre class="brush: js;">// plugin definition
$.fn.hilight = function() {
  // Our plugin implementation code goes here.
};</pre>
<p>我们可以这样调用：</p>
<pre class="brush: js;">$('#myDiv').hilight();</pre>
<p>但是假如我们需要打破这种单一的命名和调用方式呢？有很多理由支持我们这么做：设计上的需要；更加简单和可读的配置；而且那样将更加符合OO的要求。 </p>
<p>在没有给命名空间来到麻烦的前提下，将插件的部署打破成为多个函数的形式将是十分繁琐的。我们通过认识并利用JavaScript中functions是最高层的对象，和其他对象一样，functions可以被赋予属性，前面我们已经将hilight命名声明在了JQuery的原型对象上，那么，其实，其他的我们想扩展的属性或对象都能够在hilight上进行声明。稍后将详细讲述此点。 </p>
<p>2.接收参数来控制插件的行为；<br />
  <br />来为我们的hilight插件添加指定前景和背景色的功能，我们需要在函数中允许一个object类型的选项设置。如下所展示的那样：</p>
<pre class="brush: js;">// plugin definition
$.fn.hilight = function(options) {
  var defaults = {
 foreground: 'red',
 background: 'yellow'
  };
  // Extend our default options with those provided.
  var opts = $.extend(defaults, options);
  // Our plugin implementation code goes here.
};</pre>
<p>现在，我们的插件可以这样来调用：</p>
<pre class="brush: js;">$('#myDiv').hilight({
  foreground: 'blue'
});</pre>
<p>3.提供公有方法访问插件的配置项值；<br />
  <br />上面的代码我们可以做一下改进，使得插件的默认值可以在插件之外被设置。这无疑是十分重要的，因为它使得插件用户可以使用最少的代码来修改插件配置，这其实是我们利用函数对象的开始。</p>
<pre class="brush: js;">// plugin definition
$.fn.hilight = function(options) {
  // Extend our default options with those provided.
  // Note that the first arg to extend is an empty object -
  // this is to keep from overriding our &quot;defaults&quot; object.
  var opts = $.extend({}, $.fn.hilight.defaults, options);
  // Our plugin implementation code goes here.
};
// plugin defaults - added as a property on our plugin function
$.fn.hilight.defaults = {
  foreground: 'red',
  background: 'yellow'
};</pre>
<p>4.提供公有方法来访问插件中其他的方法（如果可能的话）<br />
  <br />这里要讲的方法和前面的讲解一脉相承，用此方法来扩展你的插件（而且能够让其他人进行扩展）是件很有意思的事情。例如，在扩展hilight插件时，我们可以定义一个format方法用来格式化高亮显示的文本，原来的hilight插件和扩展了format方法的插件代码如下：</p>
<pre class="brush: js;">// plugin definition
$.fn.hilight = function(options) {
  // iterate and reformat each matched element
  return this.each(function() {
 var $this = $(this);
 // ...
 var markup = $this.html();
 // call our format function
 markup = $.fn.hilight.format(markup);
 $this.html(markup);
  });
};
// define our format function
$.fn.hilight.format = function(txt) {'
 return '&lt;strong&gt;' + txt + '&lt;/strong&gt;';
};</pre>
<p>如前面所述，我们已经很容易的通过设置options对象的属性来允许一个回调函数来覆写默认的格式设置。在这里有另外一个非常棒的方法来个性化你的插件，上面展示的方法实际上就是通过暴露format方法，使其可以被重新定义。这种做法使得其他人可以采用他们自己的习惯和方式来重写你的插件，这意味着他们可以为你的插件写额外的扩展插件。<br />
  <br />仔细考量一下前面我们用到的插件例子程序，你可能会想“我们究竟应该在什么时候使用这种插件方式来实现需求”的问题。一个来自现实应用中的插件便是“ Cycle Plugin”，它是一个支持多种滑动显示特效的插件，特效包括滚动、滑动和渐变等等。但是，实际上，并没有办法来定义每一个可能会用在滑动变幻上的特效。这就是这种扩展方式的有用之处。“Cycle Plugin”插件暴露了”transitions”对象，这使得用户只需要按照如下方式便可以添加自己的变幻定义：</p>
<pre class="brush: js;">$.fn.cycle.transitions = {
 // ...
};</pre>
<p>这种技巧使得用户可以定义或者采用自己习惯的方式来扩展“ Cycle Plugin”。 </p>
<p>5.保证私有方法是私有的；<br />
  <br />上面提到的暴露插件中的公有方法的技巧使得插件能够被覆写，这将使插件变得十分灵活而强大，但至于哪一部分，那些属性和方法应该被暴露出来，你得小心了。一旦使其能够被外界访问到，你就得注意到任何调用参数和语义化的变动都可能使其丧失向前的兼容性。作为一般准则，如果不确定是否应该暴露某个属性或对象的话，那就最好别那样做。</p>
<p>那么我们应该怎样来定义多个方法而不至于使命名空间混乱并且保证不被暴露再外呢？这就是闭包的工作，为了便于演示，我们给插件加入了一个叫做“debug”的功能，它用来记录firebug控制台所选择的网页元素数目。为了创建一个闭包，我们将整个功能的定义放入在一个function中了（有关这方面的知识，可参见JQuery手册）。</p>
<pre class="brush: js;">// create closure
(function($) {
  // plugin definition
  $.fn.hilight = function(options) {
 debug(this);
 // ...
  };
  // private function for debugging
  function debug($obj) {
 if (window.console &amp;&amp; window.console.log)
   window.console.log('hilight selection count: ' + $obj.size());
  };
 //  ...
// end of closure
})(jQuery);</pre>
<p>debug方法在这里是无法被在插件以外访问到的，因此，我们称之为它是插件私有的。 </p>
<p>6.支持元数据插件；<br />
  <br />根据你所写的插件的类型，为你的插件加入元数据插件的支持将使其变得更强大。就我个人来说，喜欢采用元数据插件的重要原因便是它可以让你使用定义之外的标签来覆写你的插件属性设置（这在创建demo和例子时十分有用），而且支持它十分的简单。</p>
<p>更新：这部分内容可以在本文的评论中展开讨论（既然有争议的话）</p>
<pre class="brush: js;">// plugin definition
$.fn.hilight = function(options) {
  // ...
  // build main options before element iteration
  var opts = $.extend({}, $.fn.hilight.defaults, options);
  return this.each(function() {
 var $this = $(this);
 // build element specific options
 var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
 //...</pre>
<p>改动部分的代码会做如下的事情：<br />
  <br />*测试metadata插件是否可用</p>
<p>*如果可以，将用metadata扩展options对象</p>
<p>这被加入到jQuery.extend，作为其最后一个参数，所以它可以覆写任何其他参数设置。现在我们可以通过下面的方式控制其行为：</p>
<pre class="brush: xml;">&lt;!--  markup  --&gt;
&lt;div class=&quot;hilight { background: 'red', foreground: 'white' }&quot;&gt;
  Have a nice day!
&lt;/div&gt;
&lt;div class=&quot;hilight { foreground: 'orange' }&quot;&gt;
  Have a nice day!
&lt;/div&gt;
&lt;div class=&quot;hilight { background: 'green' }&quot;&gt;
  Have a nice day!
&lt;/div&gt;</pre>
<p>而在调用方面，我们通过一行简单的代码就可以实现预期的效果：</p>
<pre class="brush: js;">$('.hilight').hilight();</pre>
<p>将上面所述内容涉及到的代码放在一起，完整的例子程序代码如下：</p>
<pre class="brush: js;">//
// create closure
//
(function($) {
  //
  // plugin definition
  //
  $.fn.hilight = function(options) {
 debug(this);
 // build main options before element iteration
 var opts = $.extend({}, $.fn.hilight.defaults, options);
 // iterate and reformat each matched element
 return this.each(function() {
   $this = $(this);
   // build element specific options
   var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
   // update element styles
   $this.css({
  backgroundColor: o.background,
  color: o.foreground
   });
   var markup = $this.html();
   // call our format function
   markup = $.fn.hilight.format(markup);
   $this.html(markup);
 });
  };
  //
  // private function for debugging
  //
  function debug($obj) {
 if (window.console &amp;&amp; window.console.log)
   window.console.log('hilight selection count: ' + $obj.size());
  };
  //
  // define and expose our format function
  //
  $.fn.hilight.format = function(txt) {
 return '&lt;strong&gt;' + txt + '&lt;/strong&gt;';
  };
  //
  // plugin defaults
  //
  $.fn.hilight.defaults = {
 foreground: 'red',
 background: 'yellow'
  };
//
// end of closure
//
})(jQuery);</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/414/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 插件代码编写模板 jQuery-Plugin-Template</title>
		<link>http://www.thinkly.cn/index.php/archives/405</link>
		<comments>http://www.thinkly.cn/index.php/archives/405#comments</comments>
		<pubDate>Thu, 04 Mar 2010 02:54:48 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/405</guid>
		<description><![CDATA[原文：
http://www.cnitblog.com/lxasp/archive/2009/08/22/60923.html
jQuery简实插件库：
http://www.lxasp.com/jq/
jQuery-Plugin-Template 代码：
 
/*

@name: jQuery Plugin Template for Coding

*/

;(function($) {//[--jQuery Plugin Container

//declare the plugin's version ; use to check the plugin exists

$.__plugin_name__ = $.__plugin_name__ &#124;&#124; {version:'0.1.0'};

//[--Plugin Define

var __plugin_name__ = function(node,opts) {

var me=this,$me=$(this);

var $mine=$(node); //get the plugin's Operation jQuery DOM Element

//Public Methods

$.extend(me, {

show: function() {

__show__();

},

hide: function() {

__hide__();

},

options: function() {

//return the preset options to users code

//let users can [...]]]></description>
			<content:encoded><![CDATA[<p>原文：</p>
<p>http://www.cnitblog.com/lxasp/archive/2009/08/22/60923.html</p>
<p>jQuery简实插件库：</p>
<p><a href="http://www.lxasp.com/jq/">http://www.lxasp.com/jq/</a></p>
<p>jQuery-Plugin-Template 代码：</p>
<p> <span id="more-405"></span>
<pre class="brush: js;">/*

@name: jQuery Plugin Template for Coding

*/

;(function($) {//[--jQuery Plugin Container

//declare the plugin's version ; use to check the plugin exists

$.__plugin_name__ = $.__plugin_name__ || {version:'0.1.0'};

//[--Plugin Define

var __plugin_name__ = function(node,opts) {

var me=this,$me=$(this);

var $mine=$(node); //get the plugin's Operation jQuery DOM Element

//Public Methods

$.extend(me, {

show: function() {

__show__();

},

hide: function() {

__hide__();

},

options: function() {

//return the preset options to users code

//let users can be change options by later code

return opts;

}

});

//Private Variables ( Module Level )

var m_var1, m_var2, m_var3;

//init the plugin

function __init__(){

alert('jQuery Plugin init');

if (opts.autoShow) __show__();

}

__init__();

//Private Functions

function __show__(){

//function code

$mine.text('Hello jQuery Plugin !');

//call the event

opts.onShow(me,opts);

}

function __hide__(){

//function code

$mine.text('');

//call the event

opts.onHide(me,opts);

}

};//--]Plugin Define

//jQuery Plugin Implementation

$.fn.__plugin_name__ = function(conf) {

//return existing instance // let users can use the Public Methods

//Usage: var obj = $('#id').__plugin_name__({ &lt;options&gt; }).data(&quot;__plugin_name__&quot;);

var el = this.eq(typeof conf == 'number' ? conf : 0).data(&quot;__plugin_name__&quot;);

if (el) { return el; }

//setup default options

var opts = {

autoShow:true,

onShow:function(e,o){},

onHide:function(e,o){},

api:false

};

//if no users options then use the default options

$.extend(opts, conf);

// install the plugin for each items in jQuery

this.each(function() {

el = new __plugin_name__(this, opts);

$(this).data(&quot;__plugin_name__&quot;, el);

});

//api=true let users can immediate use the Public Methods

return opts.api ? el: this;

};

})(jQuery);//--]jQuery Plugin Container</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/405/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 下使用 Doxygen</title>
		<link>http://www.thinkly.cn/index.php/archives/403</link>
		<comments>http://www.thinkly.cn/index.php/archives/403#comments</comments>
		<pubDate>Mon, 22 Feb 2010 07:13:06 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/403</guid>
		<description><![CDATA[一、安装Doxygen：(官方网站：http://www.stack.nl/~dimitri/doxygen/)

sudo apt-get install doxygen doxygen-doc doxygen-gui graphviz

注：如果要生成png格式的图片，必须安装Graphviz软件。
出现下提示信息的话，则就不要安doxygen-gui了：sudo apt-get install doxygen doxygen-doc graphviz
现在没有可用的软件包 doxygen-gui，但是它被其它的软件包引用了。
E: 软件包 doxygen-gui 还没有可供安装的候选者

二、Doxygen 的工作过程可分为三个步骤：

   1. 配置 Doxygen 工作环境，生成 Doxygen 配置文件；
   2. 在程序源码中添加符合 Doxygen 可解析的注释格式；
   3. 使用 Doxygen 解析源码，输出格式化文档。

三、Doxygen常用标签命令关键字：
1. 文件信息：
　 1) @file       &#8211;&#62; 文件声明，即当前文件名
　 2) @author  &#8211;&#62; 作者
　 3) @version [...]]]></description>
			<content:encoded><![CDATA[<p>一、安装Doxygen：(官方网站：http://www.stack.nl/~dimitri/doxygen/)</p>
</p>
<p>sudo apt-get install doxygen doxygen-doc doxygen-gui graphviz</p>
</p>
<p>注：如果要生成png格式的图片，必须安装Graphviz软件。</p>
<p>出现下提示信息的话，则就不要安doxygen-gui了：sudo apt-get install doxygen doxygen-doc graphviz</p>
<p>现在没有可用的软件包 doxygen-gui，但是它被其它的软件包引用了。</p>
<p>E: 软件包 doxygen-gui 还没有可供安装的候选者</p>
</p>
<p>二、Doxygen 的工作过程可分为三个步骤：</p>
</p>
<p>   1. 配置 Doxygen 工作环境，生成 Doxygen 配置文件；</p>
<p>   2. 在程序源码中添加符合 Doxygen 可解析的注释格式；</p>
<p>   3. 使用 Doxygen 解析源码，输出格式化文档。</p>
</p>
<p>三、Doxygen常用标签命令关键字：</p>
<p>1. 文件信息：</p>
<p>　 1) @file       &#8211;&gt; 文件声明，即当前文件名</p>
<p>　 2) @author  &#8211;&gt; 作者</p>
<p>　 3) @version &#8211;&gt; 版本，推荐使用$Id$</p>
<p>　 4) @todo     &#8211;&gt; 改进，可以指定针对的版本</p>
</p>
<p>2. 模块信息：</p>
<p>　 1) @var        &#8211;&gt; 模块变量说明</p>
<p>　 2) @typedef &#8211;&gt; 模块变量类型说明</p>
</p>
<p>3. 函数信息：</p>
<p>　 1) @param  &#8211;&gt; 参数说明</p>
<p>　 2) @arg       &#8211;&gt; 列表说明参数信息</p>
<p>　 3) @return   &#8211;&gt; 返回值说明</p>
<p>　 4) @retval    &#8211;&gt; 返回值类型说明</p>
<p>　 5) @note      &#8211;&gt; 注解</p>
</p>
<p>4. 提醒信息：</p>
<p>　 1) @brief         &#8211;&gt; 摘要，即当前文件说明</p>
<p>　 2) @see           &#8211;&gt; 参看</p>
<p>　 3) @attention  &#8211;&gt; 注意</p>
<p>　 4) @bug          &#8211;&gt; 问题</p>
<p>　 5) @warning   &#8211;&gt; 警告</p>
<p>　 6) @sa             &#8211;&gt; 参考资料</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/403/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows Linux双系统启动恢复(Grub)</title>
		<link>http://www.thinkly.cn/index.php/archives/402</link>
		<comments>http://www.thinkly.cn/index.php/archives/402#comments</comments>
		<pubDate>Tue, 09 Feb 2010 05:30:25 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[win7]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/402</guid>
		<description><![CDATA[超级无比傻瓜式教程
首先，你的电脑是双系统，比如windows系统装在了c盘，Linux系统装在了d盘或者e盘，或者其他盘里，当你重装你的windows系统后，因为引导的问题，开启电脑的时候，电脑自动只引导windows的启动程序，原来供你选择进入哪个系统的开机界面没有了，这时候不要着急。按我说的一步一步来：
1.首先找到你的linux安装盘，将盘放入光驱后重启电脑，在重启的时候要按F12键，如果顺利的话会进入一个界面，让你选择用什么来启动电脑，因为你在光驱里放入了光盘，所以要选择那个&#34;cd/dvd&#8230;&#8230;&#8230;..&#34;因为这行字是英文，所以让我全部写出来有点困难，大概就是用cd 盘来启动电脑，你用键盘的上下键选择后 按回车键，然后电脑就启动了。 
2.启动后会进入另一个界面     这时候选择&#34;试用ubuntu而不改变计算机中的任何内容” （注意，我的linux系统是ubuntu9.04版本，其他的我不知道是否这样）     就是这个界面，选择第一个后 等着，耐心的等着，（好多人会问为什么这样，因为只有这样你才能进入你原来的linux里面，才能找到终端，才能输入grub指令，原来看他们别人写的一上来就说在终端里输入指令，我们都进不去linux了去哪输入指令啊，你们写全点能死啊，） 
3.通过光盘驱动进入linux后，打开终端，在里面输入     sudo grub     然后终端界面会出现 grub &#62; 这样的界面 ，然后再输入一条指令：     find /boot/grub/stage1 (注意find 与/boot之间一定要加空格，我开始看别人的帖子，他们有的根本没有注明要加空格，再次鄙视他们一下)     当你输入这条指令 按回车后，终端上会显示出 (hd0,7) 注意，这时候你会问 为什么会出现这个东西，那里面的 0 还有 7 是什么东西，这个不需要我们管的，具体我不在这里说了，否则你会很乱的。有的人的电脑会是别的（hd0,5）或者其他的东西，总之这个你就别管了。 
4.当出现（hd0,7）后，你再输入一条指令：  [...]]]></description>
			<content:encoded><![CDATA[<p><strong>超级无比傻瓜式教程</strong></p>
<p>首先，你的电脑是双系统，比如windows系统装在了c盘，Linux系统装在了d盘或者e盘，或者其他盘里，当你重装你的windows系统后，因为引导的问题，开启电脑的时候，电脑自动只引导windows的启动程序，原来供你选择进入哪个系统的开机界面没有了，这时候不要着急。按我说的一步一步来：</p>
<p>1.首先找到你的linux安装盘，将盘放入光驱后重启电脑，在重启的时候要按F12键，如果顺利的话会进入一个界面，让你选择用什么来启动电脑，因为你在光驱里放入了光盘，所以要选择那个&quot;cd/dvd&#8230;&#8230;&#8230;..&quot;因为这行字是英文，所以让我全部写出来有点困难，大概就是用cd 盘来启动电脑，你用键盘的上下键选择后 按回车键，然后电脑就启动了。 </p>
<p>2.启动后会进入另一个界面     <br />这时候选择&quot;试用ubuntu而不改变计算机中的任何内容” （注意，我的linux系统是ubuntu9.04版本，其他的我不知道是否这样）     <br />就是这个界面，选择第一个后 等着，耐心的等着，（好多人会问为什么这样，因为只有这样你才能进入你原来的linux里面，才能找到终端，才能输入grub指令，原来看他们别人写的一上来就说在终端里输入指令，我们都进不去linux了去哪输入指令啊，你们写全点能死啊，） </p>
<p>3.通过光盘驱动进入linux后，打开终端，在里面输入     <br />sudo grub     <br />然后终端界面会出现 grub &gt; 这样的界面 ，然后再输入一条指令：     <br />find /boot/grub/stage1 (注意find 与/boot之间一定要加空格，我开始看别人的帖子，他们有的根本没有注明要加空格，再次鄙视他们一下)     <br />当你输入这条指令 按回车后，终端上会显示出 (hd0,7) 注意，这时候你会问 为什么会出现这个东西，那里面的 0 还有 7 是什么东西，这个不需要我们管的，具体我不在这里说了，否则你会很乱的。有的人的电脑会是别的（hd0,5）或者其他的东西，总之这个你就别管了。 </p>
<p>4.当出现（hd0,7）后，你再输入一条指令：     <br />root (hd0.7) 注意 root 跟 （）之间也有空格，再有 你root后面写的东西是根据你第三步出现的什么就写什么，如果出现的是(hd0,5) 那就写 root (hd0,5) 明白了吗？</p>
<p>5.输入第4步的指令后，回车，然后终端会出现grub&gt; 然后再 输入一条指令 ：     <br />setup(hd0) 按回车，不用怕，也不要问为什么，按我的去做就行了，具体我知道，但是解释原因的话会扯的太远，希望大家理解。 </p>
<p>6.输入指令： quit 这个指令是退出终端的指令，然后重启电脑，去看看吧 你的电脑就恢复成原来那样了，又会出现可以选择系统的界面了。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/402/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATI HD4500 显卡官方驱动安装</title>
		<link>http://www.thinkly.cn/index.php/archives/401</link>
		<comments>http://www.thinkly.cn/index.php/archives/401#comments</comments>
		<pubDate>Tue, 09 Feb 2010 04:42:50 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ati]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[hd4500]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/401</guid>
		<description><![CDATA[官方驱动
http://support.amd.com/us/gpudownload/Pages/index.aspx
本地下载
http://thinkly.cn/download/linux/ati-driver-installer-10-1-x86.x86_64.run
下载后执行
sudo sh ./ati-driver-installer-10-1-x86.x86_64.run
/usr/bin/aticonfig –initial
&#160;
重启后OK
]]></description>
			<content:encoded><![CDATA[<p>官方驱动</p>
<p><a title="http://support.amd.com/us/gpudownload/Pages/index.aspx" href="http://support.amd.com/us/gpudownload/Pages/index.aspx">http://support.amd.com/us/gpudownload/Pages/index.aspx</a></p>
<p>本地下载</p>
<p><a title="http://thinkly.cn/download/linux/ati-driver-installer-10-1-x86.x86_64.run" href="http://thinkly.cn/download/linux/ati-driver-installer-10-1-x86.x86_64.run">http://thinkly.cn/download/linux/ati-driver-installer-10-1-x86.x86_64.run</a></p>
<p>下载后执行</p>
<pre class="brush: bash;">sudo sh ./ati-driver-installer-10-1-x86.x86_64.run
/usr/bin/aticonfig –initial</pre>
<p>&#160;</p>
<p>重启后OK</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/401/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThinkPad 11b/g/n Wireless LAN Mini-PCI Express Adapter II</title>
		<link>http://www.thinkly.cn/index.php/archives/400</link>
		<comments>http://www.thinkly.cn/index.php/archives/400#comments</comments>
		<pubDate>Mon, 08 Feb 2010 08:57:34 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[11b/g/n]]></category>
		<category><![CDATA[adapterII]]></category>
		<category><![CDATA[lan]]></category>
		<category><![CDATA[thinkpad]]></category>
		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/400</guid>
		<description><![CDATA[原文地址
http://www.thinkwiki.org/wiki/ThinkPad_11b/g/n_Wireless_LAN_Mini-PCI_Express_Adapter_II
驱动下载
http://launchpadlibrarian.net/33927923/rtl8192se_linux_2.6.0010.1012.2009.tar.gz
解压缩之后执行
sudo apt-get install build-essential linux-source-2.6.31
然后进入到驱动目录
sudo make
sudo su
make install
如果没有出现任何问题,最后一步
modprobe r8192se_pci
&#160;
完事!
]]></description>
			<content:encoded><![CDATA[<p>原文地址</p>
<p><a title="http://www.thinkwiki.org/wiki/ThinkPad_11b/g/n_Wireless_LAN_Mini-PCI_Express_Adapter_II" href="http://www.thinkwiki.org/wiki/ThinkPad_11b/g/n_Wireless_LAN_Mini-PCI_Express_Adapter_II">http://www.thinkwiki.org/wiki/ThinkPad_11b/g/n_Wireless_LAN_Mini-PCI_Express_Adapter_II</a></p>
<p>驱动下载</p>
<p><a title="http://launchpadlibrarian.net/33927923/rtl8192se_linux_2.6.0010.1012.2009.tar.gz" href="http://launchpadlibrarian.net/33927923/rtl8192se_linux_2.6.0010.1012.2009.tar.gz">http://launchpadlibrarian.net/33927923/rtl8192se_linux_2.6.0010.1012.2009.tar.gz</a></p>
<p>解压缩之后执行</p>
<pre class="brush: bash;">sudo apt-get install build-essential linux-source-2.6.31</pre>
<p>然后进入到驱动目录</p>
<pre class="brush: bash;">sudo make
sudo su
make install</pre>
<p>如果没有出现任何问题,最后一步</p>
<pre class="brush: bash;">modprobe r8192se_pci</pre>
<p>&#160;</p>
<p>完事!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/400/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过SSH挂载远程目录</title>
		<link>http://www.thinkly.cn/index.php/archives/399</link>
		<comments>http://www.thinkly.cn/index.php/archives/399#comments</comments>
		<pubDate>Fri, 05 Feb 2010 08:38:48 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[sshfs]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/399</guid>
		<description><![CDATA[1. sudo apt-get install sshfs
2. 新建文件夹用于挂载远程目录：mkdir ~/home-server
3. sshfs yourname@remote-host:/path/to/your/dir ~/home-server
4. 卸载时使用 umount ~/home-server
]]></description>
			<content:encoded><![CDATA[<p>1. sudo apt-get install sshfs</p>
<p>2. 新建文件夹用于挂载远程目录：mkdir ~/home-server</p>
<p>3. sshfs yourname@remote-host:/path/to/your/dir ~/home-server</p>
<p>4. 卸载时使用 umount ~/home-server</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/399/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu 9.10 ATI HD系列显卡安装开源驱动开启3D</title>
		<link>http://www.thinkly.cn/index.php/archives/390</link>
		<comments>http://www.thinkly.cn/index.php/archives/390#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:57:33 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[ait]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ubuntu 9.10]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/?p=390</guid>
		<description><![CDATA[原文：     http://hi.baidu.com/acidblog/blog/item/4b43fc56e64c0852d109060b.html
 
 
转载内容：
本人不甘心只在archlinux下开启3D（本人忽视官方驱动的存在），于是放狗搜了一段时间终于在ubuntu的官方英文论坛找到了HD系列显卡安装开源驱动开启3D的方法。至于性能基本上和archlinux上差不多，简而言之就是没有了延迟。   官方教程：https://launchpad.net/~xorg-edgers/+archive/ppa

注：此方法本人只在ubuntu9.10上尝试，9.04请自行摸索
一、 到 kernel.ubuntu.com/~kernel-ppa/mainline下载最新的2. 6.32内核deb包   双击安装或命令行输入：    sudo dpkg -i linux-image-2.6.32…….deb（善用tab自动补全）
二、 重启后，sudo gedit /etc/apt/sources.list 添加：
deb http://ppa.launchpad.net/xorg-edgers/ppa/ubuntu karmic main   deb-src http://ppa.launchpad.net/xorg-edgers/ppa/ubuntu karmic main
然后终端输入：sudo apt-key adv &#8211;recv-keys &#8211;keyserver keyserver.ubuntu.com 0&#215;4f191a5a8844c542，添加密钥就可以了
三、 终端里输入：sudo apt-get update &#38;&#38; sudo apt-get upgrade
四、 重启后输入：glxinfo &#124;grep -i opengl
OpenGL vendor [...]]]></description>
			<content:encoded><![CDATA[<p><strong>原文：     <br /></strong><a href="http://hi.baidu.com/acidblog/blog/item/4b43fc56e64c0852d109060b.html">http://hi.baidu.com/acidblog/blog/item/4b43fc56e64c0852d109060b.html</a></p>
<p><a href="http://www.thinkly.cn/wp-content/uploads/2010/02/3d5e460b5f7cbfe13bc763b6.jpg" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="效果图" border="0" alt="效果图" src="http://www.thinkly.cn/wp-content/uploads/2010/02/3d5e460b5f7cbfe13bc763b6_thumb.jpg" width="244" height="154" /></a> </p>
<p> <span id="more-390"></span>
<p><strong>转载内容：</strong></p>
<p>本人不甘心只在archlinux下开启3D（本人忽视官方驱动的存在），于是放狗搜了一段时间终于在ubuntu的官方英文论坛找到了HD系列显卡安装开源驱动开启3D的方法。至于性能基本上和archlinux上差不多，简而言之就是没有了延迟。   <br />官方教程：https://launchpad.net/~xorg-edgers/+archive/ppa</p>
</p>
<p>注：此方法本人只在ubuntu9.10上尝试，9.04请自行摸索</p>
<p>一、 到 kernel.ubuntu.com/~kernel-ppa/mainline下载最新的2. 6.32内核deb包   <br />双击安装或命令行输入：    <br />sudo dpkg -i linux-image-2.6.32…….deb（善用tab自动补全）</p>
<p>二、 重启后，sudo gedit /etc/apt/sources.list 添加：</p>
<p>deb http://ppa.launchpad.net/xorg-edgers/ppa/ubuntu karmic main   <br />deb-src http://ppa.launchpad.net/xorg-edgers/ppa/ubuntu karmic main</p>
<p>然后终端输入：sudo apt-key adv &#8211;recv-keys &#8211;keyserver keyserver.ubuntu.com 0&#215;4f191a5a8844c542，添加密钥就可以了</p>
<p>三、 终端里输入：sudo apt-get update &amp;&amp; sudo apt-get upgrade</p>
<p>四、 重启后输入：glxinfo |grep -i opengl</p>
<p>OpenGL vendor string: Advanced Micro Devices, Inc.   <br />OpenGL renderer string: Mesa DRI R600 (RV630 9589) 20090101 x86/MMX+/3DNow!+/SSE2 TCL    <br />OpenGL version string: 1.5 Mesa 7.7-devel    <br />OpenGL extensions:</p>
<p>如果OpenGL renderer string后面是你的显卡型号而不是Software Rasterizer，那么恭喜你可以开启</p>
<p>如果安装之后你想删除它：   <br />sudo apt-get install ppa-purge    <br />sudo ppa-purge xorg-edgers</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/390/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cURL常用的几个PHP函数</title>
		<link>http://www.thinkly.cn/index.php/archives/389</link>
		<comments>http://www.thinkly.cn/index.php/archives/389#comments</comments>
		<pubDate>Tue, 29 Dec 2009 07:25:38 +0000</pubDate>
		<dc:creator>Jack</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[CURL]]></category>

		<guid isPermaLink="false">http://www.thinkly.cn/index.php/archives/389</guid>
		<description><![CDATA[1、开启PHP的cURL功能
在Windows平台下，或者使用xampp之类的集成服务器的程序，会非常简单，你需要改一改你的php.ini文件的设置，找到php_curl.dll，并取消前面的分号注释就行了。如下所示：
//取消注释，开启cURL功能     extension=php_curl.dll

在Linux下面，那么，你需要重新编译你的PHP了，编辑时，你需要打开编译参数——在configure命令上加上“–with-curl” 参数。
2、使用cURL来GET数据
cURL最简单最常用的采用GET来获取网页内容的PHP函数      function getCURL($url){      $curl = curl_init();      curl_setopt($curl, CURLOPT_URL, $url);      curl_setopt($curl, CURLOPT_HEADER, 0);      curl_setopt($curl, CURLOPT_TIMEOUT, 3);//超时时间      curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  [...]]]></description>
			<content:encoded><![CDATA[<h5>1、开启PHP的cURL功能</h5>
<p>在Windows平台下，或者使用xampp之类的集成服务器的程序，会非常简单，你需要改一改你的<strong>php.ini</strong>文件的设置，找到php_curl.dll，并取消前面的分号注释就行了。如下所示：</p>
<blockquote><p>//取消注释，开启cURL功能     <br />extension=php_curl.dll</p>
</blockquote>
<p>在<strong>Linux</strong>下面，那么，你需要重新编译你的PHP了，编辑时，你需要打开编译参数——在configure命令上加上“–with-curl” 参数。</p>
<h5>2、使用cURL来GET数据</h5>
<blockquote><p>cURL最简单最常用的采用<strong>GET</strong>来获取网页内容的<strong>PHP函数</strong>      <br />function getCURL($url){      <br />$curl = curl_init();      <br />curl_setopt($curl, CURLOPT_URL, $url);      <br />curl_setopt($curl, CURLOPT_HEADER, 0);      <br />curl_setopt($curl, CURLOPT_TIMEOUT, 3);//超时时间      <br />curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);      <br />$data = curl_exec($curl);      <br />curl_close($curl);      <br />return $data;      <br />}</p>
</blockquote>
<h5>3、使用cURL来POST数据</h5>
<blockquote><p>当我们需要对cURL请求的页面采用<strong>POST</strong>的请求方式时，我们使用下面的<strong>PHP函数</strong>      <br />function _curl_post($url, $vars) {      <br />$ch = curl_init();      <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      <br />curl_setopt($ch, CURLOPT_URL, $url);      <br />curl_setopt($ch, CURLOPT_POST, 1);      <br />curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);      <br />$data = curl_exec($ch);      <br />curl_close($ch);      <br />if ($data)      <br />return $data;      <br />else      <br />return false;      <br />}</p>
</blockquote>
<h5>4、使用cURL，需要HTTP服务器认证</h5>
<blockquote><p>当我们请求地址需要加上身份验证，即<strong>HTTP服务器认证</strong>的时候，我们就要使用下面的函数了，对于cURL中<strong>GET方法</strong>使用验证也是采用相同的方式。      <br />function postCurlHTTP($url, $str) {      <br />$ch = curl_init();      <br />curl_setopt($ch, CURLOPT_URL, $url);      <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      <br />curl_setopt($ch, CURLOPT_POST, 1);      <br />curl_setopt($ch, CURLOPT_USERPWD, “验证的用户名:密码”);      <br />curl_setopt($ch, CURLOPT_POSTFIELDS, $str);      <br />$data = curl_exec($ch);      <br />$Headers = curl_getinfo($ch);      <br />if ($Headers['http_code'] == 200) {      <br />return $data;      <br />} else {      <br />return false;      <br />}      <br />}</p>
</blockquote>
<h5>5、使用cURL获取302重定向的页面</h5>
<blockquote><p>下面函数$data为重定向后页面的内容，这里我们写一个简单的<strong>cURL POST</strong>的<strong>302重定向</strong>后返回重定向页面URL的函数，有时候返回页面的URL更加重要。      <br />function _curl_post_302($url, $vars) {      <br />$ch = curl_init();      <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      <br />curl_setopt($ch, CURLOPT_URL, $url);      <br />curl_setopt($ch, CURLOPT_POST, 1);      <br />curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect      <br />curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);      <br />$data = curl_exec($ch);      <br />$Headers = curl_getinfo($ch);      <br />curl_close($ch);      <br />if ($data&amp;&amp;$Headers)      <br />return s$Headers[&quot;url&quot;];      <br />else      <br />return false;      <br />}</p>
</blockquote>
<h5>6、给cURL加个代理服务器</h5>
<blockquote><p>$ch = curl_init();     <br />curl_setopt($ch, CURLOPT_URL, ‘<a href="http://www.2fool.cn">http://www.2fool.cn</a>‘);      <br />curl_setopt($ch, CURLOPT_HEADER, 1);      <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      <br />curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);      <br />curl_setopt($ch, CURLOPT_PROXY, ‘代理服务器地址（<a href="http://www.2fool.cn">www.2fool.cn</a>）:端口’);      <br />curl_setopt($ch, CURLOPT_PROXYUSERPWD, ‘代理用户:密码’);      <br />$data = curl_exec();      <br />curl_close($ch);</p>
</blockquote>
<h5>7、一个cURL简单的类</h5>
<blockquote><p>&lt;?php     <br />/*      <br />Sean Huber <strong>CURL</strong> library</p>
<p>This library is a basic implementation of CURL capabilities.     <br />It works in most modern versions of IE and FF.</p>
<p>==================================== USAGE ====================================     <br />It exports the CURL object globally, so set a callback with setCallback($func).      <br />(Use setCallback(array(’class_name’, ‘func_name’)) to set a callback as a func      <br />that lies within a different class)      <br />Then use one of the CURL request methods:</p>
<p><strong>get($url)</strong>;      <br /><strong>post($url, $vars)</strong>; vars is a urlencoded string in query string format.</p>
<p>Your callback function will then be called with 1 argument, the response text.     <br />If a callback is not defined, your request will return the response text.      <br />*/</p>
<p>class CURL {     <br />var $callback = false;</p>
<p>function setCallback($func_name) {     <br />$this-&gt;callback = $func_name;      <br />}</p>
<p>function doRequest($method, $url, $vars) {     <br />$ch = curl_init();      <br />curl_setopt($ch, CURLOPT_URL, $url);      <br />curl_setopt($ch, CURLOPT_HEADER, 1);      <br />curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);      <br />curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);      <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      <br />curl_setopt($ch, CURLOPT_COOKIEJAR, ‘cookie.txt’);      <br />curl_setopt($ch, CURLOPT_COOKIEFILE, ‘cookie.txt’);      <br />if ($method == ‘POST’) {      <br />curl_setopt($ch, CURLOPT_POST, 1);      <br />curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);      <br />}      <br />$data = curl_exec($ch);      <br />curl_close($ch);      <br />if ($data) {      <br />if ($this-&gt;callback)      <br />{      <br />$callback = $this-&gt;callback;      <br />$this-&gt;callback = false;      <br />return call_user_func($callback, $data);      <br />} else {      <br />return $data;      <br />}      <br />} else {      <br />return curl_error($ch);      <br />}      <br />}</p>
<p>function get($url) {     <br />return $this-&gt;doRequest(‘GET’, $url, ‘NULL’);      <br />}</p>
<p>function post($url, $vars) {     <br />return $this-&gt;doRequest(‘POST’, $url, $vars);      <br />}      <br />}      <br />?&gt;</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkly.cn/index.php/archives/389/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
