旅行好きのおしりトラブル対策グッズ3選

OS:
RedHatLinux7.2
perl -v :
This is perl, v5.6.2 built for i686-linux
HttpErrLog:
display: Unable to connect to X server ().
Premature end of script headers: /XXX/XXX/XXX.cgi

GD::Graphを用いたperlスクリプトを実行すると、上記のようなエラーとなってしまいます。
コマンドでの実行では問題無く動作します。cgiのパーミッションも確認しました。ソースは以下の通りです。作業が進まなくて困っています。
どなたかお知恵をお貸しください。


perl.cgi:
---------------------------------------------------------
#!/usr/bin/perl --
use strict;

use GD::Graph::bars;

my @xLabels = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my @data2002 = qw( 17 19 26 38 56 64 67 53 40 29 21 13 );
my @data2003 = qw( 19 24 27 41 56 69 75 60 44 33 22 15 );
my @data = ( \@xLabels, \@data2002, \@data2003 );

my $graph = GD::Graph::bars->new( 800, 600 );

$graph->set( title => "Rainfall 2002/2003",
y_label => "Millimetres" );

my $image = $graph->plot( \@data ) or die( "Cannot create image" );
open( OUT, "| display -") or die( "Cannot display image: $!" );

binmode OUT;
print OUT $image->png();
close OUT;
---------------------------------------------------------

A 回答 (1件)

CGI としてプログラムを実行し、生成された画像をWebブラウザで表示したい


ということでしょうか。

[エラーについて]
1. Premature end of script headers: /XXX/XXX/XXX.cgi

これは、
レスポンスに適切なhttpヘッダがありませんよ
ということです。

そのため、

print "Content-Type: image/png;\n\n";

の1行を最初に出力する必要があります。


2. display: Unable to connect to X server ().

display というのは、X (GUI) へ画像を表示するコマンドです。

open( OUT, "| display -")

の箇所で、httpサーバ上でCGI としてプログラムを実行して、
X Serverへ画像データをわたせなかった、
ということです。
CGIプログラムで生成した画像を、Webブラウザで表示するためには、
X Server へデータを投げるのではなく、
http client であるWebブラウザへと画像データを返す必要があります。
そのためには、
CGI プログラムは、標準出力へと画像データを出力すればよいのです。


以上をふまえて、
次のように書き換ればよいです。


before:
--------------------------------------------------------------------------------
open( OUT, "| display -") or die( "Cannot display image: $!" );

binmode OUT;
print OUT $image->png();
close OUT;
--------------------------------------------------------------------------------


after:
--------------------------------------------------------------------------------
binmode STDOUT; # 標準出力(BINモード)
print "Content-Type: image/png;\n\n"; # httpヘッダ
print $image->png();
--------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

ありがとうございます。
示唆くださいました通りに記述を修正しましたところ、
正常に実行されました。
本当に助かりました。

お礼日時:2008/02/05 20:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング