1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Перестроить кэш пользователей автоматически

Тема в разделе "Основные вопросы по XenForo", создана пользователем evolution, 17.09.2011.

Загрузка
  1. evolution

    evolution Пользователь

    Регистрация:
    05.09.11
    Сообщения:
    14
    Симпатии:
    2
    тоже не помог... по прежнему
    работает, а вот планировщик, хоть и создается без проблем, хоть и исполняется вроде, но даже со static - толку ноль.
     
  2. evolution

    evolution Пользователь

    Регистрация:
    05.09.11
    Сообщения:
    14
    Симпатии:
    2
    в общем после многочисленных ковыряний была сделана простая проверка, логирование хода исполнения в файл.

    library/AutoRebild/Rebild.php :
    PHP:
    <?PHP

    class AutoRebild_Rebild
        
    {
            public static function 
    go()
            {
                
    $options = array(  'batch' => 100 );
                
    $position 0;
                
    $log fopen("log.php","a+");
                
    fwrite($log,date("l dS of F Y h:I:s A").'<br>\n');
                
    $rebuilder XenForo_CacheRebuilder_Abstract::getCacheRebuilder('User');
                do
                {
                    
    $position $rebulder->rebuild($position$options'');

                    if (
    $position === true)
                    {
                        break;
                    } else {
                        
    fwrite($log," ... $position");
                    }

                } while (
    $position);
                
    fwrite($log,"<br>\n");
                
    fclose($log);
            }
        }

    В итоге оказалось, что метод класса в принципе не запускается! Лог пустой!
    Напомню, задание планировщика звучит так:
    Помогите, как создать задание планировщика?
     
    Mr. Brightside нравится это.
  3. Mr. Brightside

    Mr. Brightside Read only

    Регистрация:
    17.02.11
    Сообщения:
    156
    Симпатии:
    58
    "Рэбьюата"! :eek:

    Оказывается что. Оно кеширует значения кастом полей пользователя в таблице с юзерами в аццких BLOB-массивах, которые никак не раздупляюццо :cry:. Спрашивается на кой черт я писал 4 страницы регулярки, чтобы достать контент за 3-9 земель и ложить в специально предназначенную для этого таблицу. Труба дело. Завтра надо чтобы было готово :(

    Как запустить на крон этот гребаный "Rebuild User Data"?
    --- добавлено : Dec 7, 2011 4:33 PM ---
    PHP:
    <?php
     
    class Shop_Listener
     
    {
     
    public static function 
    rebuild()
        {
            
    $position "0";
            
    $options['batch'] = isset($options['batch']) ? $options['batch'] : 75;
            
    $options['batch'] = max(1$options['batch']);
     
            
    /* @var $userModel XenForo_Model_User */
            
    $userModel XenForo_Model::create('XenForo_Model_User');
     
            
    /* @var $conversationModel XenForo_Model_Conversation */
            
    $conversationModel XenForo_Model::create('XenForo_Model_Conversation');
     
            
    $userIds $userModel->getUserIdsInRange($position$options['batch']);
            if (
    sizeof($userIds) == 0)
            {
                return 
    true;
            }
     
            
    XenForo_Db::beginTransaction();
     
            foreach (
    $userIds AS $userId)
            {
                
    $position $userId;
     
                
    /* @var $userDw XenForo_DataWriter_User */
                
    $userDw XenForo_DataWriter::create('XenForo_DataWriter_User'XenForo_DataWriter::ERROR_SILENT);
                if (
    $userDw->setExistingData($userId))
                {
                    
    $userDw->set('alerts_unread'$userModel->getUnreadAlertsCount($userId));
                    
    $userDw->set('conversations_unread'$conversationModel->countUnreadConversationsForUser($userId));
                    
    $userDw->save();
                    
    $userDw->rebuildUserGroupRelations();
                    
    $userDw->rebuildPermissionCombinationId();
                    
    $userDw->rebuildDisplayStyleGroupId();
                    
    $userDw->rebuildCustomFields();
                }
            }
     
            
    XenForo_Db::commit();
     
            
    $detailedMessage XenForo_Locale::numberFormat($position);
     
            return 
    $position;
        }
    }
    Выполняет ребилд кеша пользователей :eek: Что к чему рыба мля. В общем у меня это отдельный аддон по вот тому мануалу, который я ранее начертил (там раньше эквид был прикручен). Взял листенер (там была одна функция, я ее заменил на эту), вырубил параметры, оставил пустые кавычки, дописал слово статик, убрал абстракт какой-то гадости после декларации класса, апосля вписал $position = "0", который нужен для выполнения. Поставил на крон. Немного погодя из
    Код:
          $userDw->set('alerts_unread', $userModel->getUnreadAlertsCount($userId));
     
                    $userDw->set('conversations_unread', $conversationModel->countUnreadConversationsForUser($userId));
     
                    $userDw->save();
     
                    $userDw->rebuildUserGroupRelations();
     
                    $userDw->rebuildPermissionCombinationId();
     
                    $userDw->rebuildDisplayStyleGroupId();
     
                    $userDw->rebuildCustomFields();
    оставил только
    Код:
                    $userDw->rebuildCustomFields();
    Для тех, кому было лень читать: вышеуказанное стоит на кроне каждые пол часа (чистится тока кеш кастом-полей и ничего более) и всё, работает мой, надеюсь, и ваш самопальный хак :)
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если не ошибаюсь, то там ребилд кастомных полей в ребилде пользователей сидит. Да, достаточно было просто вытащить из пользователя нужный метод, переписать его под себя и все. Ну и оформить это все в виде плагина, чтобы было другим полезно :)
     
  5. Mr. Brightside

    Mr. Brightside Read only

    Регистрация:
    17.02.11
    Сообщения:
    156
    Симпатии:
    58
    Так я бы с радостью, мне совсем не сложно, вот только в архитектуре я не разбираюсь совсем. То, что мне удается каждый раз выстрадать, получается из-за интуитивных потуг и кое-какого опыта. Оформить плагин я не смогу. Я объяснил, если кому надо, пускай задают вопросы, ну или пускай кто-нить сделает
     
    infis нравится это.

Поделиться этой страницей