如何重构使用带有DBI的Template Toolkit的Perl代码来利用FastCGI
背景
下面是使用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::errstrn"; #Execute SQL Query $statement->execute($idFromSomewhere) or die "Couldn't execute query '$sql': $DBI::errstrn"; #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循环中放置的位置和内容. 子问题 一个. 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. C. D. 解决方法
如果您熟悉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,$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::errstrn"; #Execute SQL Query $statement->execute( $idFromSomewhere ) or die "Couldn't execute query '$sql': $DBI::errstrn"; #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(); } 至于你的子问题: > A: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |