去年九月份,在Movable Type 3.32推出之时,曾经用MT-XSearch替换了MT默认的Tag搜索,除了有效降低服务器负载外,还能够和TagSupplementals配合,增强Movable Type的Tag功能。
不过随着Movable Type 3.34开始全面支持FastCGI,MT-XSearch却仅能运行在标准CGI下面,让人觉得非常不爽。为此,Hirotaka Ogawa写过一篇MT-XSearchをFastCGI化する的网志,我也根据这篇网志实现了Movable Type 3.34下MT-XSearch的FastCGI化。
MT-XSearch FastCGI化的方法如下:
- 按照这里的方法安装MT-Xsearch插件,记得把CGI::Cache模块安装上。如果主机空间没有CGI::Cache,但用的是DreamHost等支持SSH和自主编译的Host,则可以《自己动手,在DreamHost上安装所需的Perl模块》中所述的方法自己安装CGI::Cache模块支持。
- 将下述内容保存成/MTDIR/extlib/MT/App/XSearch.pm文件,放在相应目录下。
package MT::App::XSearch; use strict; use MT::App; @MT::App::XSearch::ISA = qw( MT::App ); use MT::ConfigMgr; use MT::XSearch; sub init { my $app = shift; $app->SUPER::init(@_) or return; $app->add_methods(main => \&view); $app->{charset} = $app->{cfg}->PublishCharset; $app->{default_mode} = 'main'; $app; } sub view { my $app = shift; my $q = $app->{query}; require MT::Template; require MT::Template::Context; my $blog_id = $q->param('blog_id') or return $app->error("Missing parameter blog_id"); my $key = $q->param('search_key') or return $app->error("Missing parameter key"); my $search = MT::XSearch->execute($q); my $tmpl = MT::Template->load({ blog_id => $blog_id, name => 'XSearch ' . $key, type => 'custom' }); my $ctx = MT::Template::Context->new; $ctx->stash('MT::XSearch', $search); $ctx->stash('CGI', $q); my $html = $tmpl->build($ctx) or return $app->error("Building search template failed: " . $tmpl->errstr); $html; } 1;
- 将以下内容保存为mt-xsearch.fcgi文件,放在/MTDIR目录。
#!/usr/bin/perl -w use strict; use lib 'lib'; use MT::Bootstrap; use CGI::Fast; use CGI::Cache; use MT::App::XSearch; eval { CGI::Cache::setup({ cache_options => { cache_root => './cache', default_expires_in => 600 } }); while (my $q = new CGI::Fast) { my $cgi_cache = $q->param('cgi_cache') || 0; if ($cgi_cache) { CGI::Cache::set_key($q->Vars); CGI::Cache::start() or next; } my $app = MT::App::XSearch->new(CGIObject => $q) or die MT::App::XSearch->errstr; local $SIG{__WARN__} = sub { $app->trace($_[0]) }; MT->set_instance($app); $app->init_request(CGIObject => $q) unless $app->{init_request}; $app->run; CGI::Cache::stop($app->errstr ? 0 : 1) if $cgi_cache; } }; if ($@) { print "Content-Type: text/html\n\n"; print "Got an error: $@"; }
- 好了,将原来RewriteRule中的mt-xsearch.cgi换成mt-xsearch.fcgi,并且最后后面加上&cgi_cache=1,启用缓存即可
RewriteRule ^tag/(.*)$ /mt/mt-xsearch.cgi?blog_id=1&search_key=TagSupplementals&search=$1&cgi_cache=1 [L]
其中,mt-xsearch.fcgi文件的后缀,可以根据你自己的情况进行修改。
Comments