2012-01-02 8 views
4

ホストはLinuxです。私は同じディレクトリに複数のファイルがあります。 *.plファイルはすべてコメントだけが異なる先頭に次が含まれています。一部のperlファイルで一貫性がなく、不可解な動作があります

#!/usr/bin/perl -w 

BEGIN { chdir('/home/httpd/vhosts/mysite.com/httpdocs/newsbot'); unshift(@INC, "/home/httpd/vhosts/mysite.com/httpdocs/newsbot"); } 

use Form; 
use File; 
use Mysite; 

#Read in All Form Variables 
&ReadInForm; 

ファイルForm.pmReadInFormサブルーチンと他には何が含まれています。

sub ReadInForm { 
}  
1; 

奇妙なことは、上記の出力が完全に矛盾していることです。時にはそれが細かい実行されますが、スクリプトの末尾に「内部サーバーエラー」メッセージを表示し、error_logファイルに次のようになります:

引数には、「」は/ usr/lib64のでサブルーチン・エントリの数値ではありません/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pmライン171 \ nは、リファラ:http://www.mysite.com/newsbot/groupkeywords.pl

他の回では、それは次のコマンドを実行し、出力されませんブラウザ:

未定義のサブルーチン& ModPerl :: ROOT :: ModPerl ::レジストリ:: home_httpd_vhosts_mysite_2ecom_httpdocs_newsbot_groupkeywords_2epl :: ReadInForm /home/httpd/vhosts/mysite.com/httpdocs/newsbot/groupkeywords.plラインでそれが動作する11

他の回と呼ばれます正しくエラーなし。

奇妙なことは矛盾していることです。私はファイルから1つの出力を得て、数分後にリフレッシュして、もう1つを得ることができます。私はいくつかの "内部サーバーエラー"メッセージと500の応答ヘッダーも実際のコンテンツと一緒に持っています。 &ReadInForm;という行をコメントアウトすると、毎回問題が解決されるので、私はそれを絞り込んだが、何を入れても問題はない。Form.pm。私は空のサブルーチン(上記のように)を置くことさえできますが、それでも問題は解決しません。

これをデバッグする方法についてもわかりません。どのようにそれが矛盾している可能性はありますか? Perlコンパイラはキャッシュの裏側で何らかの仕組みをしていますか?

+0

プリフォークを使用していると仮定して、 "MaxClients 1"を設定して、単一のhttpd子プロセスしか持たないようにしてください。 Apacheを再起動して、やり直してください。そうすれば、すべてのリクエストが同じプロセスにぶつかり、デバッグが容易になります。 –

+0

Corey、残念ながら、それは共有ホスティングであり、私はrootアクセス権を持っていません。彼らは私のためにこれを行うことができるかどうかを見るために、今日後で彼らの話を聞くことができるかもしれませんが、今はオフラインです。 – Mike

+0

私は彼らが共有ホスティングでそれをしているとは思わない。 –

答えて

5

あなたのホストは明らかにApache mod_perlを使用しています。 mod_perlを明示的にコーディングする必要があります。ところで、あなたのコードはperl 4とcgi-lib.pl、1996 vintageの匂いがします。とにかくglobal variables are completely forbiddenyou can't modify @INC under mod_perlとにかく、mod_perlの下であなたのスクリプトは動作しません。 "use strict; use warnings;"をスクリプトに入れ、適切なCGIまたはmod_perlフォームの解析モジュールと関数を使用する方がよいでしょう。

しかし、コードのこのスタイルは動作するはずです。これにより

#!/usr/bin/perl 

# I don't know what this BEGIN block is for, but I suspect it may not work or causes subtle bugs... 
BEGIN { chdir('/home/httpd/vhosts/mysite.com/httpdocs/newsbot'); } 


use strict; 
use warnings; 
use Form; 
use File; 
use Mysite; 

#Read in All Form Variables 
Form::ReadInForm(); 

をフォームに。午後:

use strict; 
use warnings; 

package Form; 

sub ReadInForm { 
}  
1; 

編集:あなたのコードは古いですし、あなたはあなたの大幅な見直しを保存したい場合、あなたはスクリプトコードと変数宣言のすべてを含む「メイン」サブを作成し、簡単に呼び出すことができますそれこの方法:

旧スクリプト:

#!/usr/bin/perl 

# the following line will fail with "undeclared variable" under "use strict" 
$a="test"; 
print "$a\n"; 

新しいスクリプト:

#!/usr/bin/perl 

use strict; 
use warnings; 

# call the main loop enclosing everything else  
main(); 

sub main { 
    # first declare all variables 
    my $a; 

    # then add there all the code: 
    $a="test"; 
    print "$a\n"; 
} 

この方法でスクリプトを「近代化」することができます。

+1

Perlのタイプがわかりません。私はコードを自分で書いていませんでした。私の強みはPHPであり、私はPerlのことはほとんど知りません。幸いにも、あなたのアドバイスは、私が受け取っていたエラーを修正したようです。残念ながら、コードは古くなっているか、あまり書かれていません。警告を使用する行は、ログファイルに3000文字以上のエラーと警告があります。おそらく、私がもっと慣れ親しんでいる別の言語での完全な書き直しが順調であるかもしれないと思っています。 – Mike

+3

これは矛盾の問題に直接対処するものではありませんが、私が受け取っていたエラーを取り除いたので、まだあなたの答えを受け入れるつもりです。 – Mike

+0

"use strict"を使うと、明示的にすべての変数を宣言する必要があります。コードベースに応じて、単純であるかどうかはわかりません。主なリスクは、スクリプトが大量のグローバル変数を使用する可能性があることです。その場合は、メインループと変数をホストし、それらをグローバルでないようにする「メイン」関数を追加できます。私はポイントを説明するために私の答えを編集しています... – wazoox

0

この後、2017年に私の最近の同様の経験に基づいてこのスレッドに追加することが1つあります。 mod_perlで動かすと、古い1990年代の古いperlコードは、(http://www.fifi.org/cgi-bin/man2html/usr/share/man/man3/mod_perl_traps.3pm.gz)で明快に説明されているように、奇妙なエラーを経験するはずです。また、mod_perlはスレッド再利用のためにperlサーバコードを35倍高速化するために作成されていることは他の文書からも明らかですが、この作業をきれいにするためには古いperl CGIのやり方を避けなければなりません。

これは理論的には大変です!しかし、必ずしもそうではありません...

私の1つの注意点は、そこの愛好家のperl_mod guruコミュニティにこれです。レガシperlを実行する方法を決めるときは、mod_perlの使用を自動的に提案しないでください。そして、予期せぬレガシーperlコードの移植担当者に予期せぬコード変更を強制します。

代わりに、レガシーコードを(最大限の効率で再利用可能なスレッド環境で)実行する必要があるかどうか、または昔ながらのシングルスレッドCGIが問題ないかどうかを最初に判断します。

私の場合と同じです。私は1998年にCGI Perlオンライン注文システムを作った。最初のものの1つ。今すぐ(2017年に)私は書いた古いコード(レジュームアイテムのようなもの)を実証するために単にデプロイしたかったのです。それはデモとして以外は実行されません。

mod_perlはOVERKILLですが、私の新しいホスティングサイトのSysAdminsはmod_perlをインストールしなければならないと主張していましたが、それはアドバイスされた共通の習慣でしたが、mod_perlが何をするのか、古いCGI perlシステム。しかし、私はその時にどちらもしなかった。だから、私は彼らが尋ねたときにやったのですが、後でmod_perlの落とし穴を知りました。私はそれらを1つずつ落としました。

私は単純にmod_perlをロードしていないと、サーバのデフォルト設定が古いCGIだったので、これらのエラーは起こりませんでした。

注意書きEmptor。

関連する問題