Perl:将$ dbh移交给模块。安全性和性能?

时间:2012-10-24 05:48:50

标签: mysql performance perl security cgi

所以我有一个cgi脚本,

#!/usr/bin/perl -T

use strict;
use warnings;
use DBI;
use WebEngine;


my $dbh = DBI->connect('DBI:mysql:database', $username, $password)
    || die "Could not connect to database: $DBI::errstr";

my $we = WebEngine->new($dbh)
    or die("Failed to instantiate WebEngine object:\n$!\n");

$userID = $we->register("MyUsername", $dbh);

此脚本创建数据库处理程序,然后使用我制作的模块来处理站点的大部分后端,以注册用户名并返回用户ID号。

我有三个问题。

  • 在此脚本中创建此$ dbh是否会通过保持数据库连接打开来提高性能?

  • 我可以将$ dbh放在我的模块中,不要担心效率低下吗?

  • 保存$ dbh(以及相关信息(我在代码中以纯文本形式传递;是不是很糟糕?))的安全性好处是在未通过我直接与之交互的模块中网站?

2 个答案:

答案 0 :(得分:3)

  

在此脚本中创建此$ dbh是否会通过保留来提高性能   数据库连接打开了吗?

     

我可以将$ dbh放在我的模块中而不是担心效率低下吗?

通常,您希望最小化数据库连接打开的时间长度。同时打开大量连接会损害性能。保持连接打开的时间越长,当很多人同时使用您的网站时,您将积累的连接越多。

另一方面,多次断开连接和重新连接也会影响性能。

如果您希望网站上的流量很大,那么最佳解决方案是实施连接池。这使得许多活动连接保持打开和可用,但不会将它们绑定到特定用户。 Here is a discussion of MySQL connection pooling with Perl。如果以这种方式实现它,那么您可能希望在尽可能短的时间内打开连接。它将是高效的,因为它不是一个“真正的”开放式 - 只是一个已经打开的连接的分配。

  

保持$ dbh(及相关联的文件)是否有安全优势?   info(我在代码中以明文形式传递我的传递;那是不是很糟糕?))   没有通过我的网站直接与之互动的模块?

如果模块位于非Web可访问文件夹中,那可能会带来一些好处。但实际上,您不应该以纯文本格式存储密码。 Here is a discussion of some other options.

答案 1 :(得分:0)

您可以在模块中创建静态变量,或者使用完整的OO并创建在内部初始化$dbh并使其保持活动状态的模块对象。这样做不会对性能产生影响。

至于与外部数据的交互 - 您的模块只是打包代码的另一种方式,因此它很可能(或不太可能)被用作主代码。您应该依赖其他预防措施(例如使用污染模式)。