我对Perl / CGI有点新,我来自Java / JSP背景。
我正在编写一个小型原型,需要将一些“重”数据(~200MB)加载到数据结构中。
现在,我显然希望避免在每次请求时加载数据。到目前为止,我设法使用一个“静态”变量(一个封装在{}块中),但这似乎适用于一些请求。在一些不活动时间之后,下一个请求将不得不再次加载数据。
从我的JSP经验来看,这似乎是一种会话变量,在会话到期之前仍然可用。
如何设置“全局”或“应用程序”变量?不确定这些条款是否适用于CGI ...... 是否可以让应用程序的所有会话共享一个变量?
是的,我现在只是使用“使用CGI qw(:标准)”。答案 0 :(得分:6)
执行CGI脚本,然后在每次请求后终止。每次都会加载您的200 MB变量。
您应该将此数据放入数据库或其他结构化格式,以便您只在需要时加载数据。
查看类似MLDBM,DBD::SQLite或DBM::Deep
的内容有关Perl中变量范围的信息,请参阅Coping with Scoping。
Ovid's CGI Course也是学习在Perl中编写CGI脚本的好资源。
答案 1 :(得分:5)
CGI程序在每个请求的单独进程中运行。这是CGI protocol。
的一部分只要您受CGI约束,这是不可能的。你确定你被CGI绑定了吗?
如果您正在运行Apache,并且Apache已将mod_perl编译或作为动态加载的模块提供,则可以在进程中运行perl脚本并重新使用数据;甚至还有一种兼容模式,你可以正常编写你的CGI脚本(使用“使用CGI”),它们会自动进行模式化,这样BEGIN块内的东西只能运行一次。
答案 2 :(得分:1)
您是否查看了Storable模块及其冻结/解冻方法以冻结对象结构并暂时存储它? CPAN > Storable
Storable允许您编写和检索任何可以被视为数据库的结构,包括Berkley,甚至是平面文件。虽然200 MB是一个很大的存储块,但您可以将数据重组为较小的哈希值,这些哈希值可以轻松地重新组合在一起。
它非常快。
答案 3 :(得分:1)
尝试使用CGI::Session模块。
但是请注意,像丹尼尔·马丁和道托德这样写的内容是 范围的CGI;你必须使用某种额外的存储来保存状态。
答案 4 :(得分:0)
如果我是你,我会考虑调查CGI::Fast。 CGI :: Fast可以轻松编写持久的CGI程序。另一个好的选择,取决于您的数据结构是什么,是使用Cache::Memcached(或其更快的表兄Cache::Memcached::XS)将数据结构移出您的程序,但仍留在内存中。