この種の負荷は、各フィールドに含まれると予想されるデータの量、または各フィールドに含まれると判断したデータの最大量に応じて、確かに管理可能です。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
フォーム フィールド データがクリアされ、フォームに再びアクセスしたときにすべてのフィールドが空になり、新しいデータ入力のために読み込まれます。