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, <njh at bandsman.co.uk>
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 <!-- HIDING. Ini adalah bug di JavaScript::Packer, bukan FCGI::Buffer.
Mod_deflate dapat mengacaukan hal ini saat mengompresi keluaran. Pastikan deflasi dinonaktifkan untuk file .pl:
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|pl)$ no-gzip dont-vary
Jika Anda meminta output terkompresi kemudian output tidak terkompresi (atau sebaliknya) pada input yang menghasilkan output yang sama, statusnya akan menjadi 304. Huruf dari spesifikasi mengatakan itu salah, jadi saya mencatatnya di sini, tetapi dalam praktiknya Anda tidak boleh melihat ini terjadi atau mengalami kesulitan karenanya.
FCGI::Buffer belum diuji terhadap FastCGI.
Saya menyarankan menambahkan FCGI::Buffer sebagai pernyataan penggunaan terakhir sehingga dibersihkan terlebih dahulu. Secara khusus, ini harus dimuat setelah Log::Log4perl, jika Anda menggunakannya, sehingga pesan apa pun yang dihasilkannya dicetak setelah header HTTP dikirim oleh FCGI::Buffer;
Save_to tidak memahami tautan dalam JavaScript, yang berarti jika Anda menggunakan CGI panggilan mandiri yang dimuat sebagai laman statis, tautan tersebut mungkin mengarah ke tempat yang salah. Solusinya adalah menghindari panggilan mandiri CGI dalam JavaScript
Silakan laporkan bug atau permintaan fitur apa pun ke bug-fcgi-buffer at rt.cpan.org
, atau melalui antarmuka web di http://rt.cpan.org/NoAuth/ReportBug.html?Queue=FCGI-Buffer. Saya akan diberi tahu, lalu Anda akan otomatis diberi tahu tentang perkembangan bug Anda saat saya melakukan perubahan.
Operasi lint hanya berfungsi di HTML4, karena ada pembatasan di HTML::Lint.
CGI::Buffer, HTML::Packer, HTML::Lint
Anda dapat menemukan dokumentasi untuk modul ini dengan perintah perldoc.
perldoc FCGI::Buffer
Anda juga dapat mencari informasinya di:
RT: pelacak permintaan CPAN
http://rt.cpan.org/NoAuth/Bugs.html?Dist=FCGI-Buffer
Peringkat CPAN
http://cpanratings.perl.org/d/FCGI-Buffer
Cari CPAN
http://search.cpan.org/dist/FCGI-Buffer/
Inspirasi dan kode untuk beberapa di antaranya adalah cgi_buffer oleh Mark Nottingham: https://www.mnot.net/blog/2003/04/24/etags.
Lisensi untuk cgi_buffer adalah:
"(c) 2000 Copyright Mark Nottingham <[email protected]>
This software may be freely distributed, modified and used,
provided that this copyright notice remain intact.
This software is provided 'as is' without warranty of any kind."
Program selebihnya adalah Hak Cipta 2015-2023 Nigel Horne, dan dirilis di bawah lisensi berikut: GPL2