Закэшировать существующую рекурсивную функцию

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Закэшировать существующую рекурсивную функцию

Сообщение long399 »

Здравствуйте, уважаемые программисты! Подскажите, пожалуйста, возможно ли закэшировать рекурсивную функцию, которая возвращает очень длинную строку (html-разметку)? Данная функция находится и вызывается в представлении и принимает на вход на 2 аргумента. Пытался сделать что-то вроде этого:

Код: Выделить всё

// функция, которую надо кэшировать
function getStructure($department, $href = 0){
    $html = '';
    // промежуточные команды по формированию $html
    // в том числе с вызовом рекурсии
    $html .= getStructure($child, $count);
    ...
    return $html; // возвращение сформированной строки
}
В самой функции проблем нет, она работает правильно. Но, к сожалению, достаточно долго.

Код: Выделить всё

// вот так попытался описать функцию, которая будет кэшировать
function getCachedStructure($dept, $href)
{
    return Yii::$app->cache->getOrSet('DepartmentsStructure', getStructure($dept, $href), 60 * 60 * 24 * 7);
}

Код: Выделить всё

// вызов функции (получение результата из кэша)
echo getCachedStructure($dept, 0);
Плохо еще знаком с yii2, поэтому вероятно многое сделано неверно. Получаю ошибку: call_user_func() expects parameter 1 to be a valid callback. Помогите, если это возможно :(
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Закэшировать существующую рекурсивную функцию

Сообщение yiiliveext »

Код: Выделить всё


function getCachedStructure($dept, $href)
{
    return Yii::$app->cache->getOrSet('DepartmentsStructure', function () use ($dept, $href) {
        return getStructure($dept, $href);
    }
    , 60 * 60 * 24 * 7);
}
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Закэшировать существующую рекурсивную функцию

Сообщение long399 »

yiiliveext, спасибо большое, это то что нужно :!:
Ответить