トップページ⇒php
1001コメント300KB

CGIだけど、なんか質問ある? Part 9

■ このスレッドは過去ログ倉庫に格納されています
0001ななし ◆E6qQ.htN7o 03/01/03 02:56ID:H5ub4PWW
CGIの運用に関する質問スレッドです。

※CGIは特定の言語に依存するものではありません。

※Perlのコーディングに関する質問は専用スレがありますのでそちらでお願いします。
  ↓
【Perl】初心者コーナー Part18
http://pc.2ch.net/test/read.cgi/php/1037797479/l50

過去ログ・関連スレッドは >>2-5 あたりに
0191nobodyさん03/01/31 20:55ID:???
ケコーン
019217903/01/31 21:04ID:Ee0DVLll
鯖にはSOCKETモジュールがインストールされていて、シェルからSOKCET関数も使えるが、
cgi上ではError500 を吐くの場合 1.cgi上では実行権限が与えられていない
2.それともSOCKET関数とは別の問題 なのか知りたいんです。

# html書き出し部分はここです。
while (chomp($buf=<SOCKET>)) {
print "Content-type: text/html\n\n";
print "$buf\n";
exit;

この場合もシェルだと
Content-type: text/html
220 earth.hc.cc.**.ac.jp ESMTPとなります。
0193nobodyさん03/01/31 21:05ID:???
chomp($buf=<SOCKET>)
0194nobodyさん03/01/31 21:08ID:???
とりあえず無バッファリングにしてみる。
019518803/01/31 21:16ID:???
>>189-190
>>182は、通信"以前"って書いてあったからー
通信以後に発生したエラーだし、つっこんでもOKだと思って。。
019617903/01/31 21:28ID:Ee0DVLll
シェルから呼び出した時しかファイルに書き込まれません。log属性は666です。
(chomp($buf=<SOCKET>));
open(OUT,">> http.log");
print OUT "$buf\n";
close(OUT);
0197nobodyさん03/01/31 21:30ID:???
>>196
ディレクトリのパーミッションは?
019817903/01/31 21:32ID:Ee0DVLll
cgi-binディレクトリは755になってます。
0199nobodyさん03/01/31 21:36ID:???
ネタか。
020017903/01/31 21:42ID:Ee0DVLll
cgiスクリプトとlogが同一ディレクトリにある場合って、755でも動きませんか?
ちなみに777で試してみても結果は同じでした。
020119903/01/31 21:46ID:???
>>198について言ったわけじゃない
0202nobodyさん03/01/31 23:06ID:???
suExecだったしな。
020317903/02/01 01:24ID:???
他の所でソケット通信の話題OKという所があったので、移住します。有り難うございました。
0204nobodyさん03/02/01 17:41ID:Cax25w+6
BiglobeでHP作ってて、CGI使って日記作ろうと思ったんですが、
パスワード入れて管理モードに行こうとすると、
『CGI専用サーバなのでできるか』と言われます。
biglobeだとCGI専用サーバとかになっちゃうらしいんですけど、cgiのほうのどっか設定変えたらできるんですかね。

当方、初心者です。
0205nobodyさん03/02/01 17:42ID:???
>>204
わかってます。帰れ。
0206nobodyさん03/02/01 17:44ID:???
CGIは安全、mod_phpは危険ってどういうこと?
0207nobodyさん03/02/01 17:44ID:???
>>206
幻想です。CGIが安全ってまた訳がわからんけれど。
0208の03/02/01 17:45ID:/eR4kJXs
>>196
ファイル名の指定を絶対パスにしてみ
0209nobodyさん03/02/01 17:46ID:???
>>207
ちなみにhttp://pc2.2ch.net/test/read.cgi/php/1036915437/864なんですけど。
PHPだとsetUIDとかでしょうかねぇ?PHP知らないけど。
021020903/02/01 17:47ID:???
s/setUIDとか/setUIDできないとか/
0211nobodyさん03/02/01 17:48ID:???
>>209
一つのモジュールに負荷が集中するって事じゃないの?
021220903/02/01 17:50ID:???
>>211
といいますと??
スマソ まじでわからんです。
021321203/02/01 20:19ID:???
放置されとる・・・・
答える価値もないと判断されたか(鬱
0214の03/02/02 02:12ID:eQAjYeC3
CGI は別プロセスでロジックが動く。
モジュールは、httpd のプロセス内(同じメモリ空間)で動く。
したがって、動作上で OS のメモリ保護が期待できるか否かと言った違いは
ある。まあ、クラック耐性が多少高い程度だがな。
0215nobodyさん03/02/02 02:13ID:VwKQrujS
CGIで、ブラウザにコンテンツをキャッシュさせるには
プログラム側でどのようなヘッダを吐けばいいのですか?

ちなみにContent-Typeしか吐いてない場合、
IEはキャッシュしてくれないようです。

やりたいことは、コンテンツをキャッシュさせて、ブラウザから送られてくる
リクエストヘッダを調べて、コンテンツを吐くか吐かないか制御したいのです。
0216nobodyさん03/02/02 03:31ID:???
>>215
If-Modified-Since と Last-modified あたりかな。
まぁでもCGI側でブラウザのキャッシュのことを気にしなくていいような気もするが・・・
021721503/02/02 04:04ID:???
>>216
Last-Modified付けてもIf-Modified-Since送ってきませんでした。IE5

もしキャッシュできれば、余分なI/Oが減って2chのread.cgiが軽くなるかなー
なんて考えていましたが、無理かな。。
0218nobodyさん03/02/02 15:06ID:???
phpでperlのlocal宣言ってあるの?
0219nobodyさん03/02/02 15:27ID:???
>>218
phpはperlなんかと違って変数のスコープは関数内に限定されます。
0220nobodyさん03/02/02 23:13ID:???
>>215
nph- にして自前でヘッダを全部出力しないと、
サーバソフトが勝手にレスポンスヘッダに 'Cache-Control: no-cache' とか
付けて吐き出してくれてしまったりします。

nph- にすればキャッシュだけでなくかなり自由度の高いシステムを作れるけど、
いかんせん面倒くさいのが何とも。
HTTPの仕様書とにらめっこをしながらプログラムを書く羽目に。
0221nobodyさん03/02/03 08:11ID:FFrB/oLu
ここ( ttp://www.area-s.com/ )で配布されている、
NarrationBBSというのがものすごく気に入って自分のサイトに
設置しようと思い、CGIについて理解しようとネットを駆け巡り
5時間が過ぎました。CGIについては全くの初心者ですが、
一通りの設置の流れや、やらなければならないことは理解した
つもりです。で、いまだにCGIをちゃんと使えるようになって
いないのですが、どなたか助けていただけませんでしょうか。

現在の進行状態としては、プロバイダー(地域のCATVでCGI利用可確認済み)確認、
目的のCGIのダウンロード、プロバイダーに指定された内容の「.htaccess.txt」
ファイルの転送、パスの変更後CGIファイルの転送とパーミッションの設定、
ホームページのトップからCGIへのリンクを作成。

と、こんな感じなんですが、リンクをクリックすると、ダウンロードしますか?の
確認メッセージがでてきてしまい、CGIを動作させられません。
0222nobodyさん03/02/03 08:12ID:???
>>221
shine
0223nobodyさん03/02/03 09:26ID:8N4vyrOL
http://www.agemasukudasai.com/bloom/
0224nobodyさん03/02/03 09:55ID:???
CGIを使って、特定のディレクトリ以下をアクセス禁止にするような事できますか?
htaccessが使えないような場合のことです。
0225nobodyさん03/02/03 10:17ID:???
>>221
.htaccessの中身をここにうpしてみよう。
あとパーミッションはいくつに設定したの?
0226nobodyさん03/02/03 15:58ID:QjlL5TK8
>>225さん すみません。朝方までがんばってやっていて今まで寝てました
,htaccessの中身は以下のとおりです

# .htaccess
AddHandler cgi-script .cgi

このファイルのパーミッションは、プロバイダの指示が

>テキストファイルの内容は以下のように記述して下さい。
># .htaccess
>AddHandler cgi-script .cgi
>
>転送するときにパーミッションを「644」にして下さい。

とあったので644、その他のものについては cgi 755 dat 666 pl 644
との指示がCGI配布サイトにありましたのでその通りに。また、『※全ての
ファイルを格納するディレクトリ(フォルダ)は777にしてください。』と
あったのでcgiファイルのあるフォルダは777にしました。

ディレクトリ構造は以下のとおりなんですがこれでいいのでしょうか?
public_html ┬ index.html
└ cgi-bin ─ nb ┬ nbs.cgi
├ nbe.cgi
├ cnt.cgi
├ img ─ 画像ファイル(アイコン含む)
├ bbs.dat
├ nar.dat
├ num.dat
├ rjc.dat
├ usr.dat
├ jcode.pl
└ index.html ダミー用
0227nobodyさん03/02/03 16:00ID:QjlL5TK8
すみません、変な風になっちゃいましたね
public_html ┬ index.html
       └ cgi-bin ─ nb ┬ nbs.cgi
├ nbe.cgi
├ cnt.cgi
├ img ─ 画像ファイル(アイコン含む)
├ bbs.dat
├ nar.dat
├ num.dat
├ rjc.dat
├ usr.dat
├ jcode.pl
└ index.html ダミー用
こんな感じです
0228nobodyさん03/02/03 16:45ID:TJH3fomo
>>227
.htaccess.txt
じゃなくて
.htaccess
022930203/02/03 16:49ID:???
>>228さん レスありがとうございます。

FTPソフトを用いてtxt拡張子を消しましたがうまくいきません。
リンクをクリックすると、ダウンロードしますか?の確認メッセージが
やっぱりでてきてしまい、CGIを動作させられません。
023022103/02/03 16:51ID:QjlL5TK8
すいません、229は302じゃなくて221です・・・。
023122103/02/03 17:05ID:QjlL5TK8
いまパスの設定を見直して、リンクを書き直したら
ダウンロードしますか?はでてこなくなりましたが、
Internal Server Error になってしまいました。
この場合、ほとんどはパスの設定ミスということらしい(?)ですが、
htaccessのパーミッションはプロバイダの指定どおり、他のcgiファイルなどは
cgi配布サイトの指示どおりにしています。

ひとつ疑問が残るとすれば、cgiファイルを格納しているディレクトリの
パーミッション設定なんですが、cgi配布元によると、cgi格納ディレクトリは
777にせよとのことなのですが、これは>>227の階層構造でいうと、cgi-binと
nbsフォルダのパーミッションを777にすればいいんですよね?

・・・なんでInternal Server Errorになるんだろう(T-T)
0232nobodyさん03/02/03 17:18ID:???
殆どの場合#!/usr/local/bin/perl
もしくは#!/usr/bin/perl です。

両方試してみた?
0233nobodyさん03/02/03 17:19ID:800eNsZd
>>231
777でだめなら755にしる。
023422103/02/03 17:21ID:QjlL5TK8
>>233
755にしたらちゃんと表示されました!
皆さん本当にありがとうございました〜
なんだかんだいって、やっぱり2chは頼りになります
0235nobodyさん03/02/03 18:50ID:???
>>234
頼りにするのは困る。最終手段として使え。自分で調べられないと生きていけないぞ。

今回の問題は、suEXECのセキュリティーチェックに引っかかってる。点。
worldから書き込み可能なファイルは、所有者以外に書き換えられた可能性がある
から、実行させてくれない。ということ。
023617903/02/03 21:00ID:???
203の中間報告。結果は学校の鯖ではSocket.pm、IO::Socket.pm、FileHandleなどの
モジュールが呼び出せないためSocket通信できませんでした。
push(@INC, "/hoge"); とかも駄目でした。
0237nobodyさん03/02/03 21:15ID:???
システムコール呼び出しとかで何とかならんかのう。
0238sub()03/02/04 00:03ID:rUOqBsxa
ファイルの任意の行だけ上書きする処理ってどうやるんでしょう?
一行づつループかけてマッチした行以外をTMPファイルに吐き出して
それをログファイルに上書き(>)した後、書き換えたい行を(>>)で書けば
よいんでしょうか?3日悩んでます。。。
0239nobodyさん03/02/04 00:36ID:???
>>238
死ねクソマルチ。
024017903/02/04 01:52ID:???
動いたので最終報告しようとしたら、既に答え書いてあるし。うーん
>237
の言う通り、システムコールで動きました。
0241nobodyさん03/02/04 09:32ID:???
なんだマルチか。
0242nobodyさん03/02/04 16:44ID:???
ファイルを、while (<IN>) {〜}といった記述をしないで、
一行ずつ読み込んでいく方法はないものでしょうか。

@file = <IN> といったメモリにファイル全部読み込む方法は使わず、
一行ずつ読み込んで、一行ごとに違う処理をしていきたいのです。

while の中でループ回数カウントしてifで判定しろ、なんていうのはなしで。

ファイルを一行読み込む場合、
open(IN,"$logfile");
$line = <IN>;
と、やれば出きるのはどこにでも書いてあるのですが、
2度目以降 $line = <IN> としても空でした…。

Perl は一行ごとに分けるデータ構造が身についてしまってるのがダメなのかなぁ…。
seek と read 使えばよさそうなのは解ってはいるのですが、
ベースから書き換えなくてはならず、このままの構造でなんとかできないものかと。
024324203/02/04 17:30ID:???
あ、Perl初心者スレと間違えました・・・。
あちらにいってきます。
024417903/02/04 18:53ID:???
>238 = 242 ?
まあいいや。seekとread使わないと駄目じゃない?
それなら方法が下のページの"ファイルをブロック化する" に書いてあるけど。
ttp://homepage2.nifty.com/S_HIASA/kotohazime/perlpro.htm
0245nobodyさん03/02/05 00:47ID:Rqrb27N+
CGIと言うのは、一つで思い処理をさせるのと、
分散して、複数のCGIを設置するのとどちらが良いのでしょうか?

例えば、カテゴリ別の掲示板だった場合…
bbs.cgiで10のカテゴリの掲示板を運営できるものと、
bbs1.cgiと、bbs2.cgiで5のカテゴリずつ運営する場合です。

この場合、下記の場合の方が、負荷を軽減できると感じてしまいますが
実際の所はどちらがよいのでしょうか?
0246nobodyさん03/02/05 00:48ID:k4P35St7
>>245 訂正
思い > 重い
0247nobodyさん03/02/05 00:53ID:???
>>245
そのCGIが、インタプリタによって実行されるものだと勝手に仮定すると、

普通に考えて、一度に解析されるコードの量が少ないと、負荷は減る。はず。
でも、>>245の場合、実際に解析されるもの自体は同じだと思うから、効果は無い。と思う。

分割するとしたら、読み込み用、書き込み用、メンテナンス用とか、機能別に分割する
方が、よろしい
024824503/02/05 01:03ID:Rqrb27N+
>>245です。

CGIの内容は、スレッド掲示板をいくつでも作れてしまうというものです。
書き込み、読み込み、メンテ用などは、各CGIで動作します。
このCGIシステム一つで、掲示板を50個を運営するのと、
CGIシステムを5個設置して、10個の掲示板を運営するのと…という場合です。

読み込み用のCGIがbbs.cgiだとすると、
50の掲示板それぞれ、1分間に10人がアクセスすると、
bbs.cgiを500回動作させる事になります。
0249nobodyさん03/02/05 03:24ID:CZbUch9c
Your script produced this error: chmod trapped by operation mask at ./upload.cgi line 199.

chmod 0604, "$storedir$prefix$id.$type";
0250nobodyさん03/02/05 08:29ID:???
>>248
名前変えただけで中身が同じなら負荷は変わらないでしょ。
0251nobodyさん03/02/05 10:47ID:OGgWzvAl
教えて下さい。
PHPとか、PEALとか、 JAVAとか、 ASPとかあるけど、
大きなデータベースを使ったWEBアプリケーションを作る場合、
どれが性能がいいですか?
今ASPしかやってませんが、次になにを勉強しようか
考えてます。
0252nobodyさん03/02/05 10:57ID:???
>>251
全部軽く覚えてSQL投げ比べてみるとか。

C系の言語習得してるならどれも習得に大した時間はいらないわけで。
0253nobodyさん03/02/05 11:04ID:???
>>252
といってもCじゃだめだけどな
0254nobodyさん03/02/05 11:17ID:OGgWzvAl
>>252
それもそうなのですが、当方Win2000Serverしかなく
他を試すのがたいへんなので広く知ってる方に教えて
頂けないかという少々怠慢なお願いでした...。
ちなみに同僚はPHPにすれ、と言ってました。
0255nobodyさん03/02/05 11:48ID:hzviKg6+
$race2 = 'C2十';
というデータでInternal Server Errorになりました。
とりあえず、$race2 = 'C2';
で対応しましたが、

これって、エディタの設定(sjis)が悪いんでしょうか。
それともコードでしょうか。
0256nobodyさん03/02/05 11:50ID:???
>>255
結局なんにもわかってないって事か。
025725503/02/05 12:02ID:???
わかってないといわれれば、そうなんですけど。
文字化けする文字が悪さをした、としか分かっていません。
0258nobodyさん03/02/05 12:37ID:???
何をおっしゃる兎さん
$race2 = 'C2十\';
0259nobodyさん03/02/05 12:40ID:???
>>258
'の中で\は評価されたっけか。
0260nobodyさん03/02/05 12:49ID:???
>>258
それだけじゃ何なんで、説明するわ。

シングルクォート内であっても、末尾が '\' で終わる文字は書けない。
(閉じるための ' がエスケープされてしまい、
Can't find string terminator "'" anywhere before EOF
というエラーになる)
'十' という文字は2バイト目が思いっきり '\' なので、エラーになる。

他にダメな文字は以下のとおり。

―ソЫ�\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬
畚秉綵臀藹觸軆鐔饅鷭�x�x


ちなみにエラーを書くときは、このPerlの出すエラーを書くようにね。
Internal Server Error なんて、ヘッダの吐き忘れでも出るから意味なし。
0261nobodyさん03/02/05 12:58ID:???
まあPerlは使うなってことですな。
0262nobodyさん03/02/05 13:00ID:???
>>261
愉快な結論だな。
0263nobodyさん03/02/05 13:01ID:???
>>261
その言い方はおかしい。こう言うべき。

「まあ馬鹿はPerlを使うなってことですな。」
026425503/02/05 13:01ID:???
サンクス、皆様
026525503/02/05 13:20ID:???
馬鹿だけど、使わせてください。
おながいしますmm
026625503/02/05 13:23ID:???
でもやっぱり馬鹿だし、phpかrudyにしようかな(w
0267nobodyさん03/02/05 13:24ID:???
>>266
何使っても結局はまると思うぞ。
0268nobodyさん 03/02/05 13:32ID:/TzrVcwr
if ( length ($FORM{"number$count"}) == 0){
$num{"$str"} = 0;
}
else{
$num{"$str"} = $FORM{"number$count"};
}

とは何をやっているのですか?
初心者で厨な質問で申し訳ないです

お願いいたします
0269nobodyさん03/02/05 13:33ID:???
>>268
データがあるなら代入して無いなら取りあえず0
0270_03/02/05 14:35ID:KqDONkoE
>>268
if文の意味なしと思われ。
$num{"$str"} = $FORM{"number$count"};
0271nobodyさん03/02/05 15:30ID:???
>>270
$num{"$str"} がぬるぽになることを恐れたんだろう。
0272nobodyさん03/02/05 15:45ID:???
コンナトコロデ アブラヲウッテルトハ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>271
0273nobodyさん03/02/05 21:06ID:tr4FI/E+
質問です。

Perlで、use IO::Socketを使って、
2chを読んで加工して表示するCGIを作っているのですが、

板自体
http://pc2.2ch.net/php/
は読めるのですが、
http://pc2.2ch.net/test/read.cgi/php/1041530204/l50
などのCGIが出力するスレが読めません。

Found
The document has moved here.

が帰ってきます。どうすれば読めるようになりますでしょうか?
ヒントでも構いませんので、よろしくお願いします。
0274nobodyさん03/02/05 21:15ID:???
Locationヘッダーが指すファイルを読む。
0275nobodyさん03/02/05 21:32ID:gt7kwXPU
激しく厨房な発言ですので注意してください

@niftyでmethod=POSTが使用できるのでしょか?
いろいろ見てはいるのですが解らなかったので
おしえてくほしいです
0276nobodyさん03/02/05 21:36ID:???
@niftyにあるサイトの掲示板の書き込みボタンでも押してみればいいじゃん・・・
027727503/02/05 21:53ID:gt7kwXPU
押しましたけど・・・わからないですよ??
0278nobodyさん03/02/05 21:58ID:???
>>277
すぐさまこの板から出てゆけ。
027927503/02/05 22:00ID:gt7kwXPU
そんなこといわないでくだされ・・・・
BBS設置できなくてこまってるんでつよ・・・
0280nobodyさん03/02/05 22:02ID:???
>>279
エラーがでないなら使えるってことだろうが。
それにCGIを許可しておいてPOSTを禁じるやつがどこにいる。
0281nobodyさん03/02/05 22:02ID:???
>>279
ニフならプロバイダ謹製のがあるんじゃないか?
POSTも分からんのならそういうの使え。
028228003/02/05 22:03ID:???
ところで、CGI専用ディレクトリにおいている?専用のURLでアクセスしている?
確か@niftyはそういう制限があったはず。
028327503/02/05 22:11ID:gt7kwXPU
281
二つひつようなもんで
専用の場所に置いて専用のURLでアクセス
してるんですが、えらーになるんですよ
028427303/02/05 23:15ID:tr4FI/E+
>>274さんありがとうございます。

2chを取得する>>273の件ですが、
Headerを取得してみたところ、

head pc2.2ch.net /test/read.cgi/php/1041530204/l50 80
HTTP/1.1 302 Found
Date: Wed, 05 Feb 2003 14:11:00 GMT
Server: Apache/2.0.44 (Unix) mod_perl/1.99_07-dev Perl/v5.8.0 mod_ssl/2.0.43 OpenSSL/0.9.6g DAV/2 FrontPage/5.0.2.2624 PHP/4.3.0RC3 mod_gzip/2.0.26.1a
Location: http://binbo8.he.net/cgi-bin/error500
Connection: close
Content-Type: text/html; charset=iso-8859-1

となってLocationに期待のものが入ってません。
GETはhostだけ渡してますが、なにかやり方がマズイのでしょうか。

0285nobodyさん03/02/05 23:29ID:???
>>284
$ telnet pc2.2ch.net 80
HEAD /php/ HTTP/1.0
Host: pc2.2ch.net

うしし。
0286nobodyさん03/02/05 23:48ID:???
素直にmonazillaに誘導した方が良くない?
028727303/02/05 23:55ID:tr4FI/E+
>>286さんありがとー
monazillaってとこに言ってきたら、read.cgiの仕様が解説してあって

print $SOCKET "GET $path HTTP/1.0\r\n";
print $SOCKET "Host: $host\r\n";
print $SOCKET "Connection: close\r\n";
print $SOCKET "User-Agent: dummy\r\n";
print $SOCKET "Accept: */*\r\n";
print $SOCKET "Accept-Language: ja\r\n";
print $SOCKET "\r\n";

したら見事読みました! 
0288nobodyさん03/02/06 06:20ID:???
質問です。よろしくお願いします。
ttp://homepage2.nifty.com/yoshi-m/makehp/free_cgi/CGI/counter/now_counter.html
↑上記のサイトにある閲覧者カウンター(現在の訪問者数を数えるCGI)の設置を
試みています。無事、設置できたのですが、同一IPアドレスをチェックする機能が
ついていないので、GOOGLEなどで検索して調べて同一IPのカウントを制限するような
改造を試みたのですが、どうにもうまくいきません。
バカな質問かもしれませんが、どなたか、どうしたら上手くいくかご教授お願いでき
ないでしょうか?
0289nobodyさん03/02/06 07:04ID:???
>>288
具体的にどうやって、どううまくいかないのかを書いてくれないと。
1から10まで手取り足取り教えてもらえると思ったら大間違いだよ。
0290nobodyさん03/02/06 08:54ID:???
>>288
1から10まで手取り足取り教えてほしければこちらへ

【 スクリプト改造工房 PART 5 】
http://pc2.2ch.net/test/read.cgi/php/1028193595/







やってくれる人がいるかどうかはしらんが。
■ このスレッドは過去ログ倉庫に格納されています