加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何重构使用带有DBI的Template Toolkit的Perl代码来利用FastCGI

发布时间:2020-12-15 21:47:33 所属栏目:大数据 来源:网络整理
导读:背景 下面是使用CGI抓取提交的表单数据的典型Perl代码片段(sample.pl),将表单数据传递给DBI,DBI然后从MySQL检索所需的行,然后将结果交给Template Toolkit呈现为HTML文档以供显示. sample.pl的代码清单: #!/usr/bin/perluse strict;use CGI;use DBI:use Temp
背景

下面是使用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循环中放置的位置和内容.

子问题

一个.
应该将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->在循环中在FCGI内部或外部调用disconnect(),那么性能影响是什么?

D.
应该在循环中在FCGI内部还是外部调用$tt-> process()?

解决方法

如果您熟悉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:
除非您100%确定自己知道自己在做什么,否则不要使用FCGI.你绝对想要CGI :: Fast

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读