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

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

Есть ли какой-нибудь совет?

спасибо заранее,

январь

0

Решение

Я думаю, проблема не в том, что FormState растет. Я думаю, что это сессия, которая растет. Дело в том, что когда вы продолжаете делать постбэки или открывать новые страницы, создается новый 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]