• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:POSTメソッドの最大容量について)

POSTメソッドの最大容量について

このQ&Aのポイント
  • POSTメソッドの最大容量についての要約文1
  • POSTメソッドの最大容量についての要約文2
  • POSTメソッドの最大容量についての要約文3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

No.2,4,5,6です。 > 因みにnameの数もそうですが、当然渡すデータサイズも関係しますよね? > max、20byteのパラメータが3個は・・・全行にあり、ここも不要な場合、削除しました。これは大きいですよね?(^^; もちろん渡すデータサイズがPOSTのサイズに関わってきますが、 max20バイトだったら、200行×8チェックボックス×20バイト=32Kバイト 程度のものですよ。POSTデータとしてはたいしたことないサイズだと思います。 (画像のアップロードにもPOSTを使いますが、そんなのは数メガ行く場合もあります) 追加の観点としては、そのCGIのパラメータ解析処理に問題がないかも 見た方がよいと思います。もしかして32Kの固定バッファを使って POSTデータを読み込んでいて、32Kバイト以上のPOSTデータを受信すると バッファオーバーフローでメモリ破壊してしまい、DBオープン処理や GetPrivateProfileStringが正常に実行できなくなっているという可能性は ないでしょうか?ということです。

jg1wjz
質問者

お礼

Lchan0211b さん、引き続き有難うございます。 cgiクラスのソースを見ましたところ、 POST用のバッファはGlobalAlloc()で確保していました。 内部的な話かもしれませんが、フィールド数も36864とっていました。 今週中にはwiresharkで確認できるかもしれません。

jg1wjz
質問者

補足

その後、、、別問題が発生し、 ##onloadのタイミングについて、 ##別Qをたてているのですが、 ##マッチする回答が付きませんでした。 ##が、そこで問題が見つかってしまいました!  未だにパケットキャプチャできていません。 結果を報告してからと思ったのですが、 時間がかかりそうなので、ベストアンサーにさせていただきます。 有難うございました。

すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.6

No.2,4,5です。 > 例えばcheckBoxの場合、チェックされている項目だけPOSTデータが渡るのですよね? > 実際には、checkboxにチェックをしないでボタンクリックして同じ現象になっていました。 はい。checkboxにチェックのない項目はPOSTデータで送信されません。 ただ、あなたの説明には > で、今までは □更新 の行だとしても 全て(見る聞く・・・)の情報を表示していました。 > 情報が無い場合はhidden項目にして。 > で、今回、「更新」の行に「見る」「聞く」などの情報は不要のため > hiddenで表示している項目を全て削除してみました。 と書かれてあり、「hidden項目にした」というのは、inputタグのtype属性を "checkbox"から"hidden"にしたのだろうと思いました。 例えば <input type="checkbox" name="miru" /> の部分を 更新の行については <input type="hidden" name="miru" /> としたのだと思いました。 そして、これだとトラブルが発生し、このinputタグ自体を 削除したらトラブルが発生しなくなったのだと理解しました。 <input type="hidden" name="miru" value="" /> の場合、miruパラメータは送信されないのではなく、 「miru=」(空白値のmiruパラメータ)が送信されます。 いずれにしても、パケットキャプチャで実際に送信されたPOSTデータを 確認すれば、このあたりの疑問もはっきりすると思います。

jg1wjz
質問者

お礼

Lchan0211b さん、重ね重ね有難うございます。 ソースの状況、及び変更内容はLchan0211bさんの説明通りです。 #<input type="hidden" name="miru" value="" /> #の場合、miruパラメータは送信されないのではなく、 #「miru=」(空白値のmiruパラメータ)が送信されます。 理解しております。 でも、チェックボックスはチェックをしない場合、そのグループ?!のnameは送信されないですよね? (修正後に送信されないことも確認できました) なのに、結果として削除しないとダメだったんですね。 他のパラメータの数が多すぎたんですかね。。。 今回はmaxでいうと、300行程度になる場合があるかもしれない仕様のようなので とりあえず、今のままでいけそうですが 今後はそうも行かないかもしれませんので、解決しないまでもちゃんと把握しておきたいと思います。 サイズの制限があるとしたら、 因みにnameの数もそうですが、当然渡すデータサイズも関係しますよね? max、20byteのパラメータが3個は・・・全行にあり、ここも不要な場合、削除しました。これは大きいですよね?(^^; まだまだですが、いろいろと勉強になりました。 WireSharkの出番ですね。 まだちゃんと使ったことが無いので勉強しながらやってみます。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.5

No.2,4です。 追加説明ありがとうございます。 追加説明より、postメソッドが8個あるんじゃなくて、 テーブルの各行にチェックボックスが8個ずつあり、 ボタンはその画面に全部で(A,B,Cの)3個しかなく、 1回ボタンを押すとそれに対応するpostメソッドが 1回実行されると理解しました。 これ以上は実際にそのWebシステムを見ないと どこが悪いのかはわからないですが、なんとなく、 「更新」の行に「見る」「聞く」等の不要なパラメータが hiddenで入っているため、そのパラメータ情報が CGIに渡されて誤動作したんじゃないかなという感じが しました(あくまで少ない情報からの勝手な想像です)。 いずれにしても、POSTメソッドのサイズ制限を疑うなら、 パケットキャプチャソフト等を使って、実際にブラウザから どのようなPOSTデータが出ているか調べて、CGIの入り口で POSTデータをログ出力する等して、ブラウザから送信した POSTデータを全て受け取ったかどうかを調べれば はっきりすると思います。 ちなみに、POSTデータサイズ制限値ですが、 http://support.microsoft.com/kb/327659/ja に書かれてある204,800 バイトの制限は、 ASPの話なので、CGIを使っている人は関係ないです。 それ以外では、IIS4,IIS5について https://support.microsoft.com/kb/260694/ja にある通り、MaxClientRequestBufferの設定があり、 IIS5ではこれが128KB制限でしたが、IIS6でもこの設定が 有効かどうかはよくわかりません。たぶん、IIS6では そういう制限はなくなったはずだと思います。

jg1wjz
質問者

お礼

Lchan0211b さん、ありがとうございます。 例えばcheckBoxの場合、チェックされている項目だけPOSTデータが渡るのですよね? 実際には、checkboxにチェックをしないでボタンクリックして同じ現象になっていました。 (ちょっと話がずれていましたらお許しください) 最初、JavaScriptで、ひとつ以上checkされているか確認し、ひとつも無い場合はalert表示していたのですが、 行数が多いとかなり負荷がかかるのでcheckboxにcheckがなくてもcgiアプリに渡るようにしてしまいました。 やっぱりパケットキャプチャソフトで確認したほうがいいですね。 開発環境はIIS6.0ですが、商用は7.xの最新だそうです。 (今、聞きました(^^)) とりあえず、今は動いているので (納品後に爆弾にならないことを祈っています) 今すぐキャプチャすることはできないのですが、 今まであまりパケットキャプチャで確認したことが無いので、必ず確認したいと思います。 有難うございました。

すると、全ての回答が全文表示されます。
回答No.4

No.2です。 PQerrorMessageでエラーメッセージを取得したのなら、 PostgreSQLがDBオープン処理でエラーを検出したということですよね。 私だったら、数が多くなるとエラーになるということは、 そのDBオープンに対するクローズ処理がちゃんと行われているかを 疑います。 PostgreSQLを扱うコーディングはしたことはないのですが、 http://www.postgresql.jp/document/8.1/html/libpq-example.html によると、PQconnectdbに対してPQfinishを発行することで 接続を閉じるようですが、ちゃんとPQfinishが正しいパラメータで 発行されていることは確認しているのでしょうか? 特に今回のケースは、GetPrivateProfileStringで取得した値が nullになるというバグを内在したままの動作ですので、もしかすると スタック破壊等、なんらかのメモリ破壊を起こしたまま動作していて、 一見正しくPQfinishを発行したように見えていて、実はその発行パラメータ の中身が破壊された状態でPQfinishを呼び出していて、PQfinishがエラーに なっている(クローズできてない)可能性もあるのではないかと思いました。 PQfinish自体に戻り値はないようですが、その結果はPQstatus関数で 確認できるようです。確認してなければ、そこはちゃんと確認した方が よいと思います。 そもそも、最初の状況説明がよくわかってないのですが、 「テーブルの1行内にpostメソッドが8個ある」というのは、 テーブルの1行内にpostメソッドを発行するボタンが8個あって、 1回のボタンクリックに対して1回のpostメソッドが実行されると いうことでしょうか? それとも、テーブルの1行にボタン1個で、javascript等で 制御して1回のボタンクリックに対して8回のpostメソッドが 実行されるいうことでしょうか? 後者であれば、1クリックで処理するpostメソッドの数が関係する のはわかりますが、前者であれば、1クリックで処理するpostメソッドは 1つなので、postメソッドの数は一見関係ないように思えます。 前者の構造なのに、それでも説明されているような状況が起きているので あれば、postメソッドの処理の問題ではなく、その前のテーブル 出力処理(200行のテーブルの各行に8個のpostメソッドボタンを 配置するHTMLデータ出力処理)時に、メモリ破壊等なんらかの問題があって、 後続のpostメソッド処理に影響を与えているのかもしれないなと思いました。 質問を継続するようであれば、postメソッドとボタンクリックの関係も 補足してください。

jg1wjz
質問者

お礼

Lchan0211b さん、ありがとうございます。 事前のDBオープンに対するクローズ処理はちゃんと行われていますが、 PQstatus関数で確認はしていないので、やってみます。 ただ、他の処理では問題なく普通に処理できています。 問題は、件数が多いときだけ・・・発生しているのです。 件数が多くても、postデータを取得しないボタン処理は当然 正常に動きます。 ###「テーブルの1行内にpostメソッドが8個ある」というのは、 すみません、言葉足らずでした。 1行内に、postで渡せる情報(id)やチェックボックスがたくさんあります。 言葉を変更させて書かせていただきますが、テーブルの各セルに、 id1=xxx id2=xxx id3=xxx □見る □聞く □送る □受け取る □終わる... 等があります。 で、tableの外に複数のボタンがあり、 ・「見る」と「聞く」の処理を行うボタン (以後、Aボタン) ・「送る」と「受け取る」の処理を行うボタン(以後、Bボタン) ・「終わる」の処理を行うボタン(以後、Cボタン) 等があり、 Aボタンをクリックした場合、hidden項目に処理種別などをセットして、 submitしています。で、exeが動き、 チェックされている情報を受け取り、別プロセスに「見る要求」か 「聞く」要求を出すだけの処理を行います。 Bボタンも同じです。 Cボタンは、id1、id2、id3の情報とともに別プロセスに「終わる要求」を出すだけの処理を行います。 処理的には単純な処理です。 別プロセスに渡す方法は POSTデータをパラメータ渡しでCreateProsessを実行しています。 実際には、1行内の意味として上記の情報(checkbox)がない行も有り、 その行には別セルに □更新 のようなpost があります。 で、今までは □更新 の行だとしても 全て(見る聞く・・・)の情報を表示していました。 情報が無い場合はhidden項目にして。 で、今回、「更新」の行に「見る」「聞く」などの情報は不要のため hiddenで表示している項目を全て削除してみました。 逆に、「見る」などの情報がある行は「更新」は不要なので削除しました。 そうしたところ、 200件でもうまく処理ができたのです。 何故GetPrivate・・・が正しく処理できないのか、 未だに原因不明です。 引き続きまして、よろしくお願いいたします。

すると、全ての回答が全文表示されます。
回答No.3

>ould not connect to server: No buffer space available メモリ不足(というよりもメモリの使い過ぎ)ではないでしょうか。 一時ファイルに保存して、1行ずつ処理してみてはいかがでしょうか。 ------------- POSTサイズ制限はデフォルトで204,800バイト、それを越えた場合は403 HTTP ステータスコードが返るようです。 POSTサイズの変更はIISの設定で変更できます。 http://support.microsoft.com/kb/327659/ja HTTPとして制限はないはずですが、 サーバーやクライアントのメモリ、ストレージ容量や、ネットワーク(タイムアウトなど)、人為的(長時間待ち続けられるか)の制限を受けます。 http://support.microsoft.com/kb/181050/ja

jg1wjz
質問者

お礼

taloo さん、ありがとうございます。 メモリの使いすぎ・・・なんとなくわかります。 当然、もう少し少ないtable行の場合でも、ボタンクリックした途端、処理が遅くなりますし。 1行ずつ一時フアイルに保存して・・・だとかなりの改造になります。 次期更改時には検討したいと思います。 403 HTTP ステータスコードがでるタイミングっていつなんでしょう??? 今回は表示されません。 cgiアプリに渡る前に POSTサイズ制限を超えたと判断されれば403表示になるのでしょうか? 今回は表示されないでcgiアプリに一応渡っていますので、、、 ??? POSTサイズ制限の変更、ありがとうございました。 変更できるかどうかわかりませんが、 サーバ管理者に伝えたいと思います。 有難うございました。 引き続きよろしくお願いいたします。

すると、全ての回答が全文表示されます。
回答No.2

「could not connect to server」ですか? 「could not send data to server」なら、 メッセージ内容が全く同じ事例がありますけど。 (参考) http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35892&forum=10 もし、そのメッセージの直前に「psql:」と書かれているなら、 いずれにしてもPostgreSQLデータベースサーバーが出力したもの だと思います。 というか「cgiアプリ側で、データベースのオープンすらエラー になってしまいました。」と書かれているということは、 データベースサーバが出力したエラーメッセージだということは わかっているのですよね? であれば、CGIがデータベースにどのような要求をしていて、どの要求に 対してそのエラーメッセージが出ているのかを調べればよいのでは ないでしょうか? それなのに、POSTメソッドのサイズ制限やブラウザの制限を気にして いる理由がさっぱりわかりませんでした。 Webサーバのバッファサイズの問題ではなく、CGIのデータベース アクセス処理の問題のような気がします。

jg1wjz
質問者

お礼

Lchan0211b 様、ありがとうございます。 当然参考のURLは見ました。 が、ファイルのuploadでは無いし、phpでは無いし、 データベースをアクセスする前の話しだし・・・で、却下(!)しました。^^; 最初はデータベースを疑ったのですが 現象が発生するその処理はデータベースをアクセスしないのです。 ただ、CGIアプリの作りで、先頭でDBopen、最後にDBcloseをするようになっているだけなのです。 ソースを見る(その部分は自作ではありませんので)と、 CGIアプリの先頭で行うDBオープンで失敗していました。 PQconnectdb( xxx )がCONNECTION_OKにならなくて該当エラーになっていました。 エラーメッセージは PQerrorMessageで取得したものです。 psql:の文字はありませんでした。 ログにより、PQconnectdb()に渡すIDやパスワードが環境フアイルより取得できてなくて、全てnullでopenしていました。 INIフアイルより、GetPrivateProfileString関数で取得しているだけなので、、、このような現象は初めてでした。 環境ファイルが読み込めないなんて・・・ 原因がよくわからないけれど、とりあえず固定で設定してみようと思い、 ハードコーディングでID,passwprdなどを渡すようにしたのですが、それでも結果は同じく could not connect to server: No buffer space available (0x00002747/10055) でした。(かなり焦りました!) (0x00002747/10055)・・・を調べてみたところ、windowsが出すメモリリークエラーのようなので、直接はエラーメッセージに結びつかなかったのですが、 cgiのほうを疑ったのです。 150ではうまくいくのに、200ではNGでしたし。 150と200の大きな違いはテーブルの行数、つまりPOSTの数?サイズ? と考えまして、試しに、POSTメソッドの数を減らしたら、結果としまして200でも正常に動作できたのです。400でも動作できました!(^^) ログに出力されたエラーメッセージの内容と直接結びつかないのですが、とりあえずうまく動くようになりましたので 質問させていただきました。 その後の調べで POSTでは送信サイズに制限は無い、 但し、受信側では制限があるとの情報も見つけました。 受信する側のサーバの設定で回避できるのであればと思い、 あわせて質問させていただきました。 以上、よろしくお願いします。

すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

>POSTメソッドには制限がある(128Kまで?)とのサイトを見つけました。  それは、GETの場合です。  ⇒入力フォーム編(GETとPOSTデータを受け取るには) - futomi's CGI Cafe( http://www.futomi.com/lecture/form/ )  POSTで受け取れるデータサイズは、使用しているHTTPサーバーの設定です。 IISは、マイナーなので知りませんがapacheでしたらLimitRequestBodyで制限します。  ⇒core - Apache HTTP サーバ( http://httpd.apache.org/docs/2.0/mod/core.html#LimitRequestBody )

jg1wjz
質問者

お礼

ORUKA1951 様、ありがとうございます。 GETの制限があるのは調べました。 同時にPOSTにも制限があるとの記載があったのですが、 これは間違いなのかもしれません。 apacheのHTTPサーバの設定方法は調べられました。 でもIISなのです。 引き続きよろしくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A