Фон
Ниже приведен типичный фрагмент кода Perl ( sample.pl для обсуждения), который захватывает отправленные данные формы с помощью CGI, передает данные формы в 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();
Для повышения производительности и масштабируемости веб-хосты, предоставляющие общие серверы, такие как 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, базу данных и шаблон, быть реорганизован в свои собственные подпрограммы?
С
Должны ли DBI-> connect () и $ db_handle-> disconnect () вызываться внутри или снаружи FCGI во время цикла и как это влияет на производительность?
D.
Должен ли $ tt-> process () вызываться внутри или вне FCGI-цикла while?