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), <njh at bandsman.co.uk>
FCGI::Buffer는 전자상거래 상황과 같이 다양한 출력을 생성하는 스크립트에서도 안전해야 합니다. 그러나 그러한 페이지에서는 generate_304를 0으로 설정하고 HTTP 헤더 "Cache-Control: no-cache"를 보낼 것을 강력히 촉구합니다.
템플릿을 사용할 때는 이를 STDOUT으로 출력하는 데 사용하지 말고 대신 변수로 캡처하여 인쇄해야 합니다. 예를 들어:
my $output;
$template->process($input, $vars, $output) || ($output = $template->error());
print $output;
<!-- HIDING 기술을 사용하면 버그가 있는 JavaScript가 생성될 수 있습니다. 이는 FCGI::Buffer가 아닌 JavaScript::Packer의 버그입니다.
Mod_deflate는 출력을 압축할 때 이를 혼동할 수 있습니다. .pl 파일에 대해 수축이 꺼져 있는지 확인하십시오.
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|pl)$ no-gzip dont-vary
동일한 출력을 생성하는 입력에서 압축된 출력을 요청한 다음 압축되지 않은 출력을 요청하는 경우(또는 그 반대로) 상태는 304가 됩니다. 사양 문자에는 그것이 잘못되었다고 나와 있으므로 여기서는 언급하지만 실제로는 그렇게 해서는 안 됩니다. 이런 일이 일어나는 것을 보거나 그로 인해 어려움을 겪게 됩니다.
FCGI::Buffer는 FastCGI에 대해 테스트되지 않았습니다.
먼저 정리되도록 FCGI::Buffer를 마지막 use 문으로 추가하는 것이 좋습니다. 특히 이를 사용하는 경우 Log::Log4perl 다음에 로드해야 합니다. 그러면 FCGI::Buffer가 HTTP 헤더를 보낸 후에 생성되는 모든 메시지가 인쇄됩니다.
Save_to는 JavaScript의 링크를 이해하지 못합니다. 즉, 정적 페이지로 로드되는 자체 호출 CGI를 사용하는 경우 잘못된 위치를 가리킬 수 있습니다. 해결 방법은 JavaScript에서 자체 호출 CGI를 피하는 것입니다.
버그나 기능 요청은 bug-fcgi-buffer at rt.cpan.org
에 보고하거나 http://rt.cpan.org/NoAuth/ReportBug.html?Queue=FCGI-Buffer의 웹 인터페이스를 통해 보고하십시오. 나에게 알림이 전송되고, 내가 변경하면 버그 진행 상황이 자동으로 사용자에게 통보됩니다.
Lint 작업은 HTML::Lint의 제한으로 인해 HTML4에서만 작동합니다.
CGI::버퍼, HTML::패커, HTML::린트
perldoc 명령을 사용하여 이 모듈에 대한 문서를 찾을 수 있습니다.
perldoc FCGI::Buffer
다음 사이트에서도 정보를 찾아볼 수 있습니다.
RT: CPAN의 요청 추적기
http://rt.cpan.org/NoAuth/Bugs.html?Dist=FCGI-Buffer
CPAN 등급
http://cpanatings.perl.org/d/FCGI-버퍼
CPAN 검색
http://search.cpan.org/dist/FCGI-Buffer/
이에 대한 영감과 코드는 Mark Nottingham의 cgi_buffer(https://www.mnot.net/blog/2003/04/24/etags)입니다.
cgi_buffer의 라이센스는 다음과 같습니다:
"(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."
프로그램의 나머지 부분은 저작권 2015-2023 Nigel Horne이며 다음 라이센스에 따라 배포됩니다: GPL2