バックグラウンド
以下は、 CGI を使用して送信されたフォーム データを取得し、フォーム データを DBI に渡し、必要な行を MySQL から取得し、結果を Template Toolkit に渡す典型的な Perl コード (説明のためにsample.pl ) です。表示用の 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 などの共有サーバーを提供する Web ホストは、すべての運用 Perl スクリプトが FastCGI をサポートすることを強く推奨します。FastCGI のドキュメントには、FastCGI をサポートするために既存の Perl コードを変更する方法が明確に記載されています。以下の単純なコードは、多くの場合、例として示されています。
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. $tt->process() は FCGI while ループの内側または外側で呼び出す必要がありますか?