FCGI::Buffer - Verifikasi, Cache, dan Optimalkan Output FCGI
Versi 0.19
FCGI::Buffer memverifikasi HTML yang Anda hasilkan dengan meneruskannya melalui HTML::Lint
.
FCGI::Buffer mengoptimalkan program FCGI dengan mengurangi, memfilter, dan mengompresi keluaran untuk mempercepat transmisi dan dengan memanfaatkan cache klien dan server secara mulus.
Untuk memanfaatkan cache klien, artinya mengurangi panggilan yang tidak diperlukan ke server Anda yang meminta data yang sama:
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,
);
# ...
}
Untuk juga memanfaatkan cache server, artinya untuk menyimpan keluaran regenerasi ketika klien berbeda meminta data yang sama, Anda perlu membuat cache. Tapi itu sederhana:
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;
# ...
}
}
Untuk mencegah sementara penggunaan cache sisi server, misalnya saat melakukan debug sebelum memublikasikan perubahan kode, setel variabel lingkungan NO_CACHE ke nilai apa pun yang bukan nol. Ini juga akan menghentikan penambahan ETag ke header. Jika Anda mendapatkan kesalahan tentang karakter Lebar dalam cetakan, itu berarti Anda lupa menampilkan HTML murni pada karakter non-ASCII. Lihat HTML::Entitas. Sebagai upaya peretasan, Anda juga dapat menghapus aksen dan sejenisnya dengan menggunakan Text::Unidecode, yang berfungsi dengan baik tetapi sebenarnya bukan yang Anda inginkan.
Buat objek FCGI::Buffer. Lakukan salah satu dari ini untuk setiap FCGI::Terima.
Tetapkan berbagai opsi dan ganti nilai default.
# 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(),
});
Jika tidak ada cache_key yang diberikan, akan dihasilkan satu cache_key yang mungkin tidak unik. Cache_key harus berupa nilai unik yang bergantung pada nilai yang ditetapkan oleh browser.
Objek cache akan menjadi objek yang memahami pesan get_object(), set(), delete() dan create_at(), seperti objek CHI. Ini digunakan sebagai cache sisi server untuk mengurangi kebutuhan menjalankan kembali akses database.
Item tetap berada di cache sisi server secara default selama 10 menit. Ini dapat diganti dengan header HTTP cache_control dalam permintaan, dan defaultnya dapat diubah dengan argumen cache_age menjadi init().
Save_to adalah fitur yang menyimpan output halaman dinamis ke pohon htdocs Anda dan menggantikan link masa depan yang mengarah ke halaman tersebut dengan link statis untuk menghindari melalui CGI sama sekali. Ttl diatur ke jumlah detik halaman statis dianggap aktif, defaultnya adalah 10 menit. Jika disetel ke 0, halaman akan aktif selamanya. Untuk mengaktifkan save_to, argumen info dan lingua juga harus diberikan. Ini berfungsi paling baik ketika cache juga diberikan. Hanya gunakan jika output dijamin sama dengan serangkaian argumen tertentu (kriteria yang sama untuk mengaktifkan generate_304). Anda dapat mematikannya berdasarkan kasus per kasus sebagai berikut:
my $params = CGI::Info->new()->params();
if($params->{'send_private_email'}) {
$buffer->init('save_to' => undef);
}
Info adalah argumen opsional untuk memberikan informasi tentang lingkungan FCGI, misalnya objek CGI::Info.
Logger akan menjadi objek yang memahami debug() seperti objek Log::Log4perl.
Untuk menghasilkan header last_modified, Anda harus memberikan objek cache.
Init memungkinkan referensi opsi untuk diteruskan. Jadi keduanya berfungsi: gunakan FCGI::Buffer; #... $buffer saya = FCGI::Buffer->new(); $b->init(hasilkan_etag => 1); $b->init({ generate_etag => 1, info => CGI::Info->new() });
Secara umum, meneruskan referensi lebih baik karena lebih sedikit menyalin ke tumpukan.
Jika Anda memberikan cache ke init() kemudian memberikan cache => undef, cache sisi server tidak lagi digunakan. Ini berguna ketika Anda menemukan kondisi kesalahan saat membuat HTML dan memutuskan bahwa Anda tidak ingin lagi menyimpan hasilnya di cache.
Sinonim dari init, disimpan karena alasan sejarah.
Mengembalikan nilai benar jika server diizinkan untuk menyimpan hasil secara lokal. Ini adalah nilai X-Cache di header yang dikembalikan.
Mengembalikan nilai benar jika output di-cache. Jika ya berarti semua rutinitas mahal di script FCGI bisa dilewati karena hasilnya sudah kita simpan di cache.
# 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 harus aman bahkan dalam skrip yang menghasilkan banyak keluaran berbeda, misalnya situasi e-commerce. Namun, pada halaman seperti itu, saya sangat menyarankan untuk menyetel generate_304 ke 0 dan mengirimkan header HTTP "Kontrol Cache: tanpa cache".
Saat menggunakan Templat, pastikan Anda tidak menggunakannya untuk menghasilkan output ke STDOUT, sebagai gantinya Anda perlu menangkapnya ke dalam variabel dan mencetaknya. Misalnya:
my $output;
$template->process($input, $vars, $output) || ($output = $template->error());
print $output;
Dapat menghasilkan JavaScript yang bermasalah jika Anda menggunakan teknik