2 бесплатных плагина + одно предложение по улучшению livestreet

Сегодня хочу поделиться с сообществом двумя плагинами — для организация сгруппированной рассылки увеломлений, для сервиса loginza — для ls 1.0. Думаю они будут полезны многим. Плюс хочу предложить одно улучшение движка, что бы можно было запускать кроны на длительное время. А то с текущей версией движка они падают занимая всю отведенную для этого память.

Первый плагин — группировка отправляемых уведомлений. Предназначен для того, что бы пользователь получал не по одному уведомлению, а все вместе за определенный период например за сутки — выглядит солиднее. Да и пользователю, как-то проще ремонтироваться по одному письму вместо 10.

Плагин я разместил в каталоге после модерации он будет доступен вот по этой ссылке. А до модерации его можно скачать на моей странице с плагинами.

Что бы заставить его работать нужно сделать следующее в файле config.local.php прописать что отправка сообщений будет проводиться при помощи крона.

$config['module']['notify']['delayed'] = true;


После этого уведомления будут не сразу отправляться, а складываться в базу данных. Что бы сообщения отправлялись нужно будет создать крон способный запускать один php файл.

Вот пример команды для крона:
/usr/bin/php site_path/plugins/empnotify/classes/crons/send.php


Запускать его стоит раз в сутки. После этого раз в сутки человек будет получать всего одно письмо со списком всего, что случилось на сайте. И если у вас уже прописан стандартный крон для отправки сообщений, уберите его.

Второй плагин для сервиса loginza. У них есть уже готовый плагин, но он рассчитан на версию 0.4.2. И немного криво работает с версией 1. Я его довел до состояния когда он может работать с последней версией. Плюс еще сделал, что бы пользователь после авторизации при помощи loginza возвращался на страницу где он начал авторизацию, вместо главной страницы. Скачать его можно так же на моей страницы с плагинами.

Его достаточно просто использовать. Нужно скачать и распаковать архив и в конфиге плагина прописать нужные данные, которые вы получаете от сервиса loginza.

Теперь на счет улучшения движка. У меня есть кроны, которые выполняются достаточно долго. И после перехода на последнюю версию они стали жаловаться на то, что им не хватает памяти. Всему виной была строка № 197 в фале \engine\lib\internal\ConfigSimple\Config.class.php.


if(preg_match('~___([\S|\.|]+)___~Ui',$cfg))
				$cfg = preg_replace_callback(
					'~___([\S|\.]+)___~Ui',
					create_function('$value','return Config::Get($value[1],"'.$sInstance.'");'),
					$cfg
				);


В ней создается замыкание. Но вот не задача, при таком способе происходит утечка памяти так, как память из под созданной функции не высвобождается. Об этом я узнал немного покопавшись в сети.

Предлагаю внести следующие изменения.
1) Добавить в класс Config переменную $configClosure
/**
     * Массив обратных вызовов для сущностей класса для функции KeyReplace
     * @var array
     */
    static private $configClosure=array();

2) Добавить в этот же класс новый метод
static private function getClosureForConfig($sInstance=self::DEFAULT_CONFIG_INSTANCE)
    {
        if(array_key_exists($sInstance,self::$configClosure))
        {
            return self::$configClosure[$sInstance];
        }
        $returnValue=create_function('$value','return Config::Get($value[1],"'.$sInstance.'");');
        self::$configClosure[$sInstance]=$returnValue;
        return $returnValue;
    }

3) Заменить строку 197 на следующею строку
if(preg_match('~___([\S|\.|]+)___~Ui',$cfg))
            {
                $function=self::getClosureForConfig($sInstance);
				$cfg = preg_replace_callback(
					'~___([\S|\.]+)___~Ui',
                    $function,
					$cfg
				);
            }


Это позволит избежать утечек памяти.

15 комментариев

avatar
Добавить в класс Config переменную $configClosure
это вы типа кеширования вызовов сделали?
avatar
1. но вы ведь все равно используете анонимную ф-ю? в чем разница?

2. а это вопрос уже более тонкий к ort
почему сначала одно перечисление \S|\.|, а потом уже \S|\., т.е. без ещё одного «ИЛИ»?
if(preg_match('~___([\S|\.|]+)___~Ui',$cfg))
                                $cfg = preg_replace_callback(
                                        '~___([\S|\.]+)___~Ui',
                                        create_function('$value','return Config::Get($value[1],"'.$sInstance.'");'),
                                        $cfg
                                );
avatar
Да создается, но лишь однажды. А не каждый когда вызывается функция Get у конфига.
avatar
но а если значение поменялось, как обновится тогда кеш?
avatar
А функция в принципе не меняется. Так, что кеш не нужно обновлять. И да с функцией было бы наверное проще. Но задачу нужно было решать быстро поэтому так и сделал.
avatar
А функция в принципе не меняется.
нет, вы не совсем поняли — если значение в конфиге изменится, как кеш обновлять в таком случае?
avatar
лучше убрать кеширование и вместо анонимной ф-и сделать нормальную и вызывать её.
т.к. кеш не обновляется в таком случае
avatar
Можно подробнее про Loginza?
avatar
А, что именно интересует. Этот плагин у меня на сайте работает. Задавайте вопросы я вам отвечу.
avatar
Что именно и где необходимо прописать?
avatar
В файле конфига модуля нужно прописать нужно прописать следующие переменные.


/*
 * Язык в виджете: eng, ukr, rus и тп. Если пусто, то авто определение языка
 */
$config['widget']['lang'] = 'rus';
/*
 * Набор провайдеров через запятую которые будут показаны в виджете.
 * Порядок в списке соответствует порядку в виджете.
 */
$config['widget']['providers'] = 'vkontakte, odnoklassniki,livejournal,mailru,facebook,google,yandex,twitter';

/**
 * Настройки безопастности авторизации Loginza
 * Требуются для более безопастной проверки token loginza (защита от подмены)
 */
/*
 * ID виджета (доступен после регистрации сайта в личном кабинете на http://loginza.ru)
 * Если пусто, то защита не используется
 */
$config['loginza']['id'] = '';
/*
 * Секретный ключ (доступен после регистрации сайта в личном кабинете на http://loginza.ru)
 */
$config['loginza']['skey'] = '';


Самые важные их них skey и id — они выдаются при регистрации или их можно найти в настройках виджета логинза для своего сайта. providers — список кнопок которые вы хотите видеть у себя на виджете. Их полный список можно посмотреть здесь.

Ставите себе этот плагин прописываете эти значения и у вас появляется виджет логинза
avatar
Все прописал! А при авторизации, например через вконтакт выдает это:
«Не передан идентификатор авторизации либо авторизация устарела. Повторите попытку.»
avatar
В личку напиши url сайта :)
avatar
мне вот стало интересен 1 плагин!
Запускать его стоит раз в сутки.
Я немного не понял каким образом его запускать? можно ли сделать данный процесс автоматически?
avatar
да неплохо бы виде крона сделать запуск.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.