我正在使用Perl来填充两个html表(每个表都是在自己的Perl CGI脚本中生成的).我有一个运行SQL查询的'helper'脚本.这是一个例子(让我们称之为这个脚本run_sql_query.pl):
my $sql_query = "SELECT ID from TABLE where ID > 3";
our $sth = $dbh->prepare($sql_query);
$sth->execute;
Run Code Online (Sandbox Code Playgroud)
然后,在我的两个Perl CGI脚本中,我做了:
require 'run_sql_query.pl';
our $sth;
while (my ($table_id) = $sth->fetchrow_array) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,它看起来像是run_sql_query.pl运行两次(每个Perl CGI脚本中运行一次).我怎么能拥有它所以run_sql_query.pl只执行一次然后$sth在两个Perl CGI脚本中使用相同的内容?
如果我理解正确,您希望保存查询结果,以便其他进程可以再次使用它.有几种方法可以做到这一点,所有这些都涉及设置某种缓存.
CGI进程具有单独的内存,因此您无法直接执行所要求的操作.更糟糕的是,它们为每个请求启动和停止,浪费了大量的时间进行编译.但是,有很多方法可以解决这个问题.
如果您的SQL查询很昂贵,并且数据不经常更改,您可以让数据库缓存结果.例如,这是MySQL缓存.这样做的好处是,使用数据库的所有内容都将使用它.缺点是您的程序仍然需要获取和处理所有数据.使用这个是您的查询很昂贵,但获取和处理它不是,并且您的数据不会经常更改.
另一种选择是设置外部缓存,例如memcached,以存储结果.Memcached基本上是您机器上存储大量数据的服务器.或者您甚至可以使用数据库本身来缓存已处理的HTML表.每个进程都可以在自己计算之前检查他们想要的数据是否在缓存中.您可以使用CHI之类的东西与它进行交互.优点是你可以将任何你想要的东西放入缓存中.缺点是您必须自己管理缓存(即,当数据耗尽时删除数据),这是管理的另一件事,缓存可能随时消失.
最后,您可以更改流程的运行方式.一个基本的效率增益是从普通的CGI改变,它可以为每个请求启动,编译,运行和完成你的程序,就像在你自己的小服务器上运行程序的FastCGI.可以把它想象成while围绕整个程序.现在,由于您的程序没有在每个请求之间关闭,因此您可以将数据存储在全局变量中.然后,这是一个简单的事情,做@foampile建议,存储你的表our @Table_Cache等.这将为该进程缓存它,但不会为其他进程缓存.每个不同的程序都是自己的过程.所以foo.cgi不会分享bar.cgi.优点是它很容易,FastCGI是你应该切换到的东西,你的网络服务器可能已经支持它.缺点是您需要管理缓存(即删除过期的条目),并且它不会跨进程共享.
我将从FastCGI开始,看看是否能解决您的性能问题.这意味着每次服务器重启时,您只会运行每个查询两次而不是每次请求.
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |