PDA

Просмотр полной версии : BE прожорлив? Теперь я знаю почему!


dmartynenko
18.10.2011, 15:37
Возникла проблема с BE TYPO3 4.1.хх (да-да, приходится использовать еще и таких старичков). При просмотре в режиме List страницы с пользователями перестала открываться страница - вместо обычного табличного представления просто пустая страница. И никаких ошибок которые могли бы намекнуть на проблему.

В результате отладки кода class.db_list_extra.inc нашлась интересная функция makeRef() которая вызывает такой код:
// Look up the path:
$rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
'*',
'sys_refindex',
'ref_table='.$GLOBALS['TYPO3_DB']->fullQuoteStr($table,'sys_refindex').
' AND ref_uid='.intval($uid).
' AND deleted=0'
);

То есть загружаются все записи для пользователя из sys_refindex. Для первого пользователя из списка fe_users она загружала 3500 записей. На втором (более активном) память заканчивалась и выполнение скрипта аварийно обрывалось (лимит памяти стоит 512 MB !).

Так много записей накопилось благодаря эксту loginusertrack. Причем удаление экста не помогло, так как записи sys_refindex остались и после его удаления.

А самое интересное, что функция makeRef() по сути объединяет список получаемых записей в одну строку и возвращает только лишь первые 100 (!!!) символов получившейся строки:
return count($infoData) ? '<a href="#" onclick="'.htmlspecialchars('top.launchView(\''.$table.'\', \''.$uid.'\'); return false;').'" title="'.htmlspecialchars(t3lib_div::fixed_lgd(implode(' / ',$infoData),100)).'">'.count($infoData).'</a>' : '';

PS: Работа над оптимизацией BE ведется, и эта функция deprecated since 4.4, will be removed in TYPO3 4.6 - Use createReferenceHtml() instead. А вот createReferenceHtml() делает то же самое что и makeRef(), но загружает только первые 20 записей, а не все сразу.