- ベストアンサー
DreamHostでCGIを使う場合の設定について
- DreamHostのVPSでCGIを利用する方法について教えてください。
- 最近、DreamHostのVPSにあげているCGIのページで表示がおかしくなっています。ソースは簡単な10行ほどのPerlスクリプトです。
- 他のホスティング会社のカゴヤでは問題なくランダムな数を表示できることが確認されましたが、DreamHostでは同じ数が繰り返される問題が発生しています。サポートではキャッシュの問題と言っていますが、本当の原因はわかりません。誰か教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
キャッシュの問題かどうか確認する手段がありました。 http://(サーバ名)/cgi-bin/rand_test.cgi とかでアクセスしてると思うんですが、これを http://(サーバ名)/cgi-bin/rand_test.cgi?x=1 http://(サーバ名)/cgi-bin/rand_test.cgi?x=2 http://(サーバ名)/cgi-bin/rand_test.cgi?x=3 といったように、ダミーのパラメータ(毎回違うもの)をつけてアクセスすると、どうなるでしょうか。 もしどこかにあるキャッシュサーバ、あるいはWebサーバのキャッシュ設定が、「URLが一致した場合、Webサーバにアクセスせずキャッシュを返す」というようになっていると、初回アクセスでは確かに乱数になるが、何度リロードしても同じ数値になってしまうと思います。 本当にそうなれば、CGIプログラムではなく、キャッシュサーバやWebサーバの設定の問題、ということになります。
その他の回答 (2)
- asciiz
- ベストアンサー率70% (6809/9681)
srand() の説明は例えば以下の通りです。 >perldoc.jp: srand >https://perldoc.jp/func/srand 乱数発生の「系列」をリセットする命令なので、リセットした直後は同じ値が出たりしますが、その後いくつかrand()を取り出せば、2個目以降の数値は違ってくるかもしれません。 例えば次のようにして5回ずつ発生させてみると、どうなるでしょう? #!/usr/bin/perl srand(time); print "Content-type: text/html\n\n"; print "<html>\n"; print "<head><title>TEST</title></head>\n"; print "<body><center>\n"; foreach $i (1..5) { $rand = int(rand(1000)); printf "<h1>%03d</h1>", $rand; } print "<a href=\"rand_test.cgi\">TEST</a><br>\n"; print "</center></body></html>\n"; exit; なお、time() という関数は現在の日時を秒数で返すものなので、1秒毎にしか変化しません。 なので、あまり早くクリックすると、同じ値で srand() することになり、乱数発生系列も同じとなります。
- asciiz
- ベストアンサー率70% (6809/9681)
プログラムを走らせるたびに同じ乱数列が生成されるという現象は、処理系によってはあり得ます。 最初に一度だけ srand(time); と入れてみましょう。 なおこれで乱数シードを設定した場合でも、初めのうちは似た傾向になったりするので(なので二度以上srandを使うのはマズい)、数個使い捨ててから乱数値を使うようにするとより良いです。
お礼
srand(time); がよくわからなくて 色々調べたのですが、よくわからなかったので とりあえず、ご指示通り #!/usr/bin/perl srand(time); $rand = int(rand(1000)); と言う風に「Perl」と「rand」の間に入れて試しました。 が、結果は「srand(time);」挿入前と変わらず 「TEST」を押しても数字は変わりませんでした。 回答いただき、ありがとうございました m(_ _)m
お礼
ご指示の通り、「?x=1」の要領で URLに続けて「?=$time」と付け加えて、クリックごとに 現在時刻を付加すると数字がランダムに変わるようになりました。 なので、教えていただいた「キャッシュサーバ」「Webサーバ」が 原因のように思います。聞いたこと無かったのでとても参考になりました。 今からこの辺りを調べようと思います。 お忙しい中、私の様な素人の質問に回答いただき、とても感謝しています。 この度は、どうもありがとうございました m(_ _)m