2010-10-11 71 views
1

我正在尋找跨兩個Perl腳本的高效溝通方式。我有兩個腳本;腳本1生成一些數據。我希望我的 腳本2能夠訪問該信息。如何通過Perl CGI腳本進行通信?

最簡單/最笨的 方法是將腳本1生成的數據作爲文件寫入,稍後使用腳本2將其讀取爲 。除此之外還有其他方法嗎?我可以將 數據存儲在內存中並將其提供給腳本2(當然,我的Linux支持 )?由腳本1表示malloc一些數據,並且使腳本2能夠訪問它 。

不能保證腳本2將在腳本1之後運行。因此 應該有一些方法來使用看門狗定時器釋放該內存。

讓我再揭示一些背景。我使用CGI-Perl在網絡服務器上運行這些腳本。因此,點擊一個按鈕腳本1運行,它會生成一個html網頁。現在用戶可以添加一些輸入到這個生成的網頁並點擊這個新頁面上的一個按鈕。現在腳本2應該能夠讀取新的網頁上的數據。我可以將數據重新發回到網絡服務器但更有效的方法是將生成的頁面副本保留在服務器中,並將其提供給腳本2.現在,我想避免將生成的頁面記錄爲文件。我正在考慮將它存儲在內存中

+3

知道你想要做什麼可能會有所幫助。 – muhmuhten 2010-10-11 16:33:53

回答

2

這取決於您的使用情況......一大組數據?許多小消息?你可以關於數據持久性嗎?它完全異步嗎?

一些選項有:

  • 對於任何但是最高服務表現的網站,最好的辦法是寫我們的HTML頁面文件!。除非以進程間通信爲基準來衡量性能的瓶頸,否則不要同時使用任何非文件解決方案(共享內存,緩存,中間服務器)。

  • 特別是對於同一臺服務器上的兩個CGI腳本,如果你在mod_perl下運行它們,或者在2個CGI進程之間共享Perl解釋器的其他安排,你可以開發一個包作爲緩存,它的包級別變量 - 只要mod_perl正在運行,可以通過mod_perl保存在內存中,因此可以由編寫器CGI進程和讀取器CGI進程進行通信。當然,需要考慮與讀寫器相關的通常的同步/死鎖和持久性問題。

    作爲替代,使用Apache :: Session會話來存儲會話間數據。

  • 如您所述,共享內存。例如,使用IPC::ShareLite,IPC :: Cache或this solution from perlmonks

    另外,請從O'Reilly的「Perl的菜譜」第16章方12「不同進程共享變量」(沒有聯繫,因爲非盜版版本是不在線的任何地方我知道的)

  • 使用永久性媒體。一個文件是一個選項。數據庫是另一個。

  • 對於異步,使用中間消息傳遞系統(MQ,Tibco,更輕量級的東西)。在這種情況下可能有點矯枉過正,但要注意一個有效的選項。這一個可能會非常穩定和優化,但可能不是免費的,靈活性較低/可以定製。

  • 或者推出自己的簡單郵件系統服務器 - 對於您似乎需要的非常簡單的郵件服務器來說,這並不複雜。

    在一個端口上偵聽來自第一個進程的請求以存儲數據,在另一個端口偵聽來自使用者進程的請求以向您發送該數據,將數據存儲在內存中的存儲區域中,並在使用警報到期時將其清除獨立觀察員子進程)。

+0

是的,他們完全異步。數據非常大。這不是很多小消息。他們是「罕見的大消息」。 – Jean 2010-10-11 17:12:26

+1

澄清你的問題。不要在評論中隱藏這些信息。 – 2010-10-11 17:27:59

+0

添加了CGI特定的答案。 – DVK 2010-10-11 18:07:55

1

您已將問題標記爲「cgi」。他們都是CGI程序嗎?在這種情況下,他們可以通過發出HTTP請求相互交談。

但是,您必須告訴更多關於您爲什麼試圖做到這一點以及需要完成什麼以幫助我們的問題。 Perl程序以某種方式與彼此進行通信確實很容易,但這並不意味着它對您而言是正確的答案。

當您對CGI程序之間的交互有複雜的要求時,您可能希望轉到一個Web框架,該框架爲您處理大量這些細節。 Catalyst可能是你想要開始的地方。甚至還有一本書。

+0

通過適當的模板和會話管理,您不需要執行任何操作。 – 2010-10-11 17:26:22

+0

「通過適當的模板和會話管理」您能否詳細解釋一下?或者我可以閱讀的地方。這是我第一次編寫CGI-Perl應用程序。 – Jean 2010-10-11 17:33:55

+0

有很多書籍等,這是一個很大的課題。 Google很好。這聽起來像你可能想要一個Web框架,比如Catalyst。 – 2010-10-11 17:48:44

相關問題