Perl/Perlで問い合わせフォームを作る

レンタルサーバ上でのCGIエラー解消方法(2ページ目)

自分の開発サーバではうまく動いていたCGIをレンタルサーバにアップロードしたらエラーになってしまう事はよくあります。このような場合にどのように問題を解決していくかをご紹介します。

井上 みやび子

執筆者:井上 みやび子

Perlガイド

CGIが動いている場合のエラーか所の特定

「I'm fine.」という表示が出る場合は、CGI実行はされていてプログラムのどこかに問題があります。開発環境ではうまく行くのにサーバではうまく行かない場合の原因として考えられるのは以下のような事項です。
  • Perl のバージョンが違って期待通りに実行されていない
  • ファイルの読み書きを行う場合に、対象ファイルのパスをサーバ用に書き換えていない、またはパーミッションが無い (エラー処理が適当にされていない)。
  • メールの送信など、ネットワークに関わる部分で失敗している (エラー処理が適当にされていない)。
いずれの場合でもどこに問題があるかを非常に原始的な方法で調べます。

エラーログが見られる場合

エラーログが見られる場合は、プログラムの切れ目 (50~100行ごと程度) に以下の行を挿入していきます。
warn __LINE__;
この状態でCGIを実行すると、実行された部分まではエラーログに行番号が表示されます。このため、行番号が途切れた部分でエラーが起こった事が分かります。エラーの範囲が分かったら、さらに細かく同じ行を追加して問題となっている個所を特定します。

エラーログが見られない場合

エラーログが見られない環境の場合は、やむをえませんのでブラウザの画面に行番号を一時的に書き出します。以下のコードで行番号と「<br>」タグを書きします。
print __LINE__;
print "<br>\n";
但しこの場合、HTTPヘッダを出力する前にこの記載するとそれが元で500番のエラーになりますので、HTTPヘッダの出力の後だけに記載します。それで全く出力がされない場合は、HTTPヘッダ出力の前にエラー原因がある事になりますので、下記のヘッダをプログラム冒頭に追加した上で行番号の出力を試します。
binmode STDOUT;
print "Content-type: text/plain\r\n";
print "\r\n";
エラーの範囲が分かったら、さらに細かく同じコードを追加して問題となっている個所を特定します。

詳細情報の出力を行う Data::Dumper

プログラムの問題個所が特定できたらその周辺のプログラムコードを眺めて問題が無いかを確認しますが、ぱっと見てもどこが問題か分からない場合、役に立つのは、使っている変数にどのような値が格納されているかの出力です。

変数の中味は、以下のようなコードで表示できます。上がエラーログへの出力、下がブラウザ画面への出力です。
warn "valname=$valname";
print "valname=$valname <br>\n";
表示したい変数が配列ハッシュだった場合は、標準モジュール Data::Dumper が便利です。このモジュールは、配列やハッシュの内容を分かりやすく視覚化して表示してくれます。使い方は以下の通りです。

エラーログに出力する場合
use Data::Dumper;
warn "valname=".Dumper(\%valname);
ブラウザ画面に出力する場合
use Data::Dumper;
print "<pre>valname=".Dumper(\%valname)."\n</pre>";
変数名の前に「\」を付けるのがポイントです。

出力は、例えば以下のようになります。
my %hash;
$hash{mykey1} = 'value';
$hash{mykey2} = [1,2,3];

use Data::Dumper;
warn Dumper(\%hash);
出力されたところ
$VAR1 = {
	'mykey2' => [
		1,
		2,
		3
	],
	'mykey1' => 'value'
};
Data::Dumper の出力中にある「$VAR1」は Data::Dumper モジュールが自動的に付ける変数名です。無視して構いません。また、ハッシュの場合表示される順番は順不同になります。

変数の中味を出力してみたら期待していない値が入っていたり、代入されているはずの値が見当たらない場合はそこがエラーの原因になっている可能性があります。もし期待と違う変数があったら、プログラムをさかのぼって変数の出力を再度行い、どこで代入がうまく行っていないのかを確認します。

一つ一つチェックするのが早道

本番サーバに移動したらうまく行かない場合は、原因は比較的単純である事が多いです。例えば、ファイルから読み取るべき値が読み取れていない、想定していた必須のユーザ入力がされていない、メールアドレスが違うせいでメール送信に失敗している、などです。分かってしまえば訂正は何でもないのですが、プログラムが完成して大きくなっていると原因ヶ所の特定に時間がかかります。公開しようと思ってアップロードしたのにエラーが出ると気持ちが焦りますが、このような場合でも、地道にプログラム内の処理を追いかけて原因を探すのが近道です。また開発時から、エラーが起きやすいところにはエラーメッセージが出力されるように仕掛けておくことも大事です。
【編集部おすすめの購入サイト】
楽天市場で Perl 関連の書籍を見るAmazon で Perl 関連の書籍を見る
  • 前のページへ
  • 1
  • 2
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます