Синхронизация:Настройка PHP-скриптов

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск

Используемые сокращения

ГБ - Глобальная база
КБ - Клиентская база
В скриптах настраиваются только файлы: declare.php, checkupd.php, getrelationtype.php. 
 ВНИМАНИЕ!!!! Перед исправлением любого из скрипта, необходимо сделать резервную копию.

DECLARE.PHP (настройка параметров синхронизации)

$GLOBALS["DB_USER"]="LOGIN";
$GLOBALS["DB_PASSWD"]="PASSOWRD";
$GLOBALS["CODEKEY"]="njHtdlf146s8mkGFrejhsw875HJgf~sfkksheu69js";
$GLOBALS["PATH_ROOT"]="C:\\wamp\\www\\sinhro\\engine\\";
$GLOBALS["PATH_USERS"]="C:\\wamp\\www\\sinhro\\engine\\users\\";
$GLOBALS["PACKETSIZELIMIT"]=10000000; 
$GLOBALS["CLEARDIR"]=true;
$GLOBALS["XFIELDS0"]=" AGENTS.GLOBAL_AGENT_ID ";
$GLOBALS["XFIELDS1"]=" WARES.SNAME CASH_DOCS.GLOBAL_ID CASH_DOC_TYPES.GLOBAL_ID DEPS.GLOBAL_ID ";
$GLOBALS["USEQUEUE"]=true;
$GLOBALS["QUEUEDIR"]="C:\\wamp\\www\\sinhro\\engine\\queue\\";
$GLOBALS["QUEUELIMIT"]=100;
$GLOBALS["NODELETE"]=false;
?>
Скрипт установки параметров синхронизации. Описание параметров.
DB_USER – Логин для подключения к ГБ
DB_PASSWD – Пароль для подключения к ГБ
PATH_ROOT – Корневой каталог синхронизации
PATH_USERS – Каталог для сохранения пакетов с клиентов
PACKETSIZELIMIT – Ограничение размера пакета в байтах
CLEARDIR – Признак удаления пакета после успешной загрузки
XFIELDS0 – Список полей таблиц для исключения из синхронизации для профилей с relationtype=0 (Частичная синхронизация).
(Как правило, при двухсторонней синхронизации структура таблиц должна быть идентична, но при необходимости мы можем добавлять необходимые колонки к таблицам, 
которые не будут участвовать в синхронизации. Как правило. Это специфические поля ГБ, но могут быть и в КБ)
(Для удобства просмотра списка полей в скрипте, можно сделать перенос строки следующим образом 
$GLOBALS["XFIELDS0"]=" AGENTS.GLOBAL_AGENT_ ID ";
$GLOBALS["XFIELDS0"].=" AGENTS.GLOBAL_ ID ";
В таком случае в параметр XFIELDS0 будет содержать значение «AGENTS.GLOBAL_AGENT_ ID AGENTS.GLOBAL_ ID»)
XFIELDS1 – Список полей таблиц для исключения из синхронизации для профилей с relationtype=1 (Полная синхронизация). 
USEQUEUE – Признак наличия очереди загрузки в схеме синхронизации
QUEUEDIR – Каталог для хранения пакетов, обрабатываемых очередью загрузки
QUEUELIMIT – Максимальное количество незагруженных пакетов состоящих в очереди к загрузке
Если данный размер превышен, то очередной пакет синхронизации уже не будет поставлен  в очередь.
NODELETE – Запрет удаления данных при синхронизации. На данный момент параметр не работает.

CHECKUPD.PHP (форсированное обновление)

<?php
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
function checkupd(&$params, &$zipfilename, $userfolder, $it)
{
 $reltype=0;
 $profile_id=getprofile_id($it,$params["profile_id"],$reltype);
 if (!$profile_id){die(" error : профиль клиента не найден");}
 if ($profile_id==0){die(" error : профиль клиента равен нулю");}
 $fn=$GLOBALS["PATH_ROOT"]."shellupd/exe.ver";
 $f=fopen($fn,"r");
 $s_ver=fread($f,filesize($fn));
 fclose($f);
 $c_ver=$params["exever"];
 if (!is_num($s_ver,false)){die("error Ошибка в определении версии обновления (server)");}
 if (!is_num($c_ver,false)){die("error Ошибка в определении версии обновления (client)");}
 if ($c_ver>=$s_ver) {die("infoВерсия клиента актуальна! (".$s_ver.")");}
 $fn=$GLOBALS["PATH_ROOT"]."shellupd/data.zip";
 if (!file_exists($fn)) {die("error Не найдено обновление!");}
 readfile($fn);
}
function CheckForceUpd(&$params, &$zipfilename, $userfolder, $it)
{
//  return false;
 $reltype=0;
 $profile_id=getprofile_id($it,$params["profile_id"],$reltype);
 if (!$profile_id){die(" error : профиль клиента не найден");}
 if ($profile_id==0){die(" error : профиль клиента равен нулю");}
 $fn=$GLOBALS["PATH_ROOT"]."shellupd/exe.ver";
 $f=fopen($fn,"r");
 $s_ver=fread($f,filesize($fn));
 fclose($f);
 $c_ver=$params["exever"];
 if (!is_num($s_ver,false)){return false;}//{die("error Ошибка в определении версии обновления (server)");}
 if (!is_num($c_ver,false)){return false;}//{die("error Ошибка в определении версии обновления (client)");}
 if ($c_ver>=$s_ver) {return false;}//{die("infoВерсия клиента актуальна! (".$s_ver.")");}
 $fn=$GLOBALS["PATH_ROOT"]."shellupd/data.zip";
 if (!file_exists($fn)) {die("error Не найдено обновление!");}
 readfile($fn);
 $GLOBALS["echo"].="1DF57BEEBA2C163BC206E002D74E1B5B";
 $params["cmd"]="forceupd";
}
?>
В данном скрипте исправляем только одну выделенную строку. Если эта строка закомментирована, то обновление DtClient будет по требованию пользователя. 
Правой кнопкой мыши по значку с DtClient в области уведомлений – «проверить обновления», в случае расхождения версий, DtClient загрузит свежую версию, обновится и перезапустится. 
Если строка раскомментирована, то автоматического обновления не будет, и не важно что будет указано после return. 
Новый Distributeclient.exe архивируем в корневой каталог синхронизации (смотри declare.php) папка shellupd и называем файл data.zip. Версию нового обновления указываем в папке shellupd в файле exe.ver.

GETRELATIONTYPE.PHP (настройка частичной синхронизации)

<?php
function getrelationtype($tablename, $uuid, $profile_id, $fieldvals)
{
 if (strpos("  WAREBASE_D SP\$ANALITICS SP\$WDICTS SP\$GROUPS SP\$FRREPORTS G\$PROFILES RECEPTS RECEPT_CLIENTS RECEPT_DOCTORS_FIO RECEPT_LPU RECEPT_MO RECEPT_SICK RECEPT_VIDUD "," ".$tablename." ")>0)
 {  /*die("error dbg0");*/    return 1;}
 if (!isset($fieldvals["ID"])){return 0;}
 $id=$fieldvals["ID"];
 switch ($tablename)
 {
   case "AGENTS": return 1; break;
   case "ADDRS":;
   case "REPORTS":if (($id>9999) && ($id<1000000000)){return 1;} else {return 0;} break;
   default: return 0;
 }
}
?>
В выделенном блоке описывается распределение таблицы для частичной синхронизации. 
Для каждой таблицы определяются условия, когда можно отправлять данные с ГБ в ГБ (return 0), а когда нельзя (return 1). 
В приведенном примере таблица AGENTS для профилей с relationtype=1 будет синхронизироваться только в одну сторону КБ –> ГБ. 
В обратную сторону не будет, т.к. данный скрипт будет блокировать отправку для всех записей таблицы. 
Таблицы ADDRS, напротив, отправляется в КБ безусловно. 
Таблица REPORTS отправляется с ГБ в КБ только для строк, где 10000<=id<=1000000000. 
Для описания условий доступны любые поля таблицы.