如何在Perl CGI脚本之间进行通信?

时间:2010-10-11 16:31:56

标签: perl cgi webserver communication

我正在寻找跨两个Perl的有效通信方式 脚本。我有两个脚本;脚本1生成一些数据。我想要我的 脚本2能够访问该信息。

最简单/最愚蠢 方法是将脚本1生成的数据写为文件并读取它 以后使用脚本2.还有其他方法吗?我可以存储吗? 内存中的数据并使其可用于脚本2(当然有 我的Linux支持)?通过脚本1和make来表示malloc的一些数据 脚本2能够访问它。

无法保证脚本2将在脚本1之后运行。所以 应该有一些方法可以使用看门狗定时器释放内存。

让我揭示更多背景。我正在使用CGI-Perl在Web服务器上运行这些脚本。因此,只需单击按钮,脚本1就会运行,它会生成一个html网页。现在,用户可以向此生成的网页添加一些输入,然后单击此新页面上的按钮。现在,脚本2应该能够读取新网页上的数据。我可以再次将数据发布回Web服务器但更有效的方法是在服务器中保留生成的页面的副本,并使其可用于脚本2.现在,我想避免将生成的页面写为文件。我想把它存储在内存中

2 个答案:

答案 0 :(得分:2)

这在某种程度上取决于您的使用......一大组数据?很多小消息?你可以了解数据的持久性吗?它是完全异步的吗?

有些选项是:

  • 对于除最高性能网站之外的任何网站,最好的方法是将HTML页面写入文件!。除非intrer-process通信的基准测试是性能的底线,否则不要同时使用任何非文件解决方案(共享内存,缓存,中间服务器)。

  • 特别是对于同一服务器上的两个CGI脚本,如果你在mod_perl下运行它们或者在两个CGI进程之间共享Perl解释器的其他一些安排,你可以开发一个包作为缓存,它的包装 - level变量 - 只要mod_perl正在运行,就会被mod_perl保存在内存中,因此可以由编写器CGI进程和读者CGI进程使用来进行通信。当然,需要考虑与读取器/写入器相关的常见同步/死锁和持久性问题。

    作为替代方案,使用Apache :: Session会话来存储会话间数据。

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

    此外,请查看O'Reilly的“Perl Cookbook”中的第16章食谱12“在不同进程中共享变量”(没有链接,因为非盗版版本不在我知道的任何地方在线)

  • 使用永久性媒介。文件是一种选择。数据库是另一个。

  • 对于异步,请使用中间消息传递系统(MQ,Tibco,更轻量级的东西)。在这种情况下可能有点矫枉过正,但需要注意一个有效的选择。这个可能非常稳定可靠,但可能不是免费的,也不那么灵活/量身定制。

  • 或者滚动你自己的简单消息系统服务器 - 对于你似乎需要的非常简单的服务器来说,这并不复杂。

    在一个端口上侦听来自第一个进程的请求以存储数据,在另一个端口上侦听来自使用者进程的请求以向您发送该数据,将数据存储在内存中的存储区域中并在其到期时使用警报或单独清除它观察者儿童过程)。

答案 1 :(得分:1)

您已将问题标记为“cgi”。它们都是CGI程序吗?在这种情况下,他们可以通过发出HTTP请求来相互通信。

但是,您必须详细说明为什么要尝试这样做以及您需要完成哪些工作才能帮助您。 Perl程序以某种方式相互通信当然很容易,但这并不意味着它对你来说是正确的答案。

当您对CGI程序之间的交互有复杂的要求时,您可能希望转移到一个Web框架,为您处理大量这些细节。 Catalyst可能是您想要开始的地方。甚至还有一本书。