FCGI::Buffer - التحقق من إخراج FCGI وتخزينه مؤقتًا وتحسينه
الإصدار 0.19
يتحقق FCGI::Buffer من HTML الذي تنتجه عن طريق تمريره عبر HTML::Lint
.
يعمل FCGI::Buffer على تحسين برامج FCGI عن طريق تقليل المخرجات وتصفيتها وضغطها لتسريع عملية النقل والاستفادة من ذاكرات التخزين المؤقت للعميل والخادم بسلاسة تقريبًا.
للاستفادة من ذاكرة التخزين المؤقت للعميل، أي تقليل المكالمات غير الضرورية إلى خادمك التي تطلب نفس البيانات:
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,
);
# ...
}
للاستفادة أيضًا من ذاكرة التخزين المؤقت للخادم، أي لحفظ مخرجات التجديد عندما يطلب منك عملاء مختلفون نفس البيانات، ستحتاج إلى إنشاء ذاكرة تخزين مؤقت. لكن هذا بسيط:
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;
# ...
}
}
لمنع استخدام ذاكرات التخزين المؤقت من جانب الخادم مؤقتًا، على سبيل المثال، أثناء تصحيح الأخطاء قبل نشر تغيير التعليمات البرمجية، قم بتعيين متغير البيئة NO_CACHE على أي قيمة غير الصفر. سيؤدي هذا أيضًا إلى إيقاف إضافة ETag إلى الرأس. إذا حصلت على أخطاء حول الأحرف العريضة في الطباعة، فهذا يعني أنك نسيت إصدار HTML خالص على أحرف غير ASCII. راجع HTML::الكيانات. كعمل اختراق، يمكنك أيضًا إزالة العلامات وما شابه ذلك باستخدام Text::Unidecode، الذي يعمل بشكل جيد ولكنه ليس ما تريده حقًا.
قم بإنشاء كائن FCGI::Buffer. قم بإجراء واحد مما يلي لكل FCGI::Accept.
قم بتعيين الخيارات المختلفة وتجاوز القيم الافتراضية.
# 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(),
});
إذا لم يتم إعطاء مفتاح ذاكرة التخزين المؤقت، فسيتم إنشاء مفتاح قد لا يكون فريدًا. يجب أن يكون Cache_key قيمة فريدة تعتمد على القيم التي يحددها المتصفح.
سيكون كائن ذاكرة التخزين المؤقت كائنًا يفهم رسائل get_object() وset() وremove() وcreated_at()، مثل كائن CHI. يتم استخدامه كذاكرة تخزين مؤقت من جانب الخادم لتقليل الحاجة إلى إعادة تشغيل الوصول إلى قاعدة البيانات.
تبقى العناصر في ذاكرة التخزين المؤقت من جانب الخادم بشكل افتراضي لمدة 10 دقائق. يمكن تجاوز ذلك بواسطة رأس HTTP Cache_control في الطلب، ويمكن تغيير الإعداد الافتراضي بواسطة وسيطة Cache_age إلى init().
Save_to هي ميزة تقوم بتخزين مخرجات الصفحات الديناميكية في شجرة htdocs الخاصة بك واستبدال الروابط المستقبلية التي تشير إلى تلك الصفحة بروابط ثابتة لتجنب المرور عبر CGI على الإطلاق. يتم تعيين Ttl على عدد الثواني التي تعتبر الصفحات الثابتة نشطة فيها، والقيمة الافتراضية هي 10 دقائق. إذا تم التعيين على 0، فستظل الصفحة نشطة إلى الأبد. لتمكين save_to، يجب أيضًا توفير معلومات ووسائط lingua. يعمل بشكل أفضل عندما يتم توفير ذاكرة التخزين المؤقت أيضًا. استخدم فقط حيث يتم ضمان أن يكون الإخراج هو نفسه مع مجموعة معينة من الوسائط (نفس المعايير لتمكين generator_304). يمكنك إيقاف تشغيله على أساس كل حالة على حدة وبالتالي:
my $params = CGI::Info->new()->params();
if($params->{'send_private_email'}) {
$buffer->init('save_to' => undef);
}
المعلومات هي وسيطة اختيارية لإعطاء معلومات حول بيئة FCGI، على سبيل المثال كائن CGI::Info.
سيكون المُسجل كائنًا يفهم debug() مثل كائن Log::Log4perl.
لإنشاء رأس last_modified، يجب عليك إعطاء كائن ذاكرة التخزين المؤقت.
يسمح Init بتمرير مرجع للخيارات. لذا فإن كلا الأمرين يعملان: استخدم FCGI::Buffer؛ #... my $buffer = FCGI::Buffer->new(); $b->init(generate_etag => 1); $b->init({ generator_etag => 1, info => CGI::Info->new() });
بشكل عام، يعد التمرير حسب المرجع أفضل لأنه ينسخ بشكل أقل إلى المكدس.
إذا قمت بإعطاء ذاكرة تخزين مؤقت إلى init() ثم قمت لاحقًا بإعطاء ذاكرة تخزين مؤقت => undef، فلن يتم استخدام ذاكرة التخزين المؤقت من جانب الخادم بعد الآن. يعد هذا مفيدًا عندما تجد حالة خطأ عند إنشاء HTML الخاص بك وتقرر أنك لم تعد ترغب في تخزين الإخراج في ذاكرة التخزين المؤقت.
مرادف لـ init، تم الاحتفاظ به لأسباب تاريخية.
يُرجع صحيحًا إذا سُمح للخادم بتخزين النتائج محليًا. هذه هي قيمة X-Cache في الرأس الذي تم إرجاعه.
يُرجع صحيحًا إذا تم تخزين الإخراج مؤقتًا. إذا كان الأمر كذلك، فهذا يعني أنه يمكن تجاوز جميع الإجراءات الباهظة الثمن في البرنامج النصي FCGI لأن لدينا بالفعل النتيجة مخزنة في ذاكرة التخزين المؤقت.
# 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";
# ...
نايجل هورن،
FCGI::Buffer ينبغي أن يكون آمنًا حتى في البرامج النصية التي تنتج الكثير من المخرجات المختلفة، على سبيل المثال، حالات التجارة الإلكترونية. ومع ذلك، في مثل هذه الصفحات، أحث بشدة على تعيين generator_304 على 0 وإرسال رأس HTTP "Cache-Control: no-cache".
عند استخدام القالب، تأكد من أنك لا تستخدمه للإخراج إلى STDOUT، وبدلاً من ذلك ستحتاج إلى التقاطه في متغير وطباعته. على سبيل المثال:
my $output;
$template->process($input, $vars, $output) || ($output = $template->error());
print $output;
يمكن أن ينتج جافا سكريبت عربات التي تجرها الدواب إذا كنت تستخدم تقنية