2009-05-21 4 views
1

Ich bin etwas neu in Perl/CGI, und ich komme aus einem Java/JSP-Hintergrund.Kann ich eine Anwendungsbereichsvariable in Perl haben?

Ich schreibe einen kleinen Prototyp und muss einige "schwere" Daten (~ 200MB) in eine Datenstruktur laden.

Nun möchte ich natürlich vermeiden, die Daten bei jeder Anfrage zu laden. Bisher habe ich es geschafft, eine "statische" Variable zu verwenden (eine in einem {} Block), aber das scheint für ein paar Anfragen zu funktionieren. Nach einer gewissen Inaktivitätszeit muss die nächste Anforderung die Daten erneut laden.

Aus meiner JSP-Erfahrung scheint dies eine Art Sitzungsvariable zu sein, die bis zum Ablauf der Sitzung verfügbar bleibt.

Wie kann ich eine "globale" oder "Anwendungs" -Variable einstellen? Nicht sicher, ob diese Bedingungen für CGI gelten ... Ist es möglich, dass eine Variable von allen Sitzungen einer Anwendung geteilt wird?

Btw, ich benutze gerade "CGI verwenden qw (: Standard)" im Moment.

+0

Die Daten sind dynamisch für jeden einzelnen Benutzer? Oder ist es für einen bestimmten Zeitraum dynamisch, aber für alle Benutzer während dieser Zeitspanne? –

+0

Da dies nur wieder auftauchte, lassen Sie mich erwähnen, die Verbreitung von Perl-Frameworks sowie bessere Apache-Verknüpfungen (mod_perl usw.) haben ziemlich jeden Grund, CGI zumindest direkt zu verwenden, getötet. –

Antwort

5

CGI-Programme werden für jede Anforderung in einem separaten Prozess ausgeführt. Dies ist Teil der CGI protocol.

Das ist also nicht möglich, solange Sie an CGI gebunden sind. Bist du sicher, dass du an CGI gebunden bist?

Wenn Sie Apache ausführen und Apache mod_perl entweder kompiliert oder als dynamisch geladenes Modul verfügbar hat, ist es möglich, die Perl-Skripte im Prozess auszuführen und die Daten erneut zu verwenden. Es gibt sogar einen Kompatibilitätsmodus, in dem Sie Ihre CGI-Skripte normal schreiben können (mit "CGI verwenden"), und sie werden automatisch moduliert, so dass Sachen innerhalb von BEGIN-Blöcken nur einmal ausgeführt werden.

6

CGI-Skripte werden ausgeführt und enden nach jeder Anfrage. Ihre 200 MB-Variable wird jedes Mal geladen.

Sie sollten diese Daten in einer Datenbank oder einem anderen strukturierten Format speichern, damit Sie die Daten nur so laden können, wie Sie sie benötigen.

Schauen Sie in so etwas wie MLDBM, DBD::SQLite oder DBM::Deep

Siehe Coping with Scoping für Informationen über den Geltungsbereich von Variablen in Perl.

Ovid's CGI Course ist auch eine gute Quelle für das Schreiben von CGI-Skripten in Perl.

+0

Nicht an CGI per se gebunden, ich habe einen Isapi-Handler von IIS 7 (keuch!), Der .pl-Erweiterungen behandelt. Dies ist für einen schnellen internen Prototyp, also wäre eine DB-Lösung sehr viel zeitintensiver als ich möchte ... danke! –

+0

Deshalb sind die vorgeschlagenen Module leichte DBIs. Sie benötigen eine Möglichkeit, um Informationen zwischen Prozessen auszutauschen. Dies ist der schnellste Weg dorthin. – darch

1

Haben Sie sich das Speichermodul und seine Einfrier-/Auftau-Methoden angeschaut, um Ihre Objektstruktur einzufrieren und vorübergehend zu speichern?

Storable ermöglicht es Ihnen, Ihre Struktur zu schreiben und von allem abzurufen, was als eine Datenbank angesehen werden kann, einschließlich Berkley oder sogar flache Dateien. Während 200 MB ein großer zu speichernder Chunk sind, können Sie die Daten in kleinere Hashes umgruppieren, die einfach wieder zusammengefügt werden können.

Und es ist super schnell.

1

Versuchen Sie CGI::Session Modul.

Beachten Sie jedoch, dass wie Daniel Martin und daotoad schrieb Peristency ist außerhalb Bereich von CGI; Sie müssten eine Art zusätzlichen Speicher bereitstellen, um den Status zu speichern.

0

Ich würde in Betracht ziehen, in CGI::Fast zu schauen, wenn ich Sie wäre. CGI :: Fast macht es einfach, ein persistentes CGI-Programm zu schreiben. Eine weitere gute Option, je nachdem, wie Ihre Datenstruktur aussieht, ist die Verwendung der Cache::Memcached (oder ihrer schnelleren Cousine Cache::Memcached::XS), um die Datenstruktur aus Ihrem Programm zu entfernen, sie jedoch im Speicher zu belassen.