Perl 我应该根据CGI.pm'从CGI::Fast迁移到其他地方吗;s已弃用的状态,我应该如何执行?

Perl 我应该根据CGI.pm'从CGI::Fast迁移到其他地方吗;s已弃用的状态,我应该如何执行?,perl,cgi,fastcgi,Perl,Cgi,Fastcgi,我正在使用CGI::Fast来利用FastCGI的速度和可伸缩性,我还使用了CGI.pm的查询字符串解析。我不使用CGI.pm不推荐的HTML编写函数 停止使用CGI.pm是在社区中,但在我的使用案例中,我是否也应该考虑迁移?如果是,我该怎么做 1) 仍然使用FastCGI 2) 抓取查询参数 …没有采用像Dancer或Mojolicous这样的框架 我要替换的代码只是: while ( $main::cgi = new CGI::Fast ) { my $name = $main

我正在使用
CGI::Fast
来利用FastCGI的速度和可伸缩性,我还使用了CGI.pm的查询字符串解析。我不使用CGI.pm不推荐的HTML编写函数

停止使用CGI.pm是在社区中,但在我的使用案例中,我是否也应该考虑迁移?如果是,我该怎么做

1) 仍然使用FastCGI

2) 抓取查询参数

…没有采用像Dancer或Mojolicous这样的框架

我要替换的代码只是:

 while ( $main::cgi = new CGI::Fast ) {
      my $name = $main::cgi->param('name');
 }
我愿意将
CGI::PSGI
Plack::Request
结合使用,但我看不到如何巧妙地使用FastCGI功能,因为
CGI::Fast
CGI::PSGI
都希望为对象的创建创建创建子类化
CGI
。我仍然会在混合中使用CGI.pm来启用
CGI::Fast
。Plack似乎需要学习很多东西来替换现在的几行代码。

,如所述,这是一条路要走

Dancer利用了PSGI,但您可以在不使用框架的情况下使用它


您可以使用通过FastCGI运行PSGI应用程序。

这清楚地说明了PSGI是CGI(及其相关技术,如FastCGI)的改进的一个原因。在CGI风格的程序中,代码与部署方法紧密耦合,当您更改部署方法时,通常需要对代码进行相当大的更改。对于PSGI风格的程序,无论如何部署,代码都是相同的

您没有向我们展示任何代码,但您谈论的是“几行代码”。这就是我要采取的方法

  • 从您的程序中删除所有FastCGI特定的代码——留下一个纯CGI风格的程序
  • 那你就有选择了。您可以使用我在中描述的技术将您的程序转换为纯PSGI程序。或者,如果这将是太多的工作,请使用在PSGI环境中运行CGI程序
  • 您现在有了一个PSGI程序,可以在几乎任何web服务器环境中使用。您可以将其用作CGI程序。您可以使用在FCGI下运行它。或者,您可以将其部署为web代理后面的独立服务(最后一个选项是我选择的)
  • 但你在第三步所做的任何选择都不是不可撤销的。相同的代码将在所有部署环境中工作。因此,在它们之间移动通常非常简单


    p、 s.CGI.pm并不是完全不受欢迎的。它已从标准Perl发行版中删除,但这是因为不鼓励使用它。

    这是一个帮助您入门的简短指南。我将使用CGI,而不是FastCGI,但实际上是一样的。想象一下,循环围绕着参数选择

    一个简单的CGI 让我们从一个简单的CGI程序开始。我将使用它来运行它,因为手边没有真正的web服务器

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use CGI;
    
    my $q    = CGI->new;
    my $name = $q->param('name');
    
    print $q->header;
    if ($name) {
      print <<"HTML";
    <html><body><h1>Hello, $name</hi></body></html>
    HTML
    }
    else {
      print <<"HTML";
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    HTML
    }
    
    1;
    
    现在,您可以在浏览器中打开它

    如果您输入姓名并提交表单,它将显示问候语

    转换为PSGI 所有这些都是直截了当的。现在让我们转换它

    我们将从一个名为hello.psgi的新文件开始。它是否被称为.psgi并不重要,但这是惯例

    为了使它与PSGI协议一起工作,我们必须执行几个步骤。我们将用它来帮助我们做到这一点

    整个程序需要包装在
    my$app=sub{…}中呼叫

    #!/usr/bin/env plackup
    use strict;
    use warnings;
    
    use Plack::Request;
    
    my $app = sub {
      my $env = shift;    # this is the Plack environment
    
      my $req = Plack::Request->new($env);
    
      my $q    = CGI->new;
      my $name = $q->param('name');
    
      print $q->header;
      if ($name) {
        print <<"HTML";
    <html><body><h1>Hello, $name</hi></body></html>
    HTML
      }
      else {
        print <<"HTML";
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    HTML
      }
    };
    
    # no 1; here, we want it to return $app;
    
    现在,使用plackup运行此命令,然后在处请求它

    我们要求我们的Plack::Request为我们创建一个新的Plack::Response,设置一个内容类型,并将最终的(认为是不可变的)响应返回给Plack处理程序,它将序列化并作为一个实际的HTTP响应返回给浏览器

      my $content;
      if ($name) {
        $content .= <<"HTML";
    <html><body><h1>Hello, $name</hi></body></html>
    HTML
      }
      else {
        $content .= <<"HTML";
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    HTML
      }
    
      # prepare the response
      my $res = $req->new_response(200);
      $res->content_type('text/html');
      $res->body($content);
    
    现在替换所有
    print
    语句。创建一个新变量
    $content
    ,并将其连接到该变量,而不是
    打印
    输出。然后将其交给响应

      my $content;
      if ($name) {
        $content .= <<"HTML";
    <html><body><h1>Hello, $name</hi></body></html>
    HTML
      }
      else {
        $content .= <<"HTML";
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    HTML
      }
    
      # prepare the response
      my $res = $req->new_response(200);
      $res->content_type('text/html');
      $res->body($content);
    
    my$content;
    如果($name){
    
    $content.=这在很大程度上取决于您的用例。您说的是几行代码,所以您说的是小脚本?这些脚本并不小,但CGI的使用仅限于CGI::Fast功能和查询参数的解析。我自己进行路由调度,使用HTML::Template等模板,所以我已经有了这些意义上的框架。Ob连接到.Plack::Request的链接就是你的朋友。这应该是你所需要的。试试这个:
    plackup-MDDP-MPlack::Request-e'$app=sub{my$env=shift;my$req=Plack::Request->new($env);p$req->query_参数;return$req->new_response(200)->finalize;}“
    在另一个终端上,
    curl localhost:5000
    似乎需要一点指导。我会写一个答案和一个实践指南。同时,还看一看,我为测试CGI相关问题而临时拼凑的一个实用程序。它是从其他各种PSGI和CGI位构建的,展示了这些东西是多么简单在今年格拉斯哥的Perl会议上,“web代理背后的独立服务”,我想知道你到底是什么意思。我想我理解你重写我的东西的三个步骤,但我认为唯一特定于FastCGI的东西是请求循环本身。我必须确保我的变量在循环结束时是清晰的,但我不相信还有多少是特定于FastCGI的。@Marcus PSGI/Plack的核心功能之一是它允许您在没有传统web服务器的情况下运行它可以完全独立运行。但是您仍然可以使用某种传统的web服务器来代理请求并捕获静态资源。@Marcus:我的意思是,您的web应用程序将成为一个完全独立的服务(严格意义上的Unix)在高端口号上运行,接受HTTP请求并返回HTTP响应
    $ plackup hello.psgi
    HTTP::Server::PSGI: Accepting connections at http://0:5000/
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    Response should be array ref or code ref: 1 at ...
    
    # prepare the response
    my $res = $req->new_response(200);
    $res->content_type('text/html');
    
    return $res->finalize;
    
      my $content;
      if ($name) {
        $content .= <<"HTML";
    <html><body><h1>Hello, $name</hi></body></html>
    HTML
      }
      else {
        $content .= <<"HTML";
    <html><body><form method="GET">
        <label>What's your name? <input type="text" name="name"></label>
    </form></body></html>
    HTML
      }
    
      # prepare the response
      my $res = $req->new_response(200);
      $res->content_type('text/html');
      $res->body($content);