1

だから私は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 番号を返します。

これについて 3 つの質問があります。

  • このスクリプトでこの $dbh を作成すると、データベース接続を開いたままにすることでパフォーマンスが向上しますか?

  • $dbh を自分のモジュールに入れても、効率が悪いことを恐れることはありませんか?

  • $dbh (および関連する情報 (パスをコード内のプレーン テキストで保持します。それは悪いことですか?)) を、Web サイトを介して直接やり取りされないモジュールに保持することには、セキュリティ上の利点がありますか?

4

2 に答える 2

3

このスクリプトでこの $dbh を作成すると、データベース接続を開いたままにすることでパフォーマンスが向上しますか?

$dbh を自分のモジュールに入れても、効率が悪いことを恐れることはありませんか?

一般に、データベース接続が開いている時間を最小限に抑える必要があります。同時に多数の接続を開くと、パフォーマンスが低下します。接続を開いたままにしておく時間が長ければ長いほど、多くの人が同時にサイトを使用すると、より多くの接続が蓄積されます.

一方で、切断と再接続を何度も行うと、パフォーマンスが低下する可能性もあります。

サイトで大量のトラフィックが予想される場合、最善の解決策は接続プールを実装することです。これにより、多数のアクティブな接続を開いて使用できるように保ちますが、それらを特定のユーザーに関連付けることはありません。 ここでは、Perl を使用した MySQL 接続プーリングについて説明します。このように実装する場合、可能な限り最小限の時間で接続を開く必要があります。フードの下で「実際の」オープンではなく、すでに開いている接続の割り当てであるため、効率的です。

$dbh (および関連情報 (パスをコード内のプレーン テキストで保持します。それは悪いことですか?)) を、Web サイトを介して直接やり取りされないモジュールに保持することには、セキュリティ上の利点がありますか?

モジュールが Web からアクセスできないフォルダーにある場合は、わずかな利点になる可能性があります。ただし、パスワードを平文で保存するべきではありません。 ここでは、その他のオプションについて説明します。

于 2012-10-24T07:33:55.783 に答える
0

モジュールで静的変数を作成するか、完全な OO にして、$dbh内部で初期化してそれを維持するモジュール オブジェクトを作成できます。これを行うことによるパフォーマンスへの影響はありません。

外部データとのやり取りに関しては、モジュールはコードをパッケージ化する別の方法にすぎないため、メイン コードと同じように悪用される可能性があります (またはありそうにありません)。他の予防措置 (汚染モードの使用など) に頼る必要があります。

于 2012-10-24T07:26:50.530 に答える