1

CodeIgniter を使用していますが、非常に大きなフォームでパフォーマンスの問題が発生しています。データ入力に使用されるため、基本的には 1,000 フィールドに達する可能性があります (フィールドの多くは同じ値であるため、クライアント側コードのおかげで、ユーザーは 30 分未満で入力できます)。

DB から入力されたフォームを表示するのに 1 秒もかかりません。しかし、ユーザーが送信をクリックすると、DB データの代わりに POST データを取得するまったく同じコードが永遠にかかり、通常はタイムアウトします。数百のフィールド (DB に送信/挿入するのに 15 秒未満) では問題なく動作しますが、フィールドの数が 2 倍になると、突然、はるかに長い時間がかかります。

コードには 3 つの部分があります (非常に多くのフィールドに関連するすべてのロジックのために非常に長く複雑になるため、ここではコピーしません)。

  1. オブジェクト内のデータ (DB またはフォームから) を準備する
  2. を使用したフォーム検証$this->form_validation->run()
  3. DB の挿入/編集

パート 1 は、編集のために DB からデータを読み取るときに非常に高速です。データが POST から来る場合、パート 2 に到達することはないため、フォームの検証や DB 挿入の問題ではありません。

このメッセージが時々表示されるので、この問題は Codeigniter の XSS 保護に起因すると考えられます。

Maximum execution time of 90 seconds exceeded in (...)/system/core/Security.php

これらのいずれかを使用すると少し遅いかどうか知っていますか? $this->post->input('fieldname', TRUE)$this->input->post(NULL, TRUE)。Codeigniter は使用するたびに多くの計算を行うので、計算で使用する前に各投稿入力を変数に保存する必要がありますか?

別の方法として、XSS 保護を無効にすることもできますが、それは私たちの管理部分にあるためです。

それとも、まったくそうではなく、私のコードはどういうわけか貧弱ですか?

4

2 に答える 2

1

問題が解決しました!基本的に、コントローラーの最初にこれを追加しました:

if($this->input->post(NULL,TRUE)) $hasPOST = true;
else $hasPOST = false;

そして、すべてのインスタンスを に置き換えましif($this->input->post(NULL,TRUE)) {do some stuff}if($hasPOST) {do some stuff}

送信に 1 秒もかかりません...if($this->input->post(NULL,TRUE))投稿データがあるかどうかを確認するために使用する際の問題は、codeigniter が毎回すべてのフィールドで xss クリーニングを実行することでした。

于 2013-05-15T11:18:33.860 に答える
0

ユーザー シナリオをもう一度見てみましょう。1000 個の値すべてを一度に送信する必要は本当にありますか? または、ユーザー向けの複数ステップのプロセスに分割できますか。私には多くのデータが処理されているようです。

チョーク ポイントがどこにあるかを確認するためにスクリプトの時間を計ります。codeIgniter とは関係ないかもしれませんが、純粋に大量のフィールドを送信しようとしているからです。

于 2013-05-15T10:53:37.377 に答える