CGI: Common Gateway Interface part 11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/14 22:26ID:F9qlqHNx※CGIは特定の言語に依存するものではありません。
Perlのコーディングに関する質問は、専用スレでお願いします:
[Perl 初心者コーナー Part24]
http://pc2.2ch.net/test/read.cgi/php/1054992610/
CGIとPerlの区別がわからない、という人はとりあえずこちらへ:
[WebProg 初心者の質問 Part3]
http://pc2.2ch.net/test/read.cgi/php/1045091733/
過去ログ・関連スレッドは >>2-5 あたりに
0595nobodyさん
04/01/24 16:42ID:???use CGI; 行の先頭を # でコメントにすることぐらいかな
0596nobodyさん
04/01/25 12:38ID:???CGI.pmは使うなと?
フォームデータのデコード、Cookieの生成、ヘッダの出力にしか
使ってないので自前で作っちゃった方がいいかなぁ。
0598nobodyさん
04/01/25 21:00ID:???HTML::Template や LWP, DBI みたいにもっと重いモジュールをがんがん使う俺様から見ると、
もはや誤差のうち
0599nobodyさん
04/01/25 22:33ID:???CGI
HTML::Template
DBI
を同時に使うことはよくある。
0600nobodyさん
04/01/25 22:54ID:???0601nobodyさん
04/01/25 23:47ID:???俺の自宅鯖 (Pen4/3G) だと、たいていの CGI は 5〜10msec で実行が終わるが
use CGI と書くだけで 50msec に跳ね上がる。
しかし use HTML::Template は 60msec 食うし
use DBI に至っては 80msec 以上かかる (しかもこれにはDBDのコンパイル時間は入っていない)。
mod_perl でこの辺のモジュールを全部キャッシュしておけば
何も問題なくなるのだが。
0603594
04/01/26 00:27ID:???CGI.pm部分だけ自作しても焼け石に水ってことですか。
0604nobodyさん
04/01/26 01:01ID:???0605nobodyさん
04/01/26 09:45ID:???楽がしたいから使うんだけどな。
Perl使いが一番重要視する効率はコーディングの効率だと思うんだけどどうよ。
感覚的なものだけどさ。
0606nobodyさん
04/01/26 10:01ID:???0607nobodyさん
04/01/26 13:17ID:???以下のようにしました。
ただ追加書き込みしているだけですがflockはした方がよいでしょうか?
また、その場合どのようにすればよいでしょうか?
open(FH,">>index.log");
print FH $date_time . "\t" . $host . "\t" . $user_agent . "\t" . $http_referer . "\r\n";
close(FH);
0608nobodyさん
04/01/26 13:52ID:???禿しくスレ違い
Perl コーディング初心者質問コーナー Part31
http://pc2.2ch.net/test/read.cgi/php/1072896288/l50
逝ってよし
0609607
04/01/26 13:57ID:???0612nobodyさん
04/01/26 22:16ID:???0613nobodyさん
04/01/26 22:42ID:???HTML::Template を見つけたよ
ループのネストとか「おお俺って賢いじゃん」と思ってたんだがなあ…
0615613
04/01/27 02:13ID:???Template クラスと Tag クラスがあって、
Template オブジェクトに Tag オブジェクトを「貼り付け」る。
Template オブジェクトは HTML::Parser 使ってテンプレートファイルをパースしてって、
それらしいタグにぶつかると、対応する Tag オブジェクトの print メソッドを呼び出して、
戻り値をタグの代わりに挿入する。
Tag クラスは Tag::Base クラスを基底として継承したものをいくつか作ったんだが、
ループするタグだとか、if/unless タグだとか。ネストするときは Tag に Tag を貼り付ける。
将来他に新しいタグを思いついたときにも、同様に Tag::Base を継承したクラスさえ作れば、
Template クラスには一切手を加えずに機能拡張できる、つー。
しかし完成直後に HTML::Template を見つけ、
ほとんど全ての機能が既に実現されていたと知り、
新しいタグを作る気も失せてしまった…
0616nobodyさん
04/01/27 02:18ID:???ちりもつもればなんとやらで、
HTML::Templateの作法を頭にいれちゃえば、使い回しきくので便利。
(まぁ、自作のモジュールをすでにそーいうのを作っているならいいけど)
でも、複数人がコーディングしたり引き継ぎとかの場合、
ドキュメントがちゃんとあるから、HTML::Template のほうがいいかなと。
⇒http://member.nifty.ne.jp/hippo2000/perltips/html/template.htm
あと、HTML::Templateってそのまんま置けばつかえる(SSH接続不要)というのも好き。
0617nobodyさん
04/01/27 11:03ID:???俺も最初自作のモジュールを使ってたんだけど、やっぱ事実上Perlの
標準であるHTML::Templateの方が引継ぎの時等に便利なんだよね。
ちなみに俺の場合、<TMPL_VAR NAME="hoge">というのがどうしても
嫌だったから、勝手に%hoge%という書式に変更して、newするときに
filterオプションで置換して使ってます。
TMPL_LOOPやTMPL_IFは<!--#tmpl_loop name="hoge" -->みたいに
SSI風書式にしてます。
0618す
04/01/28 14:22ID:i/cjCs6gCGI 起動するときに環境変数 DOCUMENT_ROOT がなかったらダメですか?
apache 自体にはまったく問題ないんですけど、CGI 開発者としてのご意見きぼん。
0619nobodyさん
04/01/28 14:36ID:???ttp://www.palcom.ne.jp/hosting/support/server_independent.html
みたいな書き方をしているサイトが結構あるらしい
0622nobodyさん
04/01/28 14:45ID:???DOCUMENT_ROOT はApacheが独自につけてくれる環境変数みたいなので
なくても、公式のCGIとしてはOKなのでは。
ただし、Apacheにどっぷり遣ったようなCGIプログラムは必要としてるかも。
参考
http://hoohoo.ncsa.uiuc.edu/cgi/env.html
http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html
0623622
04/01/28 14:55ID:???0624nobodyさん
04/01/29 15:43ID:pGuQUw/Wブラウザの戻るボタンで戻る場合、先ほどの書き込み内容が
フォームの中に残っている時と残ってない時があるのですが、
これを確実に残して置く方法ってあるのでしょうか?
0625nobodyさん
04/01/29 16:03ID:???俺もそういう方法があれば是非知りたいと個人的には思っているのだが
たぶんブラウザの側の実装や設定の問題なので
CGIからは手出しできないんじゃないかと見ている
0628nobodyさん
04/01/29 18:01ID:???0629nobodyさん
04/01/29 19:26ID:???どうもIEだとvalueの値が優先されて表示される模様。
経験則なので嘘かもしれないw
0630nobodyさん
04/01/29 20:44ID:???わかりません。
パールを変えただけでは駄目ですよね?
0631nobodyさん
04/01/29 23:34ID:???新語キター
0632nobodyさん
04/01/29 23:55ID:???0633nobodyさん
04/01/30 00:04ID:HPifPmukUP板です。
ファイルとかの。
0634nobodyさん
04/01/30 02:51ID:???配 布 元 で 聞 け
0635nobodyさん
04/01/30 04:10ID:???0636nobodyさん
04/01/30 04:22ID:???0637 ◆LLLLLLLLL.
04/01/30 10:45ID:r6WYD04Xhoge.shtmlのなかに上下に2つfoo.cgiをexec cgiで呼び出す記述をし、
foo.cgiの方で、UserAgentを見て携帯電話の時とPCの時に処理を分け、
それぞれ表示させてるんですが、
携帯ユーザーの時は、上下2つあるうちの下の方は、
何も表示させないようにしたいんです。
cgiからの戻り値をssiに渡すことができるなら、
cgiから、表示させる文字列に加えて、携帯の時はフラグとして1を返し、
フラグが立ってたら下のexec cgiは実行しないような書き方をすると
出来るのではないかと思うのですが、、
何処を探してもそういうことが出来ると書かれたところを見つけられませんでした。
ssiスレを探しましたが無いようで、こちらに書かせていただきました。
何かいい方法無いでしょうか?
#ssi側でUAを判定することで下のexecをさせなくすることはできるのですが、
#cgi内でも表示させる文字列を分けるためUA判定する必要があるので、2度でまなんです
つまりssiとcgiで、変数を共有、若しくは戻り値、引数として値を渡せないかということです。
0638637
04/01/30 10:47ID:???間違ってperlスレに書き込みしてしまいましたんで↑はコピペです。
よろしくお願いします。
0642637
04/01/30 14:22ID:???それがexec cgiは引数渡せないみたいなんです(とほほさん調べ)
>>640
最悪それでいこうかと考えてたんですけど・・
大きいスクリプトなんで、主な処理を別ファイルにして、
ssiから呼ばれる上用CGIと下用CGI、
それぞれからメインのCGIをrequireしようかと・・
どうやらどうしても変数などを渡すことは出来ないようなんで、
負荷など若干気になりますがそれでいこうかと思います。
有難うございました。
0643nobodyさん
04/01/30 14:34ID:???exec cmd なら渡せる(ARGV渡し)
0644nobodyさん
04/01/30 14:37ID:???0645nobodyさん
04/01/30 14:41ID:???うちのApache2.0.39だとexec cgiで引数渡せたんだがな・・・
バージョンによって違うのかな?
んで、
SSIで<!--#set var="TYPE" value="TOP">とかやると
$ENV{'TYPE'}でとってこれるみたい
0646ありが�dです
04/01/30 14:49ID:???ごめんなさい。exec cmd使えない鯖なもんでexec cgiなんです。
>>645
なんか環境によって使えたり使えなかったりらしいです。
うちのローカルでは使えなかったんですけど、
鯖で一回試してみます。
>>644
includeって読み込んで実行してくれるんですか。
ちょっとこっちも試してみます
0647訂正
04/01/30 14:50ID:???調べてきます
0648nobodyさん
04/01/30 14:54ID:???SSIで判定して呼ばないとかは、CGIの範疇を超えてると思うですが。
0649nobodyさん
04/01/30 14:56ID:???俺もすっかり見落としてたが、
ttp://tohoho.wakusei.ne.jp/wwwssi.htm#If
ここらへん使えばいけそう?
0651nobodyさん
04/01/30 15:40ID:???やはり、exec.cgiで引数は渡せなかったんですが、
(ローカル5.8.0、鯖5.6かな?)
騙されたと思って下のほうの
>SSIで<!--#set var="TYPE" value="TOP">とかやると
>$ENV{'TYPE'}でとってこれるみたい
これをやってみると、ちゃんと変数渡せてました。
これは私が、「引数」などで検索してたため、見つからなかっただけで、
実は当たり前のことなのかもしれませんね。
有難うございました。これで期待通りのことが出来そうです。
0652nobodyさん
04/01/30 15:44ID:???apacheは1.3.29だと思います。
0653nobodyさん
04/01/30 16:13ID:???HTTP_USER_AGENTじゃあかんの?>判断材料
まぁ とりあえずSSIでCGIから返り値をとってくるのはムリポ
CGI中でENV書き換えてみたけど普通の方法じゃやっぱり保存できないみたいだし
>>651
思惑どおりにいきそうらしいので何よりです。 カンパレ
0655nobodyさん
04/01/30 18:42ID:???君の質問が意味不明だから相手にされないんだよ
CGI設置について質問
http://pc2.2ch.net/test/read.cgi/php/1054216089/
過去ログを読んでテンプレに従って質問してみ
0656nobodyさん
04/01/30 20:30ID:???こんなにcgi使ってサーバーに怒られないんですか??
0658nobodyさん
04/01/31 00:27ID:???自分の掲示板に組み込もうと思って。
0661nobodyさん
04/01/31 06:20ID:???0662658
04/01/31 10:32ID:???普通に気づかなかった。
投稿者の記事削除機能で使ってたのに。
テンキュー。
0665nobodyさん
04/02/03 00:14ID:???どうも安いレンタルサーバーで動かすと激烈に重い。
今、上位100スレの全ログから抽出するのに成功したけど、全部で700以上のスレがあるんだよね。
どうにか軽くする方法ないですかねー。
0666nobodyさん
04/02/03 00:27ID:???こうゆうこと言ったら元も子もないがCGIでやることではないような。
クライアント側でやるべきでは?
例えばそのようなIEツールバーを作るとか。
0667nobodyさん
04/02/03 01:49ID:???1.定時に巡回してログを収集する(cronか何かで)
2.ログを解析し、DBにぶちこむなり、IDでindexを張るなり(これもcronか何かで)
3.CGIは、DBないしindexを検索するだけ
0668nobodyさん
04/02/03 07:01ID:???0669nobodyさん
04/02/03 09:57ID:???0670nobodyさん
04/02/03 20:53ID:???利用する技術はopen文、CGIモジュール、param関数、ファイル読み込み、ファイル書き込み、です。
これがwrite.htmlのソースです。
↓
<html>
<body>
<body background=star-k2.gif>
<center>
<font size="7"color="#FF00FF">掲示板のプログラム</font><br>
</center>
<font size="4"color="#00FFFF">氏名</font><br>
<center>
<font size="5"color="#FFFF00">書き込みの内容を指定してください ;</font><br>
</center>
<center>
<form action="write. cgi">
<input type="text" name="contents">
<input type="submit">
</center>
</form>
</body>
</html>
0671つづき
04/02/03 20:55ID:???↓
#!/usr/bin/perl
print "Content-type:text/html\n\n";
use CGI qw(:standard);
$value = param("contents") ;
???????????????????
?ここに何を入力するかわかりません。?
???????????????????
print "<html><body>";
print "書き込みが終了しました";
print "</body></html>";
これがresd.cgiのソースです。
↓
#!/usr/bin/perl
print "Content-type: text/html\n\n";
??????????
ここに何を入れるか???
?????????????
print ???????
print ???????
print ??????
print ???????
以上です。わっけがわかりません。友達みんなこうゆうの弱いんで今みんなパソコン詳しい人に頼み込み中なんです…
誰か教えてください!
0673nobodyさん
04/02/03 21:58ID:???レスありがとうございます!
でも…馬鹿ですいませんが、自由にソースコードを書くことすら出来ない
のが現状です…大学の講義で、情報処理関係の講義を選択したのですが、
もうなにがなんだかさっぱりわからなくて…HTMLの基礎をかじったぐらい
の知識しかないので…
もしよろしければ、もう少し教えていただけませんか?
「勝手にしろ」とおっしゃられるかもしれませんが、ホントお願いします!
0675nobodyさん
04/02/03 22:39ID:???0676nobodyさん
04/02/04 04:15ID:???0677nobodyさん
04/02/04 13:07ID:???痛い香具師なのは十分わかってるんですが…
右も左もわからない状態でして…
やっぱり自分でとことん調べるべきですよね。。
なんとか頑張ります。
ありがとうございましたm(_ _)m
0678nobodyさん
04/02/08 23:32ID:???現在mod_perlを使ってるのですが、
時間のかかるスクリプトの場合、途中でブラウザ側が読み込み中止をしても
最後までスクリプトは実行されるものなんでしょうか?
15秒程度のスクリプトで実験したところ、中止した後も最後まで実行されているようでした。
更新作業をするスクリプトで、一旦更新するブロックに入ったら
何があっても最後まで実行させたいのですが、まれに途中で止まってしまっているようで
原因がよくわかりません。
タイムアウト以内に終わるのであれば、ブラウザで読み込みの中止をしても最後まで実行される
ものなんでしょうか?
それとも、fork,execなりsystemなりして別プロセスとして動かしたほうがいいんでしょうか?
0679678
04/02/08 23:34ID:2J+W47Q/どういうタイミングで、実行中のスクリプトが終了するのかが分からないんです。
0680nobodyさん
04/02/08 23:49ID:???symlinkやmkdirを使って自前でロックしてるみたいなんだけど
flockじゃやっぱりロックしきれないのかな?
0681nobodyさん
04/02/09 00:50ID:???fork して入出力 (STDIN/OUT/ERR) を閉じれ。
完了確認はメール送るなりなんなりすれ。
http://www.google.co.jp/search?q=CGI+%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88
>>680
Perl の場合は NFS 越しの flock は意味を成さないのと、
flock を実装していない OS に対応する為に、排他処理を
自作ルーチンでやる事がある。これらに当てはまらない
環境で使う事が分かっているなら flock が無難。
…という話は散々既出で嫌がられるので、以後はこの辺に。
http://pc2.2ch.net/test/read.cgi/php/1024795138/
0682nobodyさん
04/02/09 00:54ID:???flock は CGIとは直接の関係もないのではないかと(ry
0684nobodyさん
04/02/09 12:15ID:???mod_perl のことは難しいので、普通のCGIのケースに限って話をすると、
apache の場合のポイントは二つある。
一点目、apache が CGI を実行するときは、
クライアントとの TCP 接続について結構無頓着で、
CGI からデータが送られてくるまでは感知せず、
データを受け取って、つまりクライアントにデータを送信する段になって、
初めて TCP 接続をチェックして、
ここでようやく「切れてるじゃん」ということに気づく。
気づくと、CGI プロセスを kill しにかかる。
それじゃあ処理が完了するまでデータ送らなきゃ良いじゃん、
という話になるわけだが、まあやっぱりそういうわけにもかず、
二点目として、apache は、一定時間 CGI から出力がないと、
タイムアウトとみなし、CGI プロセスを kill しにかかる。
普通はこっちに引っかかるだろう。
上記は普通の CGI についての話であって、
mod_perl でコンテンツハンドラを書く場合はまた話が異なる。
Apache::Connection クラスには aborted という素敵なメソッドが用意されているぐらいで
いろいろ楽しいことができそうに思うのだが、
詳しいことは mod_perl スレに行って詳しい人に聞いてくれ。
0685nobodyさん
04/02/10 19:09ID:???エロ動画に直リンできるCGIを組んだんだけど
これを公開したら転送量がものすごいことになることに気づいた。
リクエストそのままで指定したURLに飛ばしたりはできない…よね。
やっぱり各自DLして使ってもらうしかない?
0686nobodyさん
04/02/10 19:58ID:???0687685
04/02/10 22:04ID:???0690685
04/02/11 14:53ID:???できないってことだよね。そうします。ありがとう。
>>689
できるならuser-agent, refererを偽装したまま
redirectする方法を教えてください。
0691nobodyさん
04/02/11 15:17ID:???CGI proxy なんてやる意味はあまりないぞ
重いだけ
0693685
04/02/12 09:35ID:???ふつーにローカルで動かすスクリプトにしました。
>>692
無理だと思ってたけど誰も答えてくれないし
689を見てできるのかなと思ってしまいました。
■ このスレッドは過去ログ倉庫に格納されています