google アナリティクスのperlスクリプトはmod_perl上では注意が必要




google アナリティクスを携帯電話向けに対応させるためには、アナリティクスから取得してきたトラッキング用スクリプトをサーバに配置する必要があります。

スクリプトに使用できる言語は、php、perl、jsp、aspxから選択できますが、
perlを選択した場合に、mod_perlで稼動しているWEBサーバでga.plを動かす場合には注意が必要です。

ga.plは内部で、HTTPヘッダの出力にCGI.pmのheaderメソッドを使用します。
[perl]
my $query = new CGI;

# Writes the bytes of a 1×1 transparent gif into the response.
sub write_gif_data {
my ($cookie, $utm_url) = @_;

my @header_args = (
-type => ‘image/gif’,
-Cache_Control =>
‘private, no-cache, no-cache=Set-Cookie, proxy-revalidate’,
-Pragma => ‘no-cache’,
-cookie => $cookie,
-expires => ‘-1d’);

# If the debug parameter is on, add a header to the response that contains
# the url that was used to contact Google Analytics.
if (defined($query->param(‘utmdebug’))) {
push(@header_args, -X_GA_MOBILE_URL => $utm_url);
}

print $query->header(@header_args);
print pack("C35", @GIF_DATA);
}
[/perl]

CGI.pmのheaderメソッドは、mod_perlの有無で挙動を変えます。
[perl]
my(@header);

push(@header,"Expires: " . expires($expires,’http’))
if $expires;
push(@header,"Date: " . expires(0,’http’)) if $expires || $cookie || $nph;
push(@header,"Pragma: no-cache") if $self->cache();
push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
push(@header,map {ucfirst $_} @other);
push(@header,"Content-Type: $type") if $type ne ”;

my $header = join($CRLF,@header)."${CRLF}${CRLF}";
if (($MOD_PERL >= 1) && !$nph) {
$self->r->send_cgi_header($header);
return ”;
}
return $header;
[/perl]
上記のように、mod_perl上で動作している場合は、
mod_perl(send_cgi_header)内でhttpヘッダが出力され、ga.plには何も返しません。

ga.plは正常に動作する場合、サイズが35byteの1×1のgif画像を返しますが、
apacheを再起動後、数回リロードを繰り返すとga.plが画像を返さない状況になり、その状況が頻発するようになりました。

CGI.pmをデバッグしたところ、send_cgi_header内部で処理が落ちており、
この現象はga.plに関わらず、CGI.pmとmod_perlの挙動であって、それに関するいくつかのポストが見つかりました。

mod_perl上でCGI.pmを使うと、send_cgi_header()で落ちる
CGI.pmのheaderでsend_cgi_headerをさせない
mod_perl and CGI::header
mod_perl 2.0.2 へのマイグレーション

このような現象には、以下の方法で対応できます。

・ga.plはmod_perl上から呼ばない。(apacheの設定を変える。または、mod_perlの影響が出ない場所にga.plを移動する。)
・CGI.pmのヘッダ出力箇所send_cgi_headerをコメントアウトし、ga.pl内でヘッダ出力させるようにする。

立ち上げたapacheの子プロセスの数だけリロードするとsend_cgi_headerで落ちるので、ここら辺にヒントがありそうですが、上記の対応方法は綺麗ではなく、暫定レベルの対処だと認識して対応ください。


この記事が気に入ったら
いいね!してね

最新情報をお届けします!

この記事が気に入ったら
いいね!してね

最新情報をお届けします!