簡體   English   中英

多個CGI Perl腳本

[英]Multiple CGI Perl scripts

這是一個理論問題。 我正在嘗試基於生產者 - 消費者范例開發Perl應用程序。 其中一個腳本創建一個包含數據的文件,而另一個腳本讀取數據並且必須在HTML中顯示。 還有第三個文件,一個HTML表單,它啟動生產者perl文件。

我不知道是怎么跑兼顧生產者和使用CGI同時消費者,我不能在網上找到關於它的信息(至少不是我怎么尋找它)。

我想知道你是否可以告訴我在哪里可以找到這種信息,以便我可以在Apache服務器上測試應用程序。

提前致謝

您可以use Module_Name;導入模塊use Module_Name; 或者require Module_Name; 在你的CGI腳本中。 http://perldoc.perl.org/functions/use.html http://perldoc.perl.org/functions/require.html

Plack網絡框架不是銀彈,CGI沒有死,FCGI是所有速度所在的地方。

不要買入普拉克炒作。 了解它的第一個!

免責聲明:我認為這個問題歸結為如何讓程序的兩個不同組件相互交互,以創建一個可從Web訪問的應用程序。 如果那不是你想要的,那就把它作為思考的食物吧。

通用網關接口

您在談論您的問題中的CGI腳本。 (強調我的)。

我正在嘗試基於生產者 - 消費者范例開發Perl 應用程序 其中一個腳本創建一個包含數據的文件,而另一個腳本讀取數據並且必須在HTML中顯示。

通常, CGI以請求通過Web服務器的方式工作,並傳遞給應用程序。 該應用程序可能是用Perl編寫的。 如果它是Perl腳本,則該腳本由perl解釋器運行。 Web服務器啟動該過程。 它可以通過CGI訪問請求信息,CGI主要是環境變量。 完成此過程后,它會將數據寫入STDOUT,Web服務器將其作為響應並發回。

+-----------+        +-------------+                     +----------------+
|           | +----> |             | +-----Request-----> |                |
|  Browser  |        | Web server  |                     |  perl foo.cgi  |
|           | <----+ |             | <-----Response----+ |                |
+-----------+        +-------------+                     +----------------+

現在因為Web服務器后面只涉及一個進程,所以不能有兩個腳本。 服務器無法同時與兩件事進行通信。 這不是CGI的工作方式。

綜合方法

相反,您需要將兩個腳本包裝到單個入口點並將它們轉換為某種組件。 然后你可以讓他們在內部互相交談,而在外面,Web服務器只等待一個程序完成。

+-----------+        +-------------+                     +-----------------+
|           | +----> |             | +-----Request-----> |                 |
|  Browser  |        | Web server  |                     |  perl foo.cgi   |
|           | <----+ |             | <-----Response----+ |                 |
+-----------+        +-------------+                     | +-------------+ |
                                                         | |  Producer   | |
                                                         | +-----+-------+ |
                                                         |       |         |
                                                         |       |         |
                                                         |       V         |
                                                         | +-------------+ |
                                                         | | Consumer    | |
                                                         | +-------------+ |
                                                         |                 |
                                                         +-----------------+

要將其轉換為Perl,我們首先確定一些術語。

  • script :一個.l文件中的Perl程序,它沒有自己的package
  • module :一個位於.pm文件中的Perl模塊,它具有一個package適合文件名的命名空間的package

假設您有兩個我們稱之為producer.plconsumer.pl的 Perl腳本。 它們大大簡化,不考慮任何參數。

producer.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;

consumer.pl

#!/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;

這是簡化得到的。 有一個腳本可以創建數據,另一個腳本可以使用它。 現在我們需要在不實際運行它們的情況下進行這兩個交互。

讓我們繼續前進並假設我們已經重構了這兩個腳本並將它們轉換為模塊。 我們稍后會看到它是如何工作的。 我們現在可以在新的foo.pl腳本中使用這些模塊。 它將處理請求,向生產者詢問數據並讓消費者將數據轉換為讀者想要的格式。

foo.pl

#!/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;

Consumer.pm

package Consumer;
use strict;
use warnings 'all';

sub consume {
    my ($data) = @_;

    return $data; # this is really simple
}

1;

現在,如果調用正確的函數,我們有兩個與腳本相同的模塊。 我所做的就是在頂部放置一個命名空間( package ),並將代碼包裝在一個sub 我也刪除了CGI部分。

在我們的示例中,生產者沒有必要寫入文件。 它只能返回數據結構。 消費者反過來不需要從文件中讀取。 它只需要一個帶有數據結構的變量,並為它提供東西來呈現它。

如果你堅持使用一致的函數名稱(比如produceconsume ,就更好),你甚至可以編寫多個生產者或消費者。 我們在這里基本上定義了一個接口。 這使我們有可能在不破壞兼容性的情況下重構代碼的內部,但也可以堅持完全不同的生產者或消費者。 只要您堅持使用界面,就可以從單行字符串生成器切換到在心跳中查找數據庫中的內容的生成器。

基本上,我們剛剛做的也可以這樣顯示:

+--foo.pl---------------------------+
|                                   |
|  +------+        +-------------+  |
|  |      | +----> |             |  |
|  |      |        |  Producer   |  |
|  |      | <----+ |             |  |
|  | main |        +-------------+  |
|  | foo  |                         |
|  | body |        +-------------+  |
|  |      | +----> |             |  |
|  |      |        |  Consumer   |  |
|  |      | <----+ |             |  |
|  +------+        +-------------+  |
|                                   |
+-----------------------------------+

這可能看起來有點熟悉。 它本質上是模型 - 視圖 - 控制器 (MVC)模式。 在Web環境中,模型和視圖通常只通過控制器相互通信,但它幾乎相同。

我們的制作人是一個數據模型 消費者將數據轉換為用戶可以看到的網站,因此它就是視圖 foo.pl中的主程序將兩者粘合在一起控制着數據流。 這是控制器

觸發整個事物的初始網站可以是程序的一部分,如果沒有傳遞參數則顯示,或者可以是獨立的.html文件。 隨你(由你決定。

所有這一切都可以用普通的舊CGI實現。 您不需要使用任何Web框架。 但隨着您的應用程序的發展,您將看到現代化的框架使您的生活更輕松。


使用http://asciiflow.com/創建的圖表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM