3

変数を PHP に取り込む従来の $_POST メソッドについては知っています。ただし、変数の数が非常に多い場合でも、変数を渡す最も効果的なソリューションはありますか?

現在私のコードでは、ユーザーは 100 以上の入力テキストに情報を入力し、この情報は $_POST メソッドを使用して PHP に渡されます。ただし、これは多くのサーバーでうまくいくとは思いません。

基本的に、大量の変数をサーバーに渡す理想的な方法を誰かが教えてくれれば、それは素晴らしいことです。前もって感謝します。

編集:

それは単にUIの惨事になると言っているすべての人にとって、それは何度も相談されてきたものです. ただし、送信ページは本質的にウェブサイトの中心であり、大量の入力によってユーザーが思いとどまらない理由があります。実際、デフォルトの数は 20 ですが、リストは 100 の入力に拡張できます。ユーザーのために実装されたオプション。

すべての建設的な回答に感謝します。非常に役に立ちます。

4

6 に答える 6

2

いくつかのステップに分割されたフォームによって、いくつかの要求に分割する方がよいのではないでしょうか?

ユーザーに 100 個のフィールドを表示することは、ユーザー エクスペリエンスの観点からは非常に良くないように思えます。多段化してはどうですか?ユーザーへの負担が少なくなり、サーバー側の観点からも管理しやすくなります。

ユーザーが誤ってウィンドウを閉じたり、インターネット接続が失われたり、その他の問題が発生したりして、データがサーバーに送信されなかったとします。100 個の入力フィールドを完了した後でそれが起こったら、おそらくそのページを離れて二度と戻ってこないでしょう。

パフォーマンスの観点からは、大きな違いはないと思いますが、とにかく別のアプローチを取ることを強くお勧めします.

于 2012-08-19T19:26:04.213 に答える
2

この種の負荷は、各フィールドに含まれると予想されるデータの量、または各フィールドに含まれると判断したデータの最大量に応じて、確かに管理可能です。PHP では、HTTP POST リクエストの本文 (フォーム エンコードされた値を含む部分) の最大サイズはini 値post_max_sizeによって決まります。デフォルトは 2MB ですが、次のように変更できますphp.ini

post_max_size = 10M # megabytes

またはあなたの.htaccess

php_value post_max_size 10M

システムで使用可能な RAM の量を超えてはならないため、これを設定するときは注意してください。また、複数のユーザーがこのページを要求している可能性があることも考慮してください。各ユーザーが要求に大量の RAM を割り当てた場合、サーバーがハングまたはクラッシュする可能性があります。

ただし、ここで数学を考えてみましょう。それぞれに 20 バイトのフィールドが 100 個あったとしても、それはわずか 2000 バイト、つまり約 2 KB になります。かなり遅い 1 Mbps のアップロード速度でも、ユーザーは 1 秒あたり 128 KB をアップロードできます。この速度では、アップロード プロセスに 1 秒かかるには、100 フィールドのそれぞれに 1311 バイトのデータが含まれている必要があります。

Apache では、デフォルトのタイムアウトは 300 秒であるため、Apache がタイムアウトになる前に、フォーム フィールドに合計で 37.5 MB が含まれている必要があります。この設定は、ホスト (またはサーバー管理者) によってわずかに変更される可能性があり、おそらく 30 秒などのより適切な値に設定されます。しかし、それでもこの制限では、3.75 MB のデータが必要になります。これは、100 フィールドに含めることができる量をはるかに超える可能性があります。

クライアント側についても心配する必要はありません。最もけちなブラウザ (IE) でさえ、POST アップロードを 2 GB に制限しているためです。

基本的に、ここでのポイントは、接続が遅くても、HTTP とサーバーは多くのフィールドを十分に処理できるということです。PHP がそれらすべてを解析するのにどれくらいの時間がかかるかはわかりませんが (サーバー上でベンチマークする必要があります)、影響は無視できると思います。

ユーザーの立場からすると、100 フィールドというのはかなり気が遠くなるような光景だと思います。可能であれば、フォームをユーザーがフォームに入力するプロセスを順を追って説明する、より親しみやすく小さなステップに分割することをお勧めします。フォームをステップに分割したくない場合は、少なくともフォームの状態を javascript で保存することを検討してください。W3C では に 5MB のストレージ スペースを推奨しているためlocalStorage、これはすべてのフィールドを保存するのに十分なスペースであることに注意してください。Cookie を使用するこのフォールバックも見てください。Cookie には より多くの制限がありlocalStorageます。Cookie はそれぞれ 4KB に制限されており、ドメインごとに 20 個の Cookie に制限されていることを読みました. 保存されたフォーム フィールドを複数の Cookie に分散させたい場合があります。たとえば、10 個の Cookie に 10 個のフォーム フィールドを格納します。次を使用して、複数の入力値を Cookie に保存できますencodeURIComponent()

var inputs = document.forms[0].getElementsByTagName('input')
    i      = 0,
    date   = new Date(),
    expires;

// Expires date (1 day in future)
date.setTime(date.getTime()+(24*60*60*1000));
expires = date.toGMTString();

for(var cookieNumber = 0; cookieNumber < 10; cookieNumber++) {
    var cookie = [];
    for(; i < (cookienumber * 10 + 10); i++) {
        cookie.append(encodeURIComponent(inputs[i].name) + '=' + encodeURIComponent(inputs[i].value));
    }

    document.cookie = 'savedForm' + cookieNumber + '=' + cookie.join('&') + '; expires =' + expires;
}

ユーザーが入力したとおりにすべてが保存されるようにするには、保存されているデータを更新するonchangeか、2 回目の保存が必要な場合はonkeyup.

また、ユーザーにとってもう 1 つの利便性として、フォームが送信されると、保存されたすべての Cookie とlocalStorageフォーム フィールド データがクリアされ、フォームに再びアクセスしたときにすべてのフィールドが空になり、新しいデータ入力のために読み込まれます。

于 2012-08-19T19:59:31.990 に答える
1

あなたは間違いなく UX の問題を制御下に置いています。さもないと、ユーザー エクスペリエンスでこの質問をすることになるでしょう。

パフォーマンスの観点から、このデータを渡すためのいくつかの戦略を考えてみましょう。

1. HTTP POST (変数はapplication/x-www-form-urlencodedとして渡されます)

提出物の合計サイズは簡単に予測できますが、フォームの内容によって異なります。選択とチェックボックスだけを使用している場合、または整数またはブール値を含む隠し変数を使用している場合、100 個の要素が、たとえば 2KB のデータに変わる可能性があります。2KB のデータを渡すのにどれくらいの時間がかかりますか? 長くない。明らかに、テキスト フィールドは状況を変化させますが (私たちではなく、あなたが予測できる方法でも)、おそらくそれほど大きくはありません。エンコードされた文字列var=Pack+my+box+with+five+dozen+liquor+jugsは 44 文字です。それらの 100 では、アップロードするデータが 5KB 未満しか生成されません。アナログ モデムの速度 (たとえば、28.8Kbps または 2.8KB/s) でも、それはほんの数秒です。そして、添付ファイルは次の戦略へと私たちを動かします。

2. HTTP POST ( multipart/form-dataとして渡される変数)

ファイルをアップロードする場合はこれを使用しますが、それ以外の場合はおそらく使用しません。フォームを使用して 4MB の JPEG 画像を 100 個アップロードする場合は、JavaScript ベースのバックグラウンド アップローダーを実装して効率化することをお勧めします。ユーザーが次のファイルを検索している間にアップロードが行われるようにします。それ以外では、この形式のオーバーヘッドの総量はx-www-form-urlencoded の場合よりも大幅に大きくなりますが、添付ファイルのサイズと比較するとオーバーヘッドは無視できる可能性があります。

3. HTTP GET (HTTP リクエストの一部として渡される変数)

これは基本的に、URL の末尾にタグ付けされたx-www-form-urlencoded文字列です。#1を参照してください。

考慮すべきもう 1 つの主要な要素は、このフォームをどれだけ迅速に処理できるかです。アップロード時間は短いかもしれませんが、各フォーム要素が 3 秒のデータベース アクセスと処理を必要とする場合、フォームが送信された後、アイテムが 100 あると 5 分間待機します。フォームのコンテンツが何であるか、またはここで実際に達成しようとしていることを知らなければ、「これを検討してください」と言う以外に、この問題についてアドバイスを提供することはできません.

于 2012-08-19T19:59:19.063 に答える
0

$_POST 配列の一部として利用できる POST リクエストを使用してデータを渡す標準的な方法は、まったく問題ありません。この方法では、送信できるデータ量の上限が非常に高くなります。

より柔軟なものが必要な場合は、最初にデータをシリアル化して送信し、次にhttp_get_request_body()を使用してこのデータを取得できます。しかし、それは必要ありません。あなたが説明しているシナリオでは、フォームはまったく問題ありません。

于 2012-08-19T19:30:00.730 に答える
0

100点なら大した問題にはなりません。ただし、「[]」を使用して入力フィールドをグループ化できます

したがって:

Apple
<input type='checkbox' name='fruity[]' value='apple'>

Pear
<input type='checkbox' name='fruity[]' value='pear'>

Banana
<input type='checkbox' name='fruity[]' value='banana'>

そしてバナナとナシにチェックを入れたら提出。その結果、

$_POST = array( 
  0 => fruity => array ( 
    0 => 'pear', 
    1 => 'banana'
   ) 
 )
于 2012-08-19T19:30:22.487 に答える
0

MVC コンセプトなどの ajax リクエストを介して投稿する xml 変数を使用できます。まず、xml 変数のマウントを設定します。次に、この xml 変数をテキストとして投稿します。ajax リクエストを介して PHP 投稿を表示すると、モデル php は xml テキスト データを受け取り、xml クエリでそれを分解して、同じ量の変数を取得します。

于 2015-02-21T15:31:36.673 に答える