背景
下面是一段典型的 Perl 代码(用于讨论的sample.pl),它使用 CGI 抓取提交的表单数据,将表单数据传递给 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();
为了获得更好的性能和可扩展性,提供共享服务器的 Web 主机(例如 Dreamhost)强烈建议所有生产 Perl 脚本都支持 FastCGI。FastCGI 文档非常清楚如何修改现有的 Perl 代码以支持 FastCGI。下面的简单代码通常作为示例给出:
use FCGI;
while (FCGI::accept >= 0)
{
#Run existing code.
}
不太清楚的是在 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();
}
B. 或者还有更多内容?例如,处理 cgi、数据库和模板的代码是否应该重构为它们自己的子程序?
C. DBI->connect() 和 $db_handle->disconnect() 应该在 FCGI while 循环内部还是外部调用?对性能有何影响?
D. 应该在 FCGI while 循环内部还是外部调用 $tt->process()?