показать полностью
Пользователь 16183  -> Всем
22 Декабрь, 2015 6:17
Свои счетчики конверсии
Не так давно появился модуль Конверсии позволяющий показывать отчеты по тому сколько целевых действий на вашем сайте сделали пользователи.

Но увы этот модуль в базовой поставке знает только модули "Реклама, баннеры", "Блоги", "Форум", "Интернет-магазин".

Ну, а если нам это не интересно? А если у нас на сайте есть другие целевые действия которые мы хотим отлавливать и анализировать?

Давайте сделаем свои счетчики конверсии.

Для этого нам надо сделать ряд не сложных действий:

Создать свой модуль в папке /bitrix/modules/.
На момент написания данной статьи есть одно существенное ограничение. Модуль конверсий может подключить к себе только модули которые лежат в папке /bitrix/modules/ и только модули в имени которых нет ни точек ни каких либо других символов. (Соответствующее обращение уже отправлено в саппорт, обещают поправить)

Например сделаем модуль для подсчета количества отправленных телефонов с формы обратной связи. Назовем его просто phone

Базовая структура файлов у нас будет такой:

/phone/
/phone/install/index.php
/phone/install/version.php
/phone/lang/ru/install/index.php
/phone/lib/
/phone/include.php

Стандартная структура модуля, с самым стандартным содержимым.
Модуль положили в папку /bitrix/modules.

Написать свои обработчики событий.

В папке /phone/lib/ создадим к примеру папку internals/ и в ней файл с нашим классом phoneconversion.php

В этом файле мы опишем класс который будем отвечать за подсчет конверсии.

Первый метод onGetCounterTypes(). Он определяет какие счетчики у нас будут.
public static function onGetCounterTypes()
{
   return array(
      'phone_add'  => array('MODULE' => 'phone', 'NAME' => 'Количество телефонов да все время'),
      'phone_add_day'  => array('MODULE' => 'phone', 'GROUP' => 'day', 'NAME' => 'Количество телефонов за день')
    );
}
Второй метод onGetRateTypes(). Он уже формирует подсчет количества целевых действий и отображение информации о них на странице пульса конверсии.
public static function onGetRateTypes()
{
   $scale = array(0.5, 1, 1.5, 2, 5);

   return array(
      'phone_add' => array(
         'NAME'      => 'Количество телефонов',
         'SCALE'     => $scale,
         'MODULE'    => 'phone',
         'SORT'      => 6000,
         'COUNTERS'  => array('conversion_visit_day', 'phone_add', 'phone_add_day'),
         'CALCULATE' => function(array $counters)
         {
            $denominator = $counters['conversion_visit_day'] ?: 0;
            $numerator   = $counters['phone_add_day'] ?: 0;
            $quantity    = $counters['phone_add'] ?: 0;

            return array(
               'DENOMINATOR' => $denominator,
               'NUMERATOR'   => $numerator,
               'QUANTITY'    => $quantity,
               'RATE'        => $denominator ? $numerator / $denominator : 0,
            );
         },
      ),
    );
}

Зарегистрировать наши методы в модуле конверсии.

Для этого в файле /phone/install/index.php в методе InstallDB() добавим 2 команды:
RegisterModuleDependences('conversion', 'OnGetCounterTypes' , 'phone', '\Phone\Internals\PhoneConversion', 'onGetCounterTypes');
RegisterModuleDependences('conversion', 'OnGetRateTypes' , 'phone', '\Phone\Internals\PhoneConversion', 'onGetRateTypes');
После этого можно устанавливать наш модуль в панели администратора. Если мы все сделали правильно то на странице настройки модуля конверсии должен появится наш модуль.

Добавить код фиксации целевого действия.

Сам по себе наш модуль не знает где и когда произойдет добавление телефона. Для этого в методе сохранения информации с формы обратной связи нам надо добавить код фиксации целевого действия.
$context = \Bitrix\Conversion\DayContext::getInstance();
$context->addDayCounter('phone_add_day', 1);
$context->addCounter('phone_add', 1);
Результатом моей работы стало:

показать полностью
Пользователь 16183  -> Всем
24 Сентябрь, 2015 23:25
Контроль активности с Google reCAPTCHA
1С-Битрикс единственная система в которой есть модуль проактивной защиты. Он включает в себя:
  1. Проактивный фильтр (Web Application Firewall*) обеспечивает защиту от большинства известных атак на веб-приложения
  2. Веб-антивирус - система противодействия заражениям сайтов
  3. Двухэтапная авторизация
  4. Контроль целостности файлов
  5. Защита административной части с доступом к ней только с определенных IP адресов
  6. Защита сессий
  7. Защита редиректов от фишинга
  8. Защита от фреймов
  9. Контроль активности
И сегодня хотел остановиться на одном методе защиты: Контроль активности.

Контроль активности позволяет установить защиту от чрезмерно активных пользователей, программных роботов, некоторых категорий DDoS-атак, а также отсекать попытки подбора паролей перебором.

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

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

Чтобы этого не случилось мы в своих проектах использовали технологию Google reCAPTCHA для проверки и отключения блокировки у пользователей сайта.

На текущий момент Google reCAPTCHA имеет весьма дружелюбный для пользователя интерфейс. Она не просит Вас распознать какой-то текст, или цифру. Это крайне не удобно и возможна куча ошибок. Минимум, что Google reCAPTCHA может попросить от Вас это поставить галочку, что Вы не робот:



Или предложит Вам выбрать картинки с изображением например апельсина.



Легко и удобно. Но как же данный функционал включить в свой проект? Так-же легко.

(Предположим у Вас уже есть акаунт на Google, если нет то идет регистрировать)
Авторизуемся на сайте http://www.google.com после чего идем по ссылке: https://www.google.com/recaptcha/admin

Нам предлагают зарегистрировать наш сайт в системе reCAPTCHA. Процесс регистрации довольно прост:
  • Указываем название вашего сайта
  • Указываем домены для которых будет использоваться reCAPTCHA. (По одному домену на одну строку)
  • Указываем владельца. (Тут указываем Вашу учетную запись на GMail например: habrhabr@gmail.com)
После регистрации Вам будут сформированы 2 ключа. Один ключ будет использоваться для отображения reCAPTCHA на сайте, а второй будет использоваться для проверки прошел ли пользователь проверку или нет.

Ключи мы получили идет теперь на наш сайт.

Корректировка страницы блокировки.

В системе 1С-Битрикс в папке /bitrix/ есть файл activity_limit.php в котором и лежит шаблон страницы отображаемой при блокировке пользователя. Вы можете включить в нее свой дизайн сайта, или сформировать новый шаблон именно для страницы блокировки. (этап подготовки интерфейса мы пропустим т.к. у каждого будет свой подход к тому как оформить эту страницу)

После того как мы подготовили основной интерфейс страницы займемся подключением модуля Google reCAPTCHA для этого в тело HTML документа до тэга </head> нам надо вставить JS скрипты Google

<sc ript src='https://www.google.com/recaptcha/api.js?hl=ru'></sc ript>


В тело документа мы добавляем форму проверки и указываем в ней наш публичный ключ для формирования Google reCAPTCHA:

<fo rm action="" method="post">
        <div class="g-recaptcha" data-sitekey="Публличный_ключ"></div>
        <br/>
        <input type="submit" class="btn btn-system" value="Подтвердить">
</form>

Action у формы мы специально оставили пустым чтобы отправка выполнилась в этот-же файл.

Метод проверки и разблокировки.

<?
if (isset($_REQUEST["g-recaptcha-response"])) //Если мы получили хеш проверки с формы
{
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); //Подключаем ядро Битрикса
    $request = new \Bitrix\Main\Web\HttpClient(); //Создает объект HttpClient

    //Формируем запрос на проверку в Google
    $post = $request->post("https://www.google.com/recaptcha/api/siteverify", Array(
        "secret" => "Секретный_ключ", //Наш секретный ключ от Google
        "response" => $_REQUEST["g-recaptcha-response"], //Сам хеш с формы
        "remoteip" => $_SERVER["REMOTE_ADDR"] //IP адрес пользователя проходящего проверку
    ));
    $post = json_decode($post); //Декодируем ответ от Google
    if ($post->success == 'true') //Если проверка прошла удачно
    {
        $_SESSION["SESS_GRABBER_STOP_TIME"] = ""; //Очищаем ключ блокировки в сессии
    }else{
        //Выполняем действие если не прошел проверку на reCAPTCHA
    }
}
?>


И можно в HTML теле файла сделать тоже сообщение об удачном прохождении проверки:

<?if ($post->success == 'true'){?>
    <h2>Поздравляем, Вы не робот.</h2>
    <a  class="btn btn-system" href="<?=$APPLICATION->GetCurPageParam("", array("g-recaptcha-response"))?>">Обновить страницу</a>
    <sc ript type="text/javascript">
        document.addEventListener('DOMContentLoaded', function() {
            window.location.replace('<?=$APPLICATION->GetCurPageParam("", array("g-recaptcha-response"))?>');
            window.location.reload();
        });
    </sc ript>
<?}?>


Данную страницу можно усилить кодом по автоматической полной блокировки IP адреса в случае частых срабатываний блокировки сессии для защиты от назойливых роботов.

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

Надеюсь моя форма поможет Вам сократить число "роботов" на Ваших сайтах.

P.S. Не бойтесь, что поисковые системы попадут под блокировку. Для них есть в системе специальные методы по которым хиты поисковых системы не будут учитываться и индексация Вашего сайта не пострадает.
Емельянов Сергей
Хорошая идея. Возьму на заметку.
0 Ещё
показать полностью
Пользователь 16183  -> Всем
12 Июнь, 2009 20:51
Реализация автоматической рассылки на основе модуля Рассылка
Уже не однократно просили опубликовать информацию по реализации автоматического формирования рассылки. Постараюсь как можно подробнее описать...


Что мы имеем: Модуль Рассылки в котором у нас будут:
- храниться рубрики рассылки;
- формироваться автоматические рассылки;
- храниться информация о подписчиках;
- рассылаться почта.

Итак начнем.
Создания скрипта автоматической рассылки.
Все наверное видели при создании рассылки в автоматическом виде видели один параметр: Доступные шаблоны.



1. Так что такое шаблон?
2. Где его взять?
3. Как он должен выглядеть?

Начнем по порядку:
1. Шаблон - это PHP скрипт который будет формировать в определенное время текст письма рассылки.

2. В старых демках был пример такого шаблона. Этот шаблон нам и надо будет создать.

3. НУ а теперь и сам код этого скрипта:

Скрипты шаблонов должны лежать тут: bitrix/php_interface/subscribe/templates/Любое_имя_раздела_для_вашего_шаблона/

Структура содержимого:
lang/
lang/ru/
lang/ru/description.php
lang/en/
lang/en/description.php
description.php
template.php

Листинг файла lang/ru/description.php:
<?
$MESS ['news_template_name'] = "Дайджест новостей";
$MESS ['news_template_desc'] = "Шаблон генерации дайджеста новостей.";
?>


Листинг файла description.php:
<?
$arTemplate =
   Array(
   "NAME"=>GetMessage("news_template_name"),
   "DESCRIPTION"=>GetMessage("news_template_desc")
   );
?>


А вот на листинге последнего файла уделю больше внимания т.к. этот файл и будет играть всю основную роль.

Листинг файла template.php:
<?//Запретим прямой вызов скрипта
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

//определяем глобальные переменные и присваиваем им первоначальные значения.
global $SUBSCRIBE_TEMPLATE_RESULT;
$SUBSCRIBE_TEMPLATE_RESULT=false;
global $SUBSCRIBE_TEMPLATE_RUBRIC;
$SUBSCRIBE_TEMPLATE_RUBRIC=$arRubric;
global $APPLICATION;

//определяем стилистику нашего письма
?>
<STYLE type=text/css>
.text {font-family: Verdana, Arial, Helvetica, sans-serif; font-size:12px; color: #1C1C1C; font-weight: normal;}
.newsdata{font-family: Arial, Helvetica, sans-serif; font-size:12px; font-weight:bold; color: #346BA0; text-decoration:none;}
H1 {font-family: Verdana, Arial, Helvetica, sans-serif; color:#346BA0; font-size:15px; font-weight:bold; line-height: 16px; margin-bottom: 1mm;}/*Текст заголовка*/
</STYLE>

<P>Добрый день!</P>
<!-- Подключаем компонент который будет из инфоблока $IBLOCK, из раздела $arRubric только новые элементы -->
<P><?$APPLICATION->IncludeComponent(
   "bitrix:subscribe.news",
   ".default",
   Array(
      "SITE_ID" => "ru",
      "IBLOCK_TYPE" => "news",
      "ID" => $IBLOCK,
      "SECTION_ID" => $arRubric,
      "INCLUDE_SUBSECTIONS" => "Y",
      "SORT_BY" => "ACTIVE_FROM",
      "SORT_ORDER" => "DESC"
   ),
false
);?></P>
<P>Всего хорошего</P><?
//Получаем дату и время в правильном формате.
$new_date = $DB->FormatDate(date("d.m.Y H:i:s"), "DD.MM.YYYY HH:MI:SS", CSite::GetDateFormat("FULL", "ru"));
//вы конечно могли подучать, что просто подключением компонента вопрос решится, но не тут-то было, надо теперь полученные данные передать обратно модулю расслка
if($SUBSCRIBE_TEMPLATE_RESULT)
   return array(
//Заголовок письма
      "SUBJECT"=>$arRubric["NAME"]
//Тип сообщения
      ,"BODY_TYPE"=>"html"
//Кодировка письма
      ,"CHARSET"=>"Windows-1251"
      ,"DIRECT_SEND"=>"Y"
//E-Mail от имени которого будет производится рассылка
      ,"FROM_FIELD"=>$arRubric["FROM_FIELD"]
//Автоматическая отправка
      ,"AUTO_SEND_FLAG"=>"Y"
//Дата и время отправки письма
      ,"AUTO_SEND_TIME"=>$new_date
   );
else
   return false;
?>


Все шаблоны у нас созданы.

Создание автоматической рассылки.
Заходим в "Панель управления -> Сервисы -> Рассылки -> Список рассылок" и создаем новую рассылку которая будет у нас формироваться автоматически.
При создании новой рассылки ставим галочку на поле "Автоматическая" после чего у нас активируется 2-я вкладка "Автоматическая генерация".

Во второй вкладке указывается период генерации рассылок, шаблон по которому будет производится рассылка и E-Mail от имени которого будет происходить рассылка.

Сохраняем нашу рассылку.

Последний шаг - тестирование.
Открываем нашу созданную рассылку и нажимаем "Проверить", на открывшейся странице указываем период за который необходимо выбрать данные и смотрим результат генерации.

Надеюсь моя статья поможет вам в решении ваших вопросов.
Марченко Сергей
Молодец 1/10  инструкции переписал которую представляет битрикс
0 Ещё
Усова Ярослава
Добрый день. Создаю папку в bitrix/php_interface/subscribe/templates/
проверяю в рассылках - есть доступный шаблон.
Заполняю папку файлами, в рассылках вкладка автоматическая генерация становится недоступной.
Что не так? Название файлов верное, содержание верное...
0 Ещё
Кирсанов Анатолий
Марченко Сергей, а толку от нее ... В курсе для разработчиков тоже по теме ничего. Нигде не задокументировано наличие $arRubric в шаблоне рассылки. Проверка кода показала, что есть еще две переменные в этом же контексте - $arSite, $arLang. И запретить имии пользоваться, по идее, никто не может (они равны $arRubric, т.к. все три не описаны в документации). Но и пропасть они могут хоть все три.
0 Ещё
показать полностью
Пользователь 16183  -> Всем
28 Июнь, 2009 17:27
Модуль производительности как инструмент администратора
Хочу поделится с вами моим опытом работы с модулем производительности его плюсами и минусами.

Преамбула.
Я занимаюсь развитием одного крупного проекта который сейчас набирает обороты. Уже на портале зарегистрировано более 18 000 пользователей, в день на портале получаем около 3 000 хостов и более 25 000 хитов.

Увы на хостинге (хостера называть не буду) начались проблемы. Проект начал загружать нереально базу, что приводило к зависанию базы.
С хостером ругались долго пытаясь понять кто виноват, пытались найти проблему в портале но даже Автоматическое кеширование увы не помогало.

Решили перейти на выделенный сервер. НО со стандартными настройками увы проблемы продолжились.

Отмечу, что текущий размер базы данных ~1.6 Гб.

Чтобы не потерять популярность проекта пришлось в срочном порядке просить помощи от разработчиков 1С-Битрикс. И они дали для анализа производительности этот модуль.

Модуль производительности.
Первое знакомство с модулем. Да ранее мы его видели но у нас не было реальной надобности в его использовании.

Краткость сестра таланта (С).
Минимум настроек. Не надо ломать голову как настроить модуль.
Пара галочек и режим включения мониторинга.



База данных
Начал анализ базы с настроек базы данных.


Как вы видите параметры базы приводят к большим потеря в производительности. И это при том, что на сервере софт собран в оптимальной конфигурации
Nginx + Apache
PHP + ZendOptimizer + eAccelerator
Но главное упущение мое была не оптимальная конфигурация базы. Используя мощный сервер я совсем забыл про настройку базы.

Я начал подбирать оптимальную конфигурацию для базы.
Многих настроек у меня не было или значения стаяли маленькие.
Меняя параметры настроек базы я смотрел результаты работы в модуле.
Позволило уменьшить время затрачиваемое на оптимизацию базы.

Листинг получившейся конфигурации:
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]

port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking

key_buffer = 256M
max_allowed_packet = 16M
max_connections = 2000
max_heap_table_size=32M
myisam_sort_buffer_size = 256M
#net_buffer_length = 128M
read_buffer_size = 256M
read_rnd_buffer_size = 256M
sort_buffer_size = 128M
table_cache = 7168
thread_cache_size = 16K
thread_concurrency = 16
thread_stack = 128K
tmp_table_size=1408M
query_cache_limit = 16M
query_cache_size = 1024M
#query_cache_startup_type = 1
query_cache_type = 1

#skip-networking

skip-federated
log-bin=mysql-bin
server-id       = 1

[safe_mysqld]
log-error=/var/lib/mysql/mysqld.log

[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]
#no-auto-rehash

[isamchk]
key_buffer = 16M
sort_buffer_size = 8M
read_buffer = 10M
write_buffer = 10M

[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout


И вот, что у меня получилось:


Как видите прирост производительности базы на лицо.

Мне понравилась работа по оптимизации базы. Я мог редактировать настройки и тут-же видеть результаты.

Хиты и Хиты с группировкой
Закончив с оптимизацией настроек базы я перешел к проверке нагрузке уже на уровне кода.

Тут мне удалось найти какие именно страницы на портале отнимают больше всего памяти и какие открывались дольше всего... где кеширование обязательно, а где можно выключить.



Запросы
Аналогично анализам хитов но уже на уровне SQL запросов.


(Сами запросы я выключил иначе скрин был бы больше)

Как видите все проблемы в выборке данных все в публичных компонентах.

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

Минус этого раздела модуля - не показывает на какой странице расположен тот или иной компонент. Пришлось искать по ID хита.

Ошибки PHP

А вот этот раздел будет полезен думаю всем разработчикам. Очень удобный функционал отлова ошибок даже в файлах которые автоматически пересылают вас в другое место или отрабатывают в фоновом режиме (как например правила обработки почты или агенты).

Нашел несколько недочетов в скриптах которые быстренько поправили. Ошибки не критические но раз о них известно то почему бы не исправить  ;)

Таблицы

Вот тут я ожидал увидеть гораздо больший функционал!
Я тут увидел только список таблиц и выполнить перевод таблиц в InnoDB.

А где информация по таблицам? Где функции по проверке таблицы или ее восстановлению?
Да я знаю, что это все есть в Инструментах (Инструменты -> Проверка БД) но все-же хотелось бы видеть больший функционал в этом разделе.

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

P.S. этот анонс мое ИМХО...
P.S.S. если интересны настройки Nginx, Apache2 и PHP 5 пишите ;)
Ban Dmitry
Кстати, довольно много полезной информации по настройке базы даёт PHPMyAdmin на странице "Текущее состояние MySQL": см. скриншот.
0 Ещё
Невенчанный Пётр
Я знаю все прелести PhpMyAdmin вот если бы часть его инструментария реализовать в модуле производительности то это стал бы еще более мощный инструмент Администратора.
0 Ещё
показать полностью
Пользователь 16183  -> NET-girls
9 Май, 2009 17:40
С ДНЕМ ПОБЕДЫ!!!
Поздравляю Всех С ДНЕМ ПОБЕДОЙ!

Мирного неба над головой!
показать полностью
Пользователь 16183  -> NET-girls
8 Март, 2009 7:54
Всех милый и нежных девушек с праздником весны!!!
Хочу поздравить всех прекрасных девушек с этим прекрасным праздником весны и подарить Вам вот эти строки:

Спасибо вам за умопомрачение
От лицезрения вашей красоты,
За нежности счастливые мгновенья,
За наши мысли, грезы и мечты.

Так будьте ж счастливы и радуйте собою,
Не прекращая ни на миг цвести,
Удачи вам, весеннего настроя,
Поклонников, улыбок и любви!

@}->--- @}->--- @}->--- @}->--- @}->---
@}->--- @}->--- @}->--- @}->--- @}->---
@}->--- @}->--- @}->--- @}->--- @}->---
@}->--- @}->--- @}->--- @}->--- @}->---
@}->--- @}->--- @}->--- @}->--- @}->---  

Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».