- PR -

CGI・環境変数について

投稿者投稿内容
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-03-03 12:28
前回の案件の続きだと思いますが
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36615&forum=7

今時点はPOSTで送っているんですよね。ブラウザから送られるデータのContent-lengthはどの程度になっていますか。

いったんDB処理から離れてテストした方が問題の切り分けが容易ではないでしょうか。
「POSTされたデータを表示する」ようにしても全件表示できませんか?CGIが受け取ったデータを(DBの更新でなく)ファイルに落とすような処理であれば問題なく動作しますか?その場合ブラウザがPOSTしてから応答(簡単なものでいいです)を受け取るまでの時間などはどうでしょう。

ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-03 13:41
Content-lengthというものを今まで意識したことがないのですが、
POSTで送るデータサイズは
引継ぎ情報(登録終了後に画面を表示する為に必要な情報130byte程度)

DB登録情報(max90Byte程度/1行、× max2000行・・・ここまでは使わないと思いますが)
くらいになります。

DB設計はWebに関係ない部署が設計されいるので、
登録したいテーブルはPKがなく、varchar2(20)の羅列などになっています。
(重複OKなんです)

●POSTされたデータを表示する」ようにしても全件表示できませんでした。
というのは、DBを使わないようにコメントにして試験をしたのですが最初に環境変数の取得エラーになりました。

●CGIが受け取ったデータを(DBの更新でなく)ファイルに落とすような処理であれば問題なく動作しますか?

環境変数でテキストに落とす処理にもしてみましたが、上記と同じ理由でできませんでした。

●その場合ブラウザがPOSTしてから応答(簡単なものでいいです)を受け取るまでの時間などはどうでしょう

Webでボタンを押してからブラウザ画面が変わるまで(正常、異常とも)の時間を測ったところ、
70件で24秒→登録正常終了、
106件で57秒→登録正常終了、
150件で1分19秒→異常終了
でした。


varchar2には全て、けっこうギリギリまでデータが入ってるので
そのデータを1byteにしてテストをしたところ、180件でも正常に登録できました。

つまりはデータ量が多いということですよね。
これがContent-lengthに絡むところでしょうか。
制限があるのでしょうか?!

sequence を使おうとしましたが、テーブルフォーマットは変えられないし、
別テーブルを作ってリンクするように管理して・・・などと思いましたが
複雑になりすぎて、未だ考えがまとまりません。期限が迫ってるのに・・・。

よろしくお願いします。





ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-03 18:03
ちょっと見つけたのですが、
PKのないテーブルレコードですが
ブラウザに表示する前に一旦仮のテーブルを作成し、
表示htmlを作る際に、仮テーブルからデータとともにrowidを取得しながら、
inputのhidden、valueにセットすれば
80バイトくらいのところを18バイトまで
減らすことができそうです。

かなり作り直しですが、
これって有効でしょうか。
原因がよくわからないので
なんとも言えないのですが。。。




よしぼん
会議室デビュー日: 2003/04/12
投稿数: 4
お住まい・勤務地: 東京・大田区
投稿日時: 2007-03-03 23:27
こんにちは
私も似たような開発環境(Windows&VC++&Oracle)でCGIを作ってました。

>●POSTされたデータを表示する」ようにしても全件表示できませんでした。
>というのは、DBを使わないようにコメントにして試験をしたのですが最初に環境変数の
>取得エラーになりました。
>
>●CGIが受け取ったデータを(DBの更新でなく)ファイルに落とすような処理であれば
>問題なく動作しますか?
>
>環境変数でテキストに落とす処理にもしてみましたが、上記と同じ理由でできません
>でした。

環境変数の取得エラーというのは、どのようなエラーコードが出ているのですか?
VC++だったらGetLastError()とかerrnoとかエラー内容を調べる手段は色々あります。

まずは取得エラーの内容とPOSTデータを取得している部分のコードを提示した
ほうが良いかと思います。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-03-05 00:39
引用:

ビギさんの書き込み (2007-03-03 18:03) より:
ブラウザに表示する前に一旦仮のテーブルを作成し、
表示htmlを作る際に、仮テーブルからデータとともにrowidを取得しながら、
inputのhidden、valueにセットすれば
80バイトくらいのところを18バイトまで
減らすことができそうです。



前回の続きとするならば「チェックボックスにチェック」したものだけPOSTするわけですよね?で、今回の変更ではチェックされたrowidだけPOSTするということでいいのでしょうか。それでも18バイトにしか縮まりませんか?

#もちろん項目名とかエンコードとかあるでしょうが(rowidならエンコードはないか・・)。

引用:

かなり作り直しですが、
これって有効でしょうか。
原因がよくわからないので
なんとも言えないのですが。。。


仮のフォーム(HTML)とPOSTされた内容を表示するだけのCGIでテストしてみればどうでしょう。まずは「ちゃんとPOSTデータが受け取れる」かどうかだけ確認すべきです。それで動作確認しないことには作り直しに着手すべきかどうか判断できないと思います。
ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-05 09:32
いろいろとありがとうございます。

CGIの処理(環境変数を取得する部分)は別の方が作成した社内の既存のクラスライブラリをリンクして使用しています。

ですので、私の作ったアプリに入ってくるときには
環境変数キーワードがない・・・というエラーになっています。

とりあえず、環境変数のデータ量をできる限り減らすようROWIDにしてみました。
画面上から選択可能なcheckboxが2種類あるので、それは残しましたが。
oracleのROWIDは18byteあるようです。

試験してみたところ、1分31秒かかって、388件は登録できました。
「よしっ」と思い、次に1000件やってみたところ、1分28秒くらいのところでNG画面になりました。
正常に終わる場合は、かかる時間が半分程度経過したところで
終わった後に吐き出す次の画面の上部の部分だけ(画面上のタイトルやロゴ画像など)表示され・・・
その後、しばらくそのまま処理がされ(ディスクがアクセスしてる・・・)、最後の正常な画面を表示します。

 200件の場合は、17秒後に次の画面上部のみ表示、その後22秒後に正常終了、
 388件の場合は、54秒後に次の画面上部のみ表示、その後37秒後に正常終了。
 1000件の場合は、途中で画面表示無しで1分28秒後にCGI側アプリのmainの最初の処理(dbopen)のエラー表示。
   ←たぶん、dbopenをはずせば次の処理・「環境変数キーワードなし」になると思います。

もしかして処理時間なども関係あるのでしょうか。

今日はクラスライブラリのを作成した方にも見てもらおうと思います。

よろしくお願いします。



ビギ
ベテラン
会議室デビュー日: 2006/04/03
投稿数: 56
投稿日時: 2007-03-17 11:53
結局、CGIクラスライブラリを担当した方に調べてもらうことはできませんでしたので
時間切れで今のまま行くことになりました。

マシンスペックも影響するようで、私の試験環境ではダメでも
別の環境(私の試験環境よりスペックが上)では より以上の件数が登録できます。
本番マシンは更にスペックが上なので
(もう試験することはできませんが)
運用には問題はなさそうです。

なんか 腑に落ちないままですが
皆様、ありがとうございました。

ただ、今回のような処理をしたい場合どのような処理をすればいいのかは
引き続き調べて勉強していかなけれならないと思っています。

同じような処理をしたことがある方、または
私だったらこうする・・・のようなアドバイスがありましたら
是非、教えていただきたいと思います。

よろしくお願いします。

末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-03-17 12:44
こんにちは

引用:

ビギさんの書き込み (2007-03-17 11:53) より:

結局、CGIクラスライブラリを担当した方に調べてもらうことはできませんでしたので
時間切れで今のまま行くことになりました。



私はクラスライブラリの不具合だと思います。
受信バッファのサイズ(1)とか、とかセパレータ(2)とかタイムアウト(3)の関係ではないかと...

なので、(1)の調査をするなら単純なフォームを作成して
コード:

<form action="{#呼び出すCGI#}" method="post">
<textarea name="data"></TEXTAREA>
<input type="submit" />
</form>


のようなフォームをつくって2分探索で最大サイズを求めます。
JavaScriptなどを使って指定した文字長のデータを作るようにしたりすれば良いかとおもいます。

64KiBのデータなら手作業でも16回ほどで最大長が求められますね。
1MiBなら20回.

(2)だったらバイナリデータファイルを作って送信してみるとかですかね。
<input type="file">

(3)だったら方法を考えないといけないですね。
データを時間をかけて送信するようなプログラムとか

クラスライブラリのここが悪いという、検証コードを提示すれば直さざるを得ないでしょう。

仕様の範囲で運用してくれといわれたら、じゃぁ仕様を出せ!とw

[ メッセージ編集済み 編集者: 末記人 編集日時 2007-03-17 12:46 ]

[ メッセージ編集済み 編集者: 末記人 編集日時 2007-03-17 12:49 ]

スキルアップ/キャリアアップ(JOB@IT)