多个CGI Perl脚本
这是一个理论问题。我正试图开发一个基于生产者-消费者范式的Perl应用程序。其中一个脚本创建一个包含数据的文件,而另一个脚本读取数据并以HTML格式显示。还有第三个文件,一个HTML表单,它启动producerperl文件 我不知道的是如何使用CGI同时运行生产者和消费者,我在网上找不到关于CGI的信息(至少不知道我是如何搜索的) 我想知道您是否可以告诉我在哪里可以找到此类信息,以便我可以在Apache服务器上测试应用程序多个CGI Perl脚本,perl,cgi,Perl,Cgi,这是一个理论问题。我正试图开发一个基于生产者-消费者范式的Perl应用程序。其中一个脚本创建一个包含数据的文件,而另一个脚本读取数据并以HTML格式显示。还有第三个文件,一个HTML表单,它启动producerperl文件 我不知道的是如何使用CGI同时运行生产者和消费者,我在网上找不到关于CGI的信息(至少不知道我是如何搜索的) 我想知道您是否可以告诉我在哪里可以找到此类信息,以便我可以在Apache服务器上测试应用程序 提前感谢您可以使用使用模块名称导入模块或需要模块名称代码。 Plack
提前感谢您可以使用
使用模块名称导入模块代码>或需要模块名称在CGI脚本中编写>代码。
Plack web框架并不是万能的,CGI并没有消亡,FCGI是速度最快的地方
不要相信普莱克的炒作。先了解它是什么 您可以使用使用模块名称导入模块代码>或需要模块名称在CGI脚本中编写>代码。
Plack web框架并不是万能的,CGI并没有消亡,FCGI是速度最快的地方
不要相信普莱克的炒作。先了解它是什么 免责声明:我认为这个问题归根结底是如何让一个程序的两个不同组件相互交互,以创建一个可从web访问的应用程序。如果这不是你想要的,就把它当作思考的食物
通用网关接口
您在问题中谈论的是CGI脚本。(我的重点)
我正试图开发一个基于生产者-消费者范式的Perl应用程序。其中一个脚本创建一个包含数据的文件,而另一个脚本读取数据并以HTML格式显示
通常,它的工作方式是请求通过web服务器传递给应用程序。该应用程序可以用Perl编写。如果是Perl脚本,则该脚本由Perl解释器运行。web服务器启动该进程。它可以通过CGI访问请求信息,CGI主要是环境变量。处理完成后,它将数据写入标准输出,web服务器将其作为响应并发回
+-----------+ +-------------+ +----------------+
| | +----> | | +-----Request-----> | |
| Browser | | Web server | | perl foo.cgi |
| | <----+ | | <-----Response----+ | |
+-----------+ +-------------+ +----------------+
consumer.pl
#!/usr/bin/perl
use strict;
use warnings 'all';
use CGI;
open my $fh, '>', 'product.data' or die $!;
print $fh "lots of data\n";
close $fh;
#!/usr/bin/perl
use strict;
use warnings 'all';
use CGI;
my $q = CGI->new;
print $q->header('text/plain');
open my $fh, '<', 'product.data' or die $!;
while my $line (<$fh>) {
print $line;
}
exit;
#!/usr/bin/perl
use strict;
use warnings 'all';
use Producer; # this was producer.pl
use Consumer; # this was consumer.pl
use CGI;
my $q = CGI->new;
my $params; # those would come from $q and are the parameters for the producer
my $product = Producer::produce($params);
my $output = Consumer::consume($product);
print $q->header;
print $output;
exit;
这很简单。我们从CGI读取参数,将其传递给生产者,然后将产品传递给消费者。这给了我们输出,我们打印出来,然后返回服务器,服务器发送响应
让我们看看我们是如何将这两个脚本转换成简单的模块的。这些不需要面向对象,尽管这可能是首选。请注意,文件名的拼写现在不同了。模块名称通常以大写字母开头
Producer.pm
package Producer;
use strict;
use warnings 'all';
sub produce {
my @args = @_;
return "lots of data\n";
}
1;
package Consumer;
use strict;
use warnings 'all';
sub consume {
my ($data) = @_;
return $data; # this is really simple
}
1;
消费者.pm
package Producer;
use strict;
use warnings 'all';
sub produce {
my @args = @_;
return "lots of data\n";
}
1;
package Consumer;
use strict;
use warnings 'all';
sub consume {
my ($data) = @_;
return $data; # this is really simple
}
1;
现在我们有两个模块,如果调用正确的函数,它们的作用与脚本相同。我所做的就是在顶部放置一个名称空间(包
),并将代码包装在一个子中。我还删除了CGI部分
在我们的示例中,生产者不必写入文件。它可以只返回数据结构。消费者不需要从文件中读取数据。它只需要一个带有数据结构的变量,并对其进行处理来表示它
如果您坚持使用一致的函数名(如product
和consume
,更好),您甚至可以编写多个生产者或消费者。我们在这里基本上定义了一个接口。这使我们有可能在不破坏兼容性的情况下重构代码的内部结构,但也有可能加入完全不同的生产者或消费者。您可以从一行字符串生成器切换到一个在心跳中查找数据库中的内容的生成器,只要您坚持使用您的接口
从本质上讲,我们刚才所做的也可以这样表现:
+--foo.pl---------------------------+
| |
| +------+ +-------------+ |
| | | +----> | | |
| | | | Producer | |
| | | <----+ | | |
| | main | +-------------+ |
| | foo | |
| | body | +-------------+ |
| | | +----> | | |
| | | | Consumer | |
| | | <----+ | | |
| +------+ +-------------+ |
| |
+-----------------------------------+
+-foo.pl---------------------------+
| |
| +------+ +-------------+ |
| | | +----> | | |
|| | | |制作人||
| | | | | |
|| | |消费者||
|| |免责声明:我认为这个问题归根结底是如何让一个程序的两个不同组件相互交互,以创建一个可从web访问的应用程序。如果这不是你想要的,就把它当作思考的食物
通用网关接口
您在问题中谈论的是CGI脚本。(我的重点)
我正试图开发一个基于生产者-消费者范式的Perl应用程序。其中一个脚本创建一个包含数据的文件,而另一个脚本读取数据并以HTML格式显示
通常,它的工作方式是请求通过web服务器传递给应用程序。该应用程序可以用Perl编写。如果是Perl脚本,则该脚本由Perl解释器运行。web服务器启动该进程。它可以通过CGI访问请求信息,CGI主要是环境变量。处理完成后,它将数据写入标准输出,web服务器将其作为响应并发回
+-----------+ +-------------+ +----------------+
| | +----> | | +-----Request-----> | |
| Browser | | Web server | | perl foo.cgi |
| | <----+ | | <-----Response----+ | |
+-----------+ +-------------+ +----------------+
consumer.pl
#!/usr/bin/perl
use strict;
use warnings 'all';
use CGI;
open my $fh, '>', 'product.data' or die $!;
print $fh "lots of data\n";
close $fh;
#!/usr/bin/perl
use strict;
use warnings 'all';
use CGI;
my $q = CGI->new;
print $q->header('text/plain');
open my $fh, '<', 'product.data' or die $!;
while my $line (<$fh>) {
print $line;
}
exit;
#!/usr/bin/perl
use strict;
use warnings 'all';
use Producer; # this was producer.pl
use Consumer; # this was consumer.pl
use CGI;
my $q = CGI->new;
my $params; # those would come from $q and are the parameters for the producer
my $product = Producer::produce($params);
my $output = Consumer::consume($product);
print $q->header;
print $output;
exit;
这很简单。我们从CGI读取参数,将其传递给生产者,然后将产品传递给消费者。这给了我们输出,我们打印出来,然后返回服务器,服务器发送响应
让我们看看我们是如何将这两个脚本转换成简单的模块的。这些不需要面向对象,尽管这可能是首选。请注意,文件名的拼写现在不同了。模块名称通常以大写字母开头
Producer.pm
package Producer;
use strict;
use warnings 'all';
sub produce {
my @args = @_;
return "lots of data\n";
}
1;
package Consumer;
use strict;
use warnings 'all';
sub consume {
my ($data) = @_;
return $data; # this is really simple
}
1;
消费者.pm
package Producer;
use strict;
use warnings 'all';
sub produce {
my @args = @_;
return "lots of data\n";
}
1;
package Consumer;
use strict;
use warnings 'all';
sub consume {
my ($data) = @_;
return $data; # this is really simple
}
1;
现在我们有两个mo