<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://www.majordojo.com/projects/FeedManager/atom.xsl" type="text/xsl" media="screen"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:thr="http://purl.org/syndication/thread/1.0">
  <link rel="alternate" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html" />
  <link rel="self" type="application/atom+xml" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html" />
  <id>tag:www.thinkjam.org,2009:/zoptuno//2/tag:www.thinkjam.org,2006:/zoptuno//2.369-</id>
  <updated>2009-09-21T03:11:08Z</updated>
  <title>Comments for 用MT-XSearch替换MT默认的Tag搜索</title>
  <subtitle>My think. My dream.</subtitle>
  <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.31-zh-cn</generator>
  <entry>
    <id>tag:www.thinkjam.org,2006:/zoptuno//2.369</id>
    <link rel="alternate" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.thinkjam.org/loveblog/batom.cgi/weblog/blog_id=2/entry_id=369" title="用MT-XSearch替换MT默认的Tag搜索" />
    <published>2006-09-13T13:56:44Z</published>
    <updated>2008-01-27T06:57:36Z</updated>
    <title>用MT-XSearch替换MT默认的Tag搜索</title>
    <summary>毋庸置疑，Movable Type确实是Blog系统中的佼佼者，它强大的功能，简...</summary>
    <author>
      <name>平生一笑</name>
      <uri>http://www.thinkjam.org/zoptuno</uri>
    </author>
    
    <category term="MovableType" />
    
    <content type="html" xml:lang="en" xml:base="http://www.thinkjam.org/zoptuno/">
      <![CDATA[<p id="fp">毋庸置疑，Movable Type确实是Blog系统中的佼佼者，它强大的功能，简洁清爽的界面，以及随心所欲的可定制性深深的吸引着我。但即使如此，Movable Type还是有<a href="http://www.thinkjam.org/zoptuno/archives/2005/11/word_word.html" target="_blank">不尽如人意</a>的地方，搜索功能消耗大量资源绝对是其中一条。在最新版的Movable Type 3.32中，这一点愈加突出。3.32版的Movable Type，最显著的就是内置了Tag和各种类型的<a href="http://feeds.feedburner.com/zoptuno" target="_blank">RSS feed</a>，如搜索关键字feed，特定Tag的feed……。与生成静态页或动态PHP出版的日志归档不同，Tag、搜索，以及为它们提供的RSS feed全都是动态内容，全靠一个mt-search.cgi实现。在Blog访问量增加，或订阅某个关键字以及Tag的人数增加的时候，大量的mt-search.cgi进程很有可能把服务器拖垮，前几天<a href="http://www.postshow.net" target="_blank">Postshow</a>遇到故障无法访问，即由此引起。最终，我使用MT-XSearch插件替换了Movable Type默认的Tag搜索，并为其加上缓存功能，问题才告解决。现将整个解决过程记录如下，与诸君分享。</p>]]>
      <![CDATA[<strong>必备插件（Required Plugins）</strong><ul><li><a href="http://code.as-is.net/wiki/TagSupplementals_Plugin" target="_blank">TagSupplementals</a></li><li><a href="http://code.appnel.com/dist/mt-plus" target="_blank">MT-XSearch</a></li></ul>
<strong>安装步骤（How to setup）</strong><ol><li>安装TagSupplementals<br />从<a href="http://code.as-is.net/wiki/TagSupplementals_Plugin" target="_blank">其官方网站</a>下载此插件，解压缩后，将TagSupplementals.p文件拷贝/上传到Movable Type的plugins目录。
安装MT-XSearch<br />从<a href="http://code.appnel.com/dist/mt-plus" target="_blank">这里</a>下载mt-plus插件，解压缩后，将下述文件拷贝/上传到你的Movable Type程序安装目录。<ul><li>mt-xsearch.cgi</li><li>plugins/mt-xsearch.pl</li><li>extlib/MT/XSearch.pm</li></ul>若主机空间为*nix系统，请设置mt-xsearch.cgi的属性为755。<br /><br /></li><li>按照下述方法修改mt-xsearch.cgi和plugins/mt-xsearch.pl文件，以让MT-XSearch支持多国语言，并修复其Bug。

<pre>
[--- mt-xsearch.cgi.bak	Fri Aug 27 12:06:24 2004<br />+++ mt-xsearch.cgi	Sat Jun 11 02:58:33 2005<br />@@ -41,7 +41,8 @@<br />     $ctx-&gt;stash('CGI',$q);<br />     my $out = $tmpl-&gt;build($ctx)<br />         or die "Building search template failed: ".$tmpl-&gt;errstr;<br />-    print $q-&gt;header.$out;<br />+    my $charset = $mt-&gt;{cfg}-&gt;PublishCharset;<br />+    print $q-&gt;header(-charset=&gt;$charset).$out;<br /> };<br /> if ($@) {<br />     print "Content-Type: text/html\n\n";<br /> </pre><br />

<br /><pre>--- plugins/mt-xsearch.pl.bak	Sat May 14 06:01:19 2005<br />+++ plugins/mt-xsearch.pl	Sat Jun 11 00:31:39 2005<br />@@ -63,7 +63,7 @@<br />     my $pages = $limit ? ($count-($count % $limit)) / $limit : 1;<br />     $pages += ($limit &amp;&amp; $count % $limit) ? 1 : 0;<br />     my $offset = $xsearch-&gt;args-&gt;{offset} || 0;<br />-    my $current = $offset / $limit + 1;<br />+    my $current = $limit ? ($offset / $limit + 1) : 1;<br />     $ctx-&gt;stash('MT::XSearch::current_page',$current);<br />     $ctx-&gt;stash('MT::XSearch::pages',$pages);<br />     my $builder = <br />$ctx-&gt;stash('builder');]
</pre>
<br /><br /></li><li>如果主机空间安装有CGI::Cache模块，则可以按照下面的方法修改mt-xsearch.cgi，用缓存来让MT-XSearch提供更好的负载。<pre>
--- mt-xsearch.cgi.bak	Fri Aug 27 12:06:24 2004<br />+++ mt-xsearch.cgi	Sat Jun 11 03:44:32 2005<br />@@ -17,6 +17,7 @@<br /> }<br /><br /> use CGI;<br />+use CGI::Cache;<br /> use MT;<br /> use MT::ConfigMgr;<br /> use MT::Template;<br />@@ -27,10 +28,13 @@<br />     my $mt = MT-&gt;new( Config =&gt; $MT_DIR . 'mt.cfg', Directory =&gt; $MT_DIR )<br />         or die MT-&gt;errstr;<br />     my $q = new CGI;<br />+    CGI::Cache::setup({ cache_options =&gt; { cache_root =&gt; '<ins>./cache</ins>', default_expires_in =&gt; <ins>3600</ins> } });<br />     my $blog_id = $q-&gt;param('blog_id') or<br />         die "Missing parameter blog_id";<br />     my $key = $q-&gt;param('search_key') or<br />         die "Missing parameter key";<br />+    CGI::Cache::set_key($q-&gt;Vars);<br />+    CGI::Cache::start() or exit;<br />     my $search = MT::XSearch-&gt;execute($q);<br />     my $tmpl = MT::Template-&gt;load( { <br />                         name=&gt;'XSearch '.$key, <br />@@ -41,7 +45,14 @@<br />     $ctx-&gt;stash('CGI',$q);<br />     my $out = $tmpl-&gt;build($ctx)<br />         or die "Building search template failed: ".$tmpl-&gt;errstr;<br />-    print $q-&gt;header.$out;<br />+    my $charset = $mt-&gt;{cfg}-&gt;PublishCharset;<br />+    my @m = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);<br />+    my @w = qw(Sun Mon Tue Wed Thu Fri Sat);<br />+    my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time);<br />+    my $now = sprintf("%3s, %02d %3s %04d %02d:%02d:%02d GMT",<br />+        $w[$wday], $mday, $m[$mon], $year+1900, $hour, $min, $sec);<br />+    print $q-&gt;header(-charset=&gt;$charset,-Last_Modified=&gt;$now).$out;<br />
+    CGI::Cache::stop();<br /> };<br /> if ($@) {<br />     print "Content-Type: text/html\n\n";<br /></pre><br />你会看到，在上面这段程序中，我们定义了缓存使用的目录－－“./cache”，以及缓存的持续时间－－3600″（1个小时）。你也可以修改成其它需要的值，但一定要根据程序中的情况建立一个放置缓存的目录，并为其赋予写入权限（一般设置权限为777即可）。这里，我们要在Movable Type的安装目录下建立一个名为cache的文件夹，设置其权限为777。<br /><br /></li><li>增加一个用于Tag搜索的模块XSearch TagSupplementals<br />在你的Blog管理界面中点击“模板”，选择“模块”标签，按下“新增模板模块”链接，在出现的窗口中填入模块名字和模块的模板信息。其中模块名字为“XSearch TagSupplementals”，模块的模板则根据你自身的情况来制作，下面给出一个样历：
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=&lt;$MTPublishCharset$&gt;" /&gt;<br />&lt;title&gt;Tag: &lt;$MTSearchString decode_url="1"$&gt; on &lt;$MTBlogName$&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br /><br />&lt;h2&gt;&lt;a href="&lt;$MTBlogURL$&gt;tags/"&gt;Tag&lt;/a&gt;: &lt;em&gt;&lt;$MTSearchString decode_url="1"$&gt;&lt;/em&gt;&lt;/h2&gt;<br /><br />&lt;MTSearchResults&gt;<br />&lt;MTSearchHeader&gt;<br />Results found: &lt;$MTSearchResultCount$&gt; <br />&lt;ol&gt;<br />&lt;/MTSearchHeader&gt;<br />&lt;li&gt;&lt;a href="&lt;$MTEntryLink$&gt;"&gt;&lt;$MTEntryTitle$&gt;&lt;/a&gt;&lt;/li&gt;<br />&lt;MTSearchFooter&gt;<br />&lt;/ol&gt;<br />&lt;/MTSearchFooter&gt;<br />&lt;/MTSearchResults&gt;<br />&lt;MTNoSearch&gt;&lt;p&gt;No search performed.&lt;/p&gt;&lt;/MTNoSearch&gt;<br />&lt;MTNoSearchResults&gt;&lt;p&gt;Nothing found.&lt;/p&gt;&lt;/MTNoSearchResults&gt;<br /><br />&lt;h3&gt;Related Tag&lt;/h3&gt;<br />&lt;MTXSearchTags&gt;<br />&lt;ul&gt;<br />  &lt;MTRelatedTags&gt;<br />  &lt;li&gt;<br />&lt;a title="Tag: &lt;$MTTagName$&gt;" href="&lt;$MTBlogURL$&gt;tag/&lt;$MTTagName encode_url="1"$&gt;"&gt;&lt;$MTTagName$&gt;(&lt;$MTTagCount$&gt;)&lt;/a&gt;<br />&lt;/li&gt;<br />  &lt;/MTRelatedTags&gt;<br />&lt;/ul&gt;<br />&lt;/MTXSearchTags&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br />
</pre><br />上面只是一些最基本的元素，你可以根据自己的具体情况把样式表和DIV层套用上来。<br /></li></ol><strong>使用（Usage）</strong><ol><li>最简单的，将所有的&lt;$MTTagSearchLink$&gt;换成&lt;$MTTagXSearchLink$&gt;。</li><li>如果此前为Movable Type的内置Tag做过URL_rewrite，则请编辑.htaccess 文件，将其中有关Tag的部分修改为：
<blockquote>RewriteEngine on
RewriteRule tag/(.+) /mt/mt-xsearch.cgi?blog_id=1&amp;search_key=TagSupplementals&amp;search=$1</blockquote>
其中/mt/为Movable Type的程序路径，blog_id为你的Blog在整套Movable Type中的ID号。</li></ol><strong>相关下载（Related Download）</strong><ul><li><a href="http://code.as-is.net/wiki/TagSupplementals_Plugin" target="_blank">TagSupplementals</a></li><li><a href="http://code.appnel.com/dist/mt-plus" target="_blank">MT-Plus</a></li><li><a href="http://www.thinkjam.org/zoptuno/archives/upload/2006/09/mt-xsearch.tar.gz">无CGI::Cache模块的mt-xsearch.cgi</a></li><li><a href="http://www.thinkjam.org/zoptuno/archives/upload/2006/09/mt-xsearch-cache.tar.gz">有CGI::Cache模块的mt-xsearch.cgi</a></li><li><a href="http://www.thinkjam.org/zoptuno/archives/upload/2006/09/mt-xsearch-pl.tar.gz">修改过的mt-xsearch.pl</a></li></ul>]]>
    </content>
  </entry>

  <entry>
    <id>tag:www.thinkjam.org,2006:/zoptuno//2.369-comment:2286</id>
    <thr:in-reply-to ref="tag:www.thinkjam.org,2006:/zoptuno//2.369" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html"/>
    <link rel="alternate" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html#c2286" />
    <title>Comment from Wood on 2006-09-17</title>
    <author>
        <name>Wood</name>
<!--        <uri>http://easun.org</uri> -->
    </author>
    <content type="html" xml:lang="en" xml:base="http://easun.org">
	<![CDATA[<p>hi，一笑。<br />
AnySQL Hack了一个类似的。<br />
地址在此： <a href="http://www.anysql.net/2006/09/tag_search_cache.html" rel="nofollow"><a href="http://www.anysql.net/2006/09/tag_search_cache.html" rel="nofollow"><a href="http://www.anysql.net/2006/09/tag_search_cache.html" rel="nofollow">http://www.anysql.net/2006/09/tag_search_cache.html</a></a></a></p>]]>
    </content>
    <published>2006-09-17T15:12:12Z</published>
    <updated>2006-09-17T15:12:12Z</updated>
  </entry>

  <entry>
    <id>tag:www.thinkjam.org,2006:/zoptuno//2.369-comment:2287</id>
    <thr:in-reply-to ref="tag:www.thinkjam.org,2006:/zoptuno//2.369" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html"/>
    <link rel="alternate" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html#c2287" />
    <title>Comment from coverer on 2007-01-03</title>
    <author>
        <name>coverer</name>
<!--        <uri>http://www.coverer.net</uri> -->
    </author>
    <content type="html" xml:lang="en" xml:base="http://www.coverer.net">
	<![CDATA[<p>mt3.2不知道是否支持mtxsearch插件?</p>]]>
    </content>
    <published>2007-01-02T17:30:16Z</published>
    <updated>2007-01-02T17:30:16Z</updated>
  </entry>

  <entry>
    <id>tag:www.thinkjam.org,2006:/zoptuno//2.369-comment:2288</id>
    <thr:in-reply-to ref="tag:www.thinkjam.org,2006:/zoptuno//2.369" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html"/>
    <link rel="alternate" type="text/html" href="http://www.thinkjam.org/zoptuno/archives/2006/09/mt-xsearch-tag.html#c2288" />
    <title>Comment from 平生一笑 on 2007-01-03</title>
    <author>
        <name>平生一笑</name>
<!--        <uri>http://www.thinkjam.org/zoptuno</uri> -->
    </author>
    <content type="html" xml:lang="en" xml:base="http://www.thinkjam.org/zoptuno">
	<![CDATA[<p>支持!</p>]]>
    </content>
    <published>2007-01-03T01:20:25Z</published>
    <updated>2007-01-03T01:20:25Z</updated>
  </entry>

</feed>
