Я предполагаю, что проблема не в том FormState растет. Я думаю, что это сеанс, который растет. Дело в том, что, когда вы продолжаете делать postbacks или открываете новые страницы, создается новый FormState. Этот FormState сохраняется в вашем сеансе PHP (вы используете QSessionFormStateHandler). В один момент времени общий размер всех FormStates может стать настолько большим, что PHP не сможет справиться с этим в данных сеанса. Это происходит потому, что PHP имеет параметр, который ограничивает объем памяти, который потребляет каждый сценарий/запрос/запрос (и это хорошо).
В большинстве случаев PHP будет жаловаться на это, сообщая, что память была исчерпана. Причина этого в том, что при запуске/вызове сценария происходят следующие события:
- PHP сначала загружает информацию о сеансе пользователя.
- PHP продолжит выполнение скрипта.
- PHP выполняет команды и при необходимости выделяет больше памяти.
- PHP заканчивает исполнения ордеров
В вашем случае, данные сессии будут продолжать расти, пока она не начинает потреблять достаточное количество памяти, что PHP не может работать выделять новые переменные в пределах ограничений набора памяти (шаг 3 не удается).
У вас есть два решения:
использовать другой FormStateHandler. Я бы рекомендовал использовать QDbBackedFormStateHandler, чтобы поддерживать файловую систему в чистоте. Использование другого FormStateHandler гарантирует, что ваши данные сеанса отделены от данных FormState, и все FormStates сохраняются отдельно (либо в файле, либо как отдельная запись в БД), и гарантирует, что бесполезные FormStates не будут собраны в вашем сеансе.
Увеличьте ограничение памяти 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 и что в конечном итоге врезаться страница. Если объекты являются элементами управления, это еще более серьезная проблема.
Надеюсь, это поможет.
Можете ли вы поделиться кодом в файле конфигурации? Какую версию QCubed вы используете? Это становится полезным, если вы используете совместно используемый FormStateHandler и связанную с ним конфигурацию. –
Привет Vaibhav, я сконфигурировал FormStateHandler следующим образом: public static $ FormStateHandler = 'QSessionFormStateHandler'; Я использую QCubed Framework развития 2.1 Release развития В configuration.php я прикоснулся: определить ('__DOCROOT__', '/ вар/WWW'); define ('__VIRTUAL_DIRECTORY__', ''); define ('__SUBDIRECTORY__', '/ Raumplan2013'); Надеюсь, что информации достаточно. Спасибо за вашу помощь, Jan –
Вы можете проверить ответ, который я опубликовал, и сообщить мне, разрешает ли он проблему. –