QForm: Сериализация исчерпывает память после нескольких обратных передач

0

У меня есть проблема с формой, содержащей много динамически созданных элементов формы с прикрепленными Server-Actions. После нескольких postbacks я получаю смертельную ошибку исчерпанной памяти. Метод Serialize QForm потребляет много мегабайт. Кажется, что состояние формы растет с каждой обратной передачей до тех пор, пока она не станет такой большой, что serialize() выкидывает фатальную ошибку исчерпания памяти. Почему он растет? Количество элементов формы всегда одинаково...

У вас есть какие-либо советы?

чем раньше,

январь

  • 0
    Можете ли вы поделиться кодом в вашем файле конфигурации? Какую версию QCubed вы используете? Это становится полезным, если вы предоставляете общий доступ к используемому FormStateHandler и соответствующей конфигурации.
  • 0
    Привет, Вайбхав, я настроил FormStateHandler следующим образом: public static $ FormStateHandler = 'QSessionFormStateHandler'; Я использую QCubed Development Framework 2.1. Выпуск разработки. В файле configuration.php я коснулся: define (' DOCROOT ', '/ var / www'); define (' VIRTUAL_DIRECTORY ', ''); define (' SUBDIRECTORY ', '/ Raumplan2013'); Надеюсь, информации достаточно. Спасибо за помощь, Ян
Показать ещё 1 комментарий
Теги:
qcubed

1 ответ

0

Я думаю, проблема заключается не в том, что FormState растет. Я думаю, что эта сессия растет. Дело в том, что, когда вы продолжаете делать postbacks или открываете новые страницы, создается новый FormState. Этот FormState сохраняется в вашем сеансе PHP (вы используете QSessionFormStateHandler). В один момент времени общий размер всех FormStates может стать настолько большим, что PHP не сможет справиться с этим в данных сеанса. Это происходит потому, что PHP имеет параметр, который ограничивает объем памяти, который потребляет каждый сценарий/запрос/запрос (и это хорошо).

В большинстве случаев PHP будет жаловаться на это, сообщая, что память была исчерпана. Причина этого в том, что: когда вы запускаете/вызываете скрипт, происходят следующие вещи:

  1. Сначала PHP загружает информацию о сеансе пользователя.
  2. PHP продолжит выполнение скрипта.
  3. PHP выполняет команды и продолжает выделять больше памяти, если это необходимо.
  4. PHP завершает выполнение

В вашем случае данные сеанса будут продолжать расти до тех пор, пока он не начнет потреблять достаточно памяти, что PHP не может работать, выделяя новые переменные в пределах установленных ограничений памяти (шаг 3 не работает).

У вас есть два решения:

  1. Используйте другой FormStateHandler. Я бы рекомендовал использовать QDbBackedFormStateHandler, чтобы поддерживать файловую систему в чистоте. Использование другого FormStateHandler гарантирует, что ваши данные сеанса отделены от данных FormState, и все FormStates сохраняются отдельно (либо в файле, либо как отдельная запись в БД), и гарантирует, что бесполезные FormStates не будут собраны в вашем сеансе.

  2. Увеличьте ограничение на PHP для каждого сценария. Это решение не рекомендуется, и вы должны использовать его только как временное решение.

Кроме того, могут быть случаи, когда вы объявили временную переменную в своей форме или один из дочерних элементов управления, который продолжает расти. Учти это:

<?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, и это в конечном итоге приведет к сбою страницы. Если объекты являются элементами управления, это еще более серьезная проблема.

Надеюсь, это поможет.

  • 0
    Спасибо, обратно на работу попробую. Я опубликую свои выводы ...
  • 0
    Здравствуйте, я настроил использовать QDbBackedFormStateHandler, но теперь он использует gzuncompress (): ошибка данных после 5 обратных передач ... Закомментируя части сжатия / распаковки, он прерывается при сериализации.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню