0

サーバーアクションが添付された動的に作成されたフォーム要素を多数含むフォームに問題があります。いくつかのポストバックの後、致命的なメモリ不足のエラーが発生します。QForm の Serialize メソッドは大量のメガバイトを消費します。ポストバックごとにフォームの状態が大きくなりすぎて、serialize() が致命的なメモリ不足エラーをスローするようです。なぜ成長しているのですか?フォーム要素の量は常に同じです...

何かアドバイスはありますか?

事前に感謝します、

1月

4

1 に答える 1

0

問題は FormState が大きくなることではないと思います。成長するセッションだと思います。つまり、ポストバックを行ったり、新しいページを開いたりすると、新しい FormState が作成されます。この FormState は PHP セッションに保存されます (QSessionFormStateHandler を使用しています)。ある時点で、すべての FormState の合計サイズが大きくなりすぎて、PHP がセッション データでそれを処理できなくなることがあります。これは、各スクリプト実行/リクエストが消費するメモリ量を制限する設定が PHP にあるために発生します (これは良いことです)。

ほとんどの場合、PHP はメモリが使い果たされたと報告することで、それについて文句を言います。これが発生する理由は次のとおりです。スクリプトを実行/呼び出すと、次のことが起こります。

  1. PHP は、最初にユーザー セッション情報を読み込みます。
  2. PHP はスクリプトの実行を続行します。
  3. PHP はコマンドを実行し、必要に応じてさらにメモリを割り当てます。
  4. PHP は実行を終了します

あなたの場合、セッション データは、PHP が設定されたメモリ制約内で新しい変数を割り当てることができないほど十分なメモリを消費し始めるまで増加し続けます (ステップ 3 は失敗します)。

次の 2 つの解決策があります。

  1. 別の FormStateHandler を使用してください。ファイルシステムをクリーンに保つために QDbBackedFormStateHandler を使用することをお勧めします。別の FormStateHandler を使用すると、セッション データが FormState データから分離され、すべての FormState が個別に (ファイルまたは個別の DB エントリとして) 保存され、不要な FormState がセッションで収集されないようになります。

  2. PHP のスクリプトごとのメモリ制限を増やします。この解決策は推奨されません。一時的な解決策としてのみ使用してください。

また、フォームで一時変数を宣言した場合や、成長し続ける子コントロールの 1 つを宣言した場合もあります。このことを考慮:

<?php
// We are inside the definition of a control/panel/form
$this->arrObj_TempEntries = array();

// ... using the above variable somewhere inside an event handler:
public function btnRefreshHandler($strFormId, $strControlId, $strParameter) {
    // Assume $arrObj_NewEntries is already populated with some objects
    foreach($arrObj_NewEntries as $objNewEntry){
        array_push($this->arrObj_TempEntries, $objNewEntry);
    }
}
// ... rest of the stuff
?>

この場合、値は$this->arrObj_TempEntries増加し続けます。これは、古いエントリが消去されず、FormState が非常に大きくなり、最終的にページがクラッシュするためです。オブジェクトがコントロールの場合、さらに大きな問題になります。

これが役立つことを願っています。

于 2015-01-09T10:00:23.467 に答える