2015-01-08 3 views
0

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

У вас есть совет?

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

Jan

+0

Можете ли вы поделиться кодом в файле конфигурации? Какую версию QCubed вы используете? Это становится полезным, если вы используете совместно используемый FormStateHandler и связанную с ним конфигурацию. –

+0

Привет Vaibhav, я сконфигурировал FormStateHandler следующим образом: public static $ FormStateHandler = 'QSessionFormStateHandler'; Я использую QCubed Framework развития 2.1 Release развития В configuration.php я прикоснулся: определить ('__DOCROOT__', '/ вар/WWW'); define ('__VIRTUAL_DIRECTORY__', ''); define ('__SUBDIRECTORY__', '/ Raumplan2013'); Надеюсь, что информации достаточно. Спасибо за вашу помощь, Jan –

+0

Вы можете проверить ответ, который я опубликовал, и сообщить мне, разрешает ли он проблему. –

ответ

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 обратных передач ... Комментируя сжатие/распаковывание деталей, он прерывается при сериализации. –

+0

Насколько велика ваша QForm? Примерно, сколько КБ? Из руководства PHP: 'Функция вернет ошибку, если несжатые данные превышают длину сжатых входных данных более чем на 32768 или больше, чем необязательная длина параметра.' –

Смежные вопросы