2010-10-11 62 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