Gen*_*neQ 5 perl refactoring fastcgi dbi
下面是使用CGI抓取提交的表单数据的典型Perl代码片段(sample.pl),将表单数据传递给DBI,DBI然后从MySQL检索所需的行,然后将结果交给Template Toolkit呈现为HTML文档以供显示.
sample.pl的代码清单:
#!/usr/bin/perl
use strict;
use CGI;
use DBI:
use Template;
#Grab submitted form data
my $cgi = CGI->new();
my $idFromSomewhere= $cgi->param('id');
my $driver = "mysql";
my $server = "localhost:3306";
my $database = "test";
my $url = "DBI:$driver:$database:$server";
my $user = "apache";
my $password = "";
#Connect to database
my $db_handle = DBI->connect( $url, $user, $password )
or die $DBI::errstr;
#SQL query to execute
my $sql = "SELECT * FROM tests WHERE id=?";
#Prepare SQL query
my $statement = $db_handle->prepare($sql)
or die "Couldn't prepare query '$sql': $DBI::errstr\n";
#Execute SQL Query
$statement->execute($idFromSomewhere)
or die "Couldn't execute query '$sql': $DBI::errstr\n";
#Get query results as hash
my $results = $statement->fetchall_hashref('id');
$db_handle->disconnect();
my $tt = Template->new();
#HTML output template
my $input = 'template.html';
my $vars = {
tests => $results,
};
#Process template and output as HTML
$tt->process($input, $vars)
or die $tt->error();
Run Code Online (Sandbox Code Playgroud)
为了获得更好的性能和可伸缩性,提供共享服务器的Web主机(如Dreamhost)强烈建议所有生产的Perl脚本都支持FastCGI.FastCGI文档非常清楚如何修改现有的Perl代码以支持FastCGI.下面的简单代码通常作为示例给出:
use FCGI;
while (FCGI::accept >= 0)
{
#Run existing code.
}
Run Code Online (Sandbox Code Playgroud)
什么不太清楚的是在while循环中放置的位置和内容.
A. 如果在sample.pl代码简单地裹住,像这样的现有代码:
while (FCGI::accept >= 0)
{
#Grab submitted form data
my $cgi = CGI->new();
...
...
#Process template and output as HTML
$tt->process($input, $vars)
or die $tt->error();
}
Run Code Online (Sandbox Code Playgroud)
B. 或者还有更多吗?例如,处理cgi,数据库和模板的代码是否应该重构为自己的子代码?
C. DBI-> connect()和$ db_handle-> disconnect()是否应在循环中在FCGI内部或外部调用,这对性能有何影响?
D. 应该在循环期间在FCGI内部或外部调用$ tt-> process()吗?
小智 10
如果您熟悉CGI.pm,使用FCGI.pm没有意义,请使用CGI :: Fast.
转换为使用CGI :: Fast的示例将是:
#!/usr/bin/perl
use strict;
use CGI::Fast;
use DBI;
use Template;
my $driver = "mysql";
my $server = "localhost:3306";
my $database = "test";
my $url = "DBI:$driver:$database:$server";
my $user = "apache";
my $password = "";
#Connect to database
my $db_handle = DBI->connect( $url, $user, $password ) or die $DBI::errstr;
while ( my $cgi = CGI::Fast->new() ) {
#Grab submitted form data
my $idFromSomewhere = $cgi->param( 'id' );
#SQL query to execute
my $sql = "SELECT * FROM tests WHERE id=?";
#Prepare SQL query
my $statement = $db_handle->prepare( $sql )
or die "Couldn't prepare query '$sql': $DBI::errstr\n";
#Execute SQL Query
$statement->execute( $idFromSomewhere )
or die "Couldn't execute query '$sql': $DBI::errstr\n";
#Get query results as hash
my $results = $statement->fetchall_hashref( 'id' );
my $tt = Template->new();
#HTML output template
my $input = 'template.html';
my $vars = { tests => $results, };
#Process template and output as HTML
$tt->process( $input, $vars )
or die $tt->error();
}
Run Code Online (Sandbox Code Playgroud)
至于你的子问题:
就像一个辅助信息 - 如果你想在Perl中开发网站,至少看一下Catalyst(http://www.catalystframework.org/)