FCGI::Buffer – FCGI-Ausgabe überprüfen, zwischenspeichern und optimieren
Version 0.19
FCGI::Buffer überprüft den von Ihnen erstellten HTML-Code, indem er ihn über HTML::Lint
weiterleitet.
FCGI::Buffer optimiert FCGI-Programme durch Reduzierung, Filterung und Komprimierung der Ausgabe, um die Übertragung zu beschleunigen, und durch nahezu nahtlose Nutzung von Client- und Server-Caches.
Um Client-Caches zu nutzen, d. h. um unnötige Anrufe an Ihren Server zu reduzieren, die nach denselben Daten fragen:
use FCGI;
use FCGI::Buffer;
# ...
my $request = FCGI::Request();
while($request->FCGI::Accept() >= 0) {
my $buffer = FCGI::Buffer->new();
$buffer->init(
optimise_content => 1,
lint_content => 0,
);
# ...
}
Um auch Server-Caches nutzen zu können, also neu generierte Ausgaben zu speichern, wenn verschiedene Clients Sie nach den gleichen Daten fragen, müssen Sie einen Cache erstellen. Aber das ist einfach:
use FCGI;
use CHI;
use FCGI::Buffer;
# ...
my $request = FCGI::Request();
while($request->FCGI::Accept() >= 0) {
my $buffer = FCGI::Buffer->new();
$buffer->init(
optimise_content => 1,
lint_content => 0,
cache => CHI->new(driver => 'File')
);
if($buffer->is_cached()) {
# Nothing has changed - use the version in the cache
$request->Finish();
next;
# ...
}
}
Um die Verwendung serverseitiger Caches vorübergehend zu verhindern, beispielsweise beim Debuggen vor der Veröffentlichung einer Codeänderung, legen Sie die Umgebungsvariable NO_CACHE auf einen beliebigen Wert ungleich Null fest. Dadurch wird auch verhindert, dass ETag zum Header hinzugefügt wird. Wenn beim Drucken Fehlermeldungen zu breiten Zeichen angezeigt werden, bedeutet dies, dass Sie vergessen haben, reines HTML für Nicht-ASCII-Zeichen auszugeben. Siehe HTML::Entities. Als Ausweichlösung könnten Sie auch Akzente und Ähnliches entfernen, indem Sie Text::Unidecode verwenden, was gut funktioniert, aber nicht wirklich das ist, was Sie wollen.
Erstellen Sie ein FCGI::Buffer-Objekt. Führen Sie einen dieser Schritte für jeden FCGI::Accept aus.
Legen Sie verschiedene Optionen fest und überschreiben Sie Standardwerte.
# Put this toward the top of your program before you do anything
# By default, generate_tag, generate_304 and compress_content are ON,
# optimise_content and lint_content are OFF. Set optimise_content to 2 to
# do aggressive JavaScript optimisations which may fail.
use FCGI::Buffer;
my $buffer = FCGI::Buffer->new()->init({
generate_etag => 1, # make good use of client's cache
generate_last_modified => 1, # more use of client's cache
compress_content => 1, # if gzip the output
optimise_content => 0, # optimise your program's HTML, CSS and JavaScript
cache => CHI->new(driver => 'File'), # cache requests
cache_key => 'string', # key for the cache
cache_age => '10 minutes', # how long to store responses in the cache
logger => $self->{logger},
lint_content => 0, # Pass through HTML::Lint
generate_304 => 1, # When appropriate, generate 304: Not modified
save_to => { directory => '/var/www/htdocs/save_to', ttl => 600, create_table => 1 },
info => CGI::Info->new(),
lingua => CGI::Lingua->new(),
});
Wenn kein Cache-Schlüssel angegeben wird, wird einer generiert, der möglicherweise nicht eindeutig ist. Der Cache-Schlüssel sollte ein eindeutiger Wert sein, der von den vom Browser festgelegten Werten abhängt.
Das Cache-Objekt ist ein Objekt, das get_object()-, set()-, remove()- undcreated_at()-Nachrichten versteht, beispielsweise ein CHI-Objekt. Es wird als serverseitiger Cache verwendet, um die Notwendigkeit zu reduzieren, Datenbankzugriffe erneut auszuführen.
Elemente bleiben standardmäßig 10 Minuten lang im serverseitigen Cache. Dies kann durch den HTTP-Header „cache_control“ in der Anfrage überschrieben werden, und der Standardwert kann durch das Argument „cache_age“ in „init()“ geändert werden.
Save_to ist eine Funktion, die die Ausgabe dynamischer Seiten in Ihrem htdocs-Baum speichert und zukünftige Links, die auf diese Seite verweisen, durch statische Links ersetzt, um CGI überhaupt nicht zu durchlaufen. Ttl ist auf die Anzahl der Sekunden eingestellt, die die statischen Seiten als aktiv gelten; der Standardwert ist 10 Minuten. Wenn der Wert auf 0 gesetzt ist, ist die Seite für immer aktiv. Um save_to zu aktivieren, müssen auch die Argumente info und lingua angegeben werden. Es funktioniert am besten, wenn auch Cache angegeben wird. Nur verwenden, wenn die Ausgabe mit einem bestimmten Satz von Argumenten garantiert gleich ist (dieselben Kriterien für die Aktivierung von „generate_304“). Sie können es von Fall zu Fall deaktivieren:
my $params = CGI::Info->new()->params();
if($params->{'send_private_email'}) {
$buffer->init('save_to' => undef);
}
Info ist ein optionales Argument, um Informationen über die FCGI-Umgebung bereitzustellen, z. B. ein CGI::Info-Objekt.
Logger ist ein Objekt, das debug() versteht, beispielsweise ein Log::Log4perl-Objekt.
Um einen last_modified-Header zu generieren, müssen Sie ein Cache-Objekt angeben.
Init ermöglicht die Übergabe einer Referenz der Optionen. Beides funktioniert also: use FCGI::Buffer; #... my $buffer = FCGI::Buffer->new(); $b->init(generate_etag => 1); $b->init({ generic_etag => 1, info => CGI::Info->new() });
Im Allgemeinen ist die Übergabe per Referenz besser, da weniger auf den Stapel kopiert wird.
Wenn Sie init() einen Cache zuweisen und später zwischencache => undef angeben, wird der serverseitige Cache nicht mehr verwendet. Dies ist nützlich, wenn Sie beim Erstellen Ihres HTML-Codes einen Fehler feststellen und entscheiden, dass Sie die Ausgabe nicht mehr im Cache speichern möchten.
Synonym für init, aus historischen Gründen beibehalten.
Gibt true zurück, wenn der Server die Ergebnisse lokal speichern darf. Dies ist der Wert von X-Cache im zurückgegebenen Header.
Gibt true zurück, wenn die Ausgabe zwischengespeichert ist. Wenn dies der Fall ist, bedeutet dies, dass alle teuren Routinen im FCGI-Skript umgangen werden können, da das Ergebnis bereits im Cache gespeichert ist.
# Put this toward the top of your program before you do anything
# Example key generation - use whatever you want as something
# unique for this call, so that subsequent calls with the same
# values match something in the cache
use CGI::Info;
use CGI::Lingua;
use FCGI::Buffer;
my $i = CGI::Info->new();
my $l = CGI::Lingua->new(supported => ['en']);
# To use server side caching you must give the cache argument, however
# the cache_key argument is optional - if you don't give one then one will
# be generated for you
my $buffer = FCGI::Buffer->new();
if($buffer->can_cache()) {
$buffer->init(
cache => CHI->new(driver => 'File'),
cache_key => $i->domain_name() . '/' . $i->script_name() . '/' . $i->as_string() . '/' . $l->language()
);
if($buffer->is_cached()) {
# Output will be retrieved from the cache and sent automatically
exit;
}
}
# Not in the cache, so now do our expensive computing to generate the
# results
print "Content-type: text/htmln";
# ...
Nigel Horne,
FCGI::Buffer sollte auch in Skripten sicher sein, die viele verschiedene Ausgaben erzeugen, z. B. E-Commerce-Situationen. Auf solchen Seiten empfehle ich jedoch dringend, generic_304 auf 0 zu setzen und den HTTP-Header „Cache-Control: no-cache“ zu senden.
Stellen Sie bei der Verwendung von Template sicher, dass Sie es nicht zur Ausgabe auf STDOUT verwenden, sondern stattdessen in eine Variable erfassen und diese ausdrucken müssen. Zum Beispiel:
my $output;
$template->process($input, $vars, $output) || ($output = $template->error());
print $output;
Kann fehlerhaftes JavaScript erzeugen, wenn Sie die