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 환경 변수를 0이 아닌 값으로 설정하세요. 그러면 ETag가 헤더에 추가되는 것도 중지됩니다. 인쇄 시 와이드 문자에 대한 오류가 발생하면 ASCII가 아닌 문자에 순수 HTML을 내보내는 것을 잊었다는 의미입니다. 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(),
});
캐시_키가 제공되지 않으면 고유하지 않은 키가 생성됩니다. 캐시 키는 브라우저에서 설정한 값에 따라 고유한 값이어야 합니다.
캐시 개체는 CHI 개체와 같이 get_object(), set(), Remove() 및 Created_at() 메시지를 이해하는 개체입니다. 데이터베이스 액세스를 다시 실행할 필요성을 줄이기 위해 서버측 캐시로 사용됩니다.
항목은 기본적으로 10분 동안 서버 측 캐시에 유지됩니다. 이는 요청의 캐시_control HTTP 헤더로 재정의될 수 있으며 기본값은 init()에 대한 캐시_age 인수로 변경될 수 있습니다.
Save_to는 동적 페이지의 출력을 htdocs 트리에 저장하고 CGI를 전혀 거치지 않도록 해당 페이지를 가리키는 향후 링크를 정적 링크로 바꾸는 기능입니다. Ttl은 정적 페이지가 활성화된 것으로 간주되는 시간(초)으로 설정되며 기본값은 10분입니다. 0으로 설정하면 페이지가 영원히 유지됩니다. save_to를 활성화하려면 info 및 lingua 인수도 제공되어야 합니다. 캐시도 제공할 때 가장 잘 작동합니다. 주어진 인수 세트(generate_304 활성화에 대한 동일한 기준)와 출력이 동일하다고 보장되는 경우에만 사용하십시오. 다음과 같이 경우에 따라 이 기능을 끌 수 있습니다.
my $params = CGI::Info->new()->params();
if($params->{'send_private_email'}) {
$buffer->init('save_to' => undef);
}
Info는 FCGI 환경에 대한 정보(예: CGI::Info 객체)를 제공하는 선택적 인수입니다.
Logger는 Log::Log4perl 객체와 같이 debug()를 이해하는 객체입니다.
last_modified 헤더를 생성하려면 캐시 개체를 제공해야 합니다.
Init을 사용하면 옵션 참조를 전달할 수 있습니다. 따라서 이 두 가지 모두 작동합니다. FCGI::Buffer를 사용하십시오. #... my $buffer = FCGI::Buffer->new(); $b->init(generate_etag => 1); $b->init({ generate_etag => 1, info => CGI::Info->new() });
일반적으로 참조로 전달하는 것이 스택에 복사하는 양이 적기 때문에 더 좋습니다.
init()에 캐시를 제공하고 나중에 캐시 => undef를 제공하면 서버 측 캐시가 더 이상 사용되지 않습니다. 이는 HTML을 생성할 때 오류 조건을 발견하고 더 이상 출력을 캐시에 저장하지 않기로 결정할 때 유용합니다.
init의 동의어는 역사적인 이유로 유지됩니다.
서버가 결과를 로컬에 저장하도록 허용된 경우 true를 반환합니다. 반환된 헤더의 X-Cache 값입니다.
출력이 캐시되면 true를 반환합니다. 그렇다면 결과가 이미 캐시에 저장되어 있으므로 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";
# ...
나이젤 혼(Nigel Horne),
FCGI::Buffer는 전자상거래 상황과 같이 다양한 출력을 생성하는 스크립트에서도 안전해야 합니다. 그러나 그러한 페이지에서는 generate_304를 0으로 설정하고 HTTP 헤더 "Cache-Control: no-cache"를 보낼 것을 강력히 촉구합니다.
템플릿을 사용할 때는 이를 STDOUT으로 출력하는 데 사용하지 말고 대신 변수로 캡처하여 인쇄해야 합니다. 예를 들어:
my $output;
$template->process($input, $vars, $output) || ($output = $template->error());
print $output;