Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php subcat orchestrator delivery

Создание обработчика службы доставки для нового ядра магазина Битрикс

Предупреждение: код работает на версиях модуля sale 16.0 и выше.

В 16 версии магазина Битрикса были переработаны обработчики служб доставки. Обработчиками доставки являются классы-наследники BitrixSaleDeliveryServicesBase. Встроенные обработчики лежат в папке /bitrix/modules/sale/handlers/delivery/. Там можно ознакомиться с примерами новых обработчиков.

Чтобы подключить свой собственный обработчик, вроде бы нужно положить папку со своим классом в /bitrix/php_interface/include/sale_delivery/ или /local/php_interface/include/sale_delivery/, но на текущей версии(16.0.5) это не сработало. Но есть рабочий альтернативный метод подключения любого класса как обработчика, в init.php добавляем:

Все пути к файлам, пространства имён и классы, относящиеся к службе доставки, приведены для примера. Конечно, нужно размещают свои классы в своих модулях и своих пространствах имён.

По указанному пути создаём класс:

Добавляем несколько методов, смысл которых вполне понятен из названия:

Следующий метод отвечает за настройки службы доставки:

И, наконец, за расчёт стоимости отвечает метод calculateConcrete (аналог Calculate из старых обработчиков доставки):

Обязательно кешируйте все данные, полученные от внешних API с ключом, содержащим все нужные параметры для расчёта. Как кешировать данные в D7 читайте в этой статье. Как сделать запрос читайте в статье HTTP-запросы в Битрикс D7.

Аргументом является объект класса BitrixSaleShipment, из которого можно получить объект заказа и нужные параметры расчёта:

Примечание: По информации ведущего разработчика Битрикс на данный момент (sale 16.0.5), пока не вышел обновлённый sale.order.ajax, в компоненте для совместимости в качестве $locationCode выступает ID местоположения, поэтому нужен такой временный костыль для получения кода местоположения:

Также доступен массив настроек службы доставки:

Метод calculateConcrete должен возвращать объект класса BitrixSaleDeliveryCalculationResult с доступными методами:

Если при расчёте возникла ошибка, в CalculationResult можно добавить ошибки расчёта (эта ошибка будет выведена при оформлении заказа):

Для проверки совместимости службы доставки и переданных параметров можно перегрузить метод isCompatible, например, самый простой вариант — проверить успешность расчёта, при наличии ошибок служба доставки просто не будет показываться при оформлении заказа:

Профили доставки

Для того, чтобы класс сервиса доставки мог поддерживать профили, добавляем в него поле и методы:

В методе getChildrenClassNames указали, что профили могут быть объектами класса YourNamespaceYetAnotherDeliveryProfile, создаём файл с классом и указываем его в обработчике, добавленном в начале статьи:

По указанному пути размещаем класс:

В остальном класс профиля является аналогом класса родительской службы.

Профиль также может иметь свою конфигурацию, например, профилям могут соответствовать разные тарифы доставки:

За расчёт стоимости также отвечает метод calculateConcrete:

В методах профиля можно получить не только настройки профиля, но и настройки родительской службы:

И также здесь можно проверять совместимость профилей (аналог метода Compability в старых службах доставки):

Во избежание случайных ошибок, при использовании профилей в методе расчёта родительского сервиса стоит выбрасывать исключение:

События расчёта доставки

После расчёта доставки вызывается событие onSaleDeliveryServiceCalculate модуля sale с параметрами RESULT — результат расчёта (BitrixSaleDeliveryCalculationResult) и SHIPMENT — отгрузка (BitrixSaleShipment). Можно использовать это событие для изменения результатов расчёта без вмешательства в код обработчика и без копирования стандартных обработчиков в свои пространства имён.

Php subcat orchestrator employment

Продукт Microsoft System Center Orchestrator 2012 упрощает процесс автоматизации задач системного администрирования. Эта система, первоначально именовавшаяся Opalis и приобретенная корпорацией Microsoft в 2009 году, обеспечивает простой порядок создания сложных схем автоматизации

Почти все системные администраторы относятся к перспективе заняться составлением сценариев с таким же энтузиазмом, с каким мой девятилетний сын отправляется на прививку в медицинский кабинет. Разумеется, я понимаю, что ИТ-специалисты всей душой за автоматизацию всех процессов, которые только поддаются автоматизации. Но когда такой энтузиаст, открыв интегрированную среду сценариев Windows PowerShell, осознает, что ему предстоит написать сценарий, не укладывающийся в пару-тройку строк кода, его рвение куда-то улетучивается, и он быстро находит занятие, которое гораздо милее его сердцу, — например, приступает к просмотру записей журналов регистрации событий.

И это весьма прискорбно, поскольку если и существует некая универсальная закономерность в эволюции роли системных администраторов, то она состоит в следующем: с течением времени для управления все большим числом систем будет требоваться все меньшее число ИТ-специалистов. А специалисты, не обладающие навыками в сфере автоматизации сложных задач системного администрирования, не смогут конкурировать на рынке с коллегами, которые освоили технологии автоматизации. Умение быстро автоматизировать типичные задачи приобретает особое значение.

. Если потребуется определить, зафиксировано ли в журнале событий Windows то или иное тревожное оповещение, вам не придется составлять несколько строк кода PowerShell. Воспользуйтесь вместо этого Orchestrator. На нем вы можете расположить тот или иной элемент, имеющий отношение к отслеживаемому событию, настроить этот элемент, чтобы он инициировал определенное оповещение, и подключить к другому элементу, который будет выполнять заданное действие применительно к упомянутой задаче. Таким образом, вместо того чтобы писать несколько строк кода PowerShell, который нередко бывает понятен только посвященным, вы сможете решить те же задачи методом drag-and-drop, и это займет не более 30 секунд!

Orchestrator — полноценное решение, обеспечивающее выполнение не только базовых задач автоматизации. Наборы операций (runbooks) пакета Orchestrator можно настроить таким образом, чтобы они запускались в случае появления в журналах событий тех или иных записей или, что еще важнее, после выдачи оповещений диспетчером Microsoft Systems Center Operations Manager. Вам уже не придется ждать, пока конечный пользователь обратит внимание на отключение одной из служб или пока член группы технической поддержки составит задание в соответствии с оповещением Ops Manager. Вы можете автоматизировать процесс от начала до конца, воспользовавшись процедурой Orchestrator, которая запускается через оповещение, отыскивает задание в системе отслеживания заданий, выполняет сложные операции для устранения проблемы, инициировавшей оповещение, добавляет данные к заданию в системе отслеживания заданий и затем закрывает задание. Оповещение разрешается, задание регистрируется и закрывается — и все это происходит без непосредственного участия администратора.

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

Чтобы лучше понять механизм функционирования пакета Orchestrator, нужно иметь представление о таких концепциях, как операции (Activities), стандартные задания (Runbooks), шина данных (Data Bus) и пакеты интеграции (Integration Packs).

Операции Activities

Пакет Orchestrator обеспечивает выполнение автоматизации на основе графического интерфейса. Элементы, с которыми работает пользователь в процессе создания средств автоматизации, именуются операциями. Для буксировки и размещения операций, для их связывания в логические цепочки, для организации ветвления операций в соответствии с логикой решений используется конструктор runbook designer. Выделяют два базовых типа операций — операции отслеживания (monitoring activities) и операции действия (action activities).

  • Операции отслеживания инициируются внешним источником и применяются для запуска процедур runbooks. Так, операция отслеживания может быть запущена тем или иным оповещением диспетчера Ops Manager.
  • Операции действия инициируются другими операциями и выполняют заданные процедуры, которые могут быть самыми разными — от завершения того или иного процесса, запуска приложения Microsoft.NET или перезагрузки диспетчера System Center Configuration Manager (SCCM) до развертывания модуля программного обновления, активации диспетчера виртуальных машин System Center Virtual Machine Manager (SCVMM), создания виртуальной машины или обновления диспетчера System Center Service Manager (SCSM).
Читать еще:  Php compare strings

Стандартные конфигурации Runbooks

Конфигурации Runbooks — это наборы операций, объединенных логически. Стандартная конфигурация, представленная на экране 1, обеспечивает включение с помощью диспетчера System Center Data Protection Manager (DPM) всех размещенных на заданном сервере защищаемых источников данных, включая тома, сведения о состоянии системы и базы данных, в защищаемую группу DPM. По завершении процедуры добавления упомянутых данных в группу runbook инициирует создание точки восстановления.

В рассматриваемом примере пользователю остается только указать целевой сервер и целевую группу защиты. Стандартные конфигурации могут выполняться с консоли Orchestrator — веб-приложения на базе Microsoft Silverlight, выполняемого на сервере Orchestrator Runbook. Это относительно простое задание, однако в случае организации такого типа DPM-защиты в ручном режиме пользователю пришлось бы подключаться с помощью клиентского модуля Remote Desktop Connection к заданному серверу DPM, запускать консоль DPM (которая в системе DPM 2010 не допускает дистанционного управления) и настраивать средства защиты с помощью мастера. Но после настройки конфигурации runbook для выполнения той же задачи достаточно будет ввести имя сервера, а также имя группы защиты в одном-единственном веб-окне. Задача, на выполнение которой в ручном режиме у ИТ-специалиста ушло бы 5 минут (а то и больше), теперь может быть решена автоматически, причем для ее решения потребуется ровно столько времени, сколько уходит на загрузку консоли Orchestrator.

Шина данных

Шина данных, которая содержит все сведения о выполнении, поступающие от объектов внутри коллекции runbook, дает возможность передавать информацию от одной операции другой. Допустим, в качестве первой операции мы рассматриваем мониторинг оповещения Ops Manager, генерируемого в случае отказа некоторой службы. Сведения о том, какая именно служба вышла из строя, передаются шине для того, чтобы при выполнении последующих заданий, таких как проверка состояния службы и инициирование ее повторного запуска, этой информацией можно было воспользоваться. Далее я расскажу о том, как с помощью шины данных извлекать выходные данные утилиты командной строки и присоединять их к концу текстового файла.

Пакеты интеграции

Пакеты интеграции представляют собой наборы операций, относящиеся к определенному продукту. К примеру, в продукте Orchestrator 2012 будут содержаться пакеты интеграции для всех остальных продуктов семейства System Center 2012. Поскольку пакет Orchestrator был изначально разработан сторонним поставщиком, для него выпускаются пакеты интеграции не только с решениями Microsoft, но и с продуктами других разработчиков, такими как CA Technologies Service Desk, HP Operations for UNIX, Windows, Solaris, HP Service Desk, IBM Tivoli Enterprise Console, а также VMware Infrastruture и vSphere.

Использовать Orchestrator с тем или иным продуктом можно и без пакета интеграции. Если изготовитель интересующего пользователя Orchestrator продукта не предоставляет пакета интеграции, выполнять различные операции, включая такие, как Run Program, Query Database, Run SSH Command, Query WMI, Invoke Web Services, Run.NET Script, а также Get/Monitor/Create SNMP Trap, можно с помощью одного из базисных объектов Orchestrator.

Все эти элементы могут использоваться для установления универсального соединения с системой. Ваши достижения могут быть более или менее значительными — это зависит от того, какими возможностями располагает продукт, который вы пытаетесь автоматизировать. Пакет Orchestrator поставляется с инструментом, известным как Quick Integration Kit (QIK). Этот набор представляет собой комплект разработчика, позволяющий ИТ-специалисту своими руками создавать операции и пакеты интеграции с помощью утилит командной строки или составных команд PowerShell. Комплект QIK все чаще используется для создания членами сообщества пакетов интеграции.

Консоль пакета Orchestrator

Консоль Orchestrator позволяет в режиме реального времени просматривать состояние коллекций runbook, а также запускать или останавливать их работу. Консоль можно использовать в качестве инструмента, обеспечивающего другим ИТ-специалистам возможность выполнения операций runbooks. Так, вы можете создать runbook на базе пакета интеграции DPM с целью создания резервных моментальных снимков того или иного источника данных. Далее можно, как показано на экране 2, с помощью консоли Orchestrator предоставить данный runbook в распоряжение других пользователей. Эти пользователи, скажем, разработчики, занятые формированием базы данных, могут использовать консоль для запуска резервного снимка перед тем, как вносить в базу данных те или иные изменения. Кроме того, консоль Orchestrator используется в диспетчере SCSM 2012 в качестве средства для запуска операций runbooks. SCSM позволяет создавать более функционально насыщенные порталы самообслуживания, где пользователи могут формулировать запросы, которые будут инициировать процедуры Orchestrator runbooks напрямую или после санкционирования последних в рамках соответствующего процесса утверждения.

Системные требования

Все компоненты пакета Orchestrator могут выполняться на системах Windows Server 2008 R2. Для работы Orchestrator требуется 1 Гбайт оперативной памяти (рекомендуется 2 Гбайт), 200 Мбайт свободного дискового пространства, а также двухъядерный (минимум) процессор. Подобно другим продуктам семейства System Center 2012, пакет Orchestrator может выполняться на виртуальной машине. Компоненты Runbook Designer и Runbook Tester также могут выполняться на системах Windows 7 Enterprise Edition или Ultimate Edition.

Зачем дата-инженеру нужен оркестратор?

Несмотря на быстрое развитие инструментов потоковой (streaming) аналитики, значительная часть расчётов по-прежнему выполняется в пакетном (batch) режиме. Это приводит к появлению большого числа повторяющихся задач, которые нужно запускать каждый час/день/месяц. Поэтому у каждой компании, занимающейся обработкой данных, в арсенале есть инструмент, управляющий периодическими задачами. Самый подходящий термин для данных инструментов — оркестраторы.

В качестве примеров можно привести несколько сервисов, которые вы уже могли встречать в составе систем обработки данных:

Apache Airflow — пожалуй, наиболее популярная система оркестрации процессов обработки данных на текущий момент. Плюсами являются гибкость, удобство использования и активное развитие.

Apache Oozie — оркестратор, известный благодаря тесной интеграции с Hadoop-стеком. Входит в крупнейшие дистрибутивы Hadoop от Cloudera и Hortonworks.

Luigi — ещё один оркестратор, использующий (как и Airflow) Python для описания графов задач.

Какие задачи решает оркестратор?

Часто оркестратор называют «распределённым cron’ом» в честь планировщика cron системы Linux. Это не совсем корректно, поскольку оркестратор выполняет гораздо больше функций:

  1. Планирование задач — основная функция, позволяющая избавиться от ручного запуска рутинных задач по расчёту витрин, загрузке данных, резервному копированию и т. д.
  2. Управление зависимостями. Часто задачу нужно запустить не только в определённый промежуток времени, но и с учётом статуса других задач. Например, расчёт витрины данных нужно запустить только после загрузки сырых данных на кластер.
  3. Репроцессинг. Если известно, что какая-то задача требует перезапуска (например, были загружены неполные данные на предыдущем этапе), то перезапуска требуют и задачи, зависящие от неё. Кроме того, перезапуск может быть необходим за несколько временных периодов. В итоге нужно будет руками запустить несколько десятков задач, да ещё и в правильном порядке. Оркестратор позволяет выполнить эту утомительную работу за пару кликов.
  4. Мониторинг. Есть множество причин, почему задача может не выполниться — опоздала загрузка данных, не хватило ресурсов, сервис, необходимый для расчётов, был временно недоступен. Поэтому одна из задач оркестратора — отображать наличие проблемы и уведомлять через специальные каналы людей, ответственных за поддержку. Большинство оркестраторов также поддерживают SLA-уведомления. Это уведомления, которые генерируются не в случае, когда задача «сломалась», а когда её выполнение задерживается, а значит, задерживается и доставка критичных для бизнеса данных.
  5. Управление ресурсами. Это не основная задача оркестратора, но часто в их функционале можно встретить пулы и очереди задач, которые позволяют ограничить одновременное выполнение задач одного типа или использующих один ресурс. Пример: есть несколько задач на импорт из источника данных. Мощность кластера позволяет запустить сразу несколько задач импорта параллельно, но источник может не выдержать резкий рост нагрузки. В этом случае такие задачи объединяются в один пул и ограничивается число одновременных запусков, что позволяет выполнять задачи по очереди и распределить нагрузку на источник во времени.
Читать еще:  Matlab что это

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

Php subcat orchestrator delivery

Всех добрый день.

Нужна помочь в php с массивом передающего данные в array

Есть скрипт php

public static function getPVZ ()
<
$arPVZ = self :: getPVZFile ();
if ( $arPVZ ) <
self :: toAnswer (array( ‘pvz’ => $arPVZ ));
>
self :: printAnswer ();
>

public static function getLang ()
<
self :: toAnswer (array( ‘LANG’ => self :: getLangArray ()));
self :: printAnswer ();
>

public static function calc ( $data )
<
if (! $data ***91; ‘shipment’ ***93;***91; ‘tarifList’ ***93;) <
$data ***91; ‘shipment’ ***93;***91; ‘tariffList’ ***93; = self :: $tarifPriority ***91; $data ***91; ‘shipment’ ***93;***91; ‘type’ ***93;***93;;
>

if (! $data ***91; ‘shipment’ ***93;***91; ‘cityToId’ ***93;) <
$cityTo = self :: sendToCity ( $data ***91; ‘shipment’ ***93;***91; ‘cityTo’ ***93;);
if ( $cityTo && $cityTo ***91; ‘code’ ***93; === 200 ) <
$pretendents = json_decode ( $cityTo ***91; ‘result’ ***93;);
if ( $pretendents && isset( $pretendents -> geonames )) <
$data ***91; ‘shipment’ ***93;***91; ‘cityToId’ ***93; = $pretendents -> geonames ***91; 0 ***93;-> id ;
>
>
>

if ( $data ***91; ‘shipment’ ***93;***91; ‘cityToId’ ***93;) <
$answer = self :: calculate ( $data ***91; ‘shipment’ ***93;);

if ( $answer ) <
$answer ***91; ‘type’ ***93; = $data ***91; ‘shipment’ ***93;***91; ‘type’ ***93;;
if ( $data ***91; ‘shipment’ ***93;***91; ‘timestamp’ ***93;) <
$answer ***91; ‘timestamp’ ***93; = $data ***91; ‘shipment’ ***93;***91; ‘timestamp’ ***93;;
>
self :: toAnswer ( $answer );
>
> else <
self :: toAnswer (array( ‘error’ => ‘City to not found’ ));
>

public static function getCity ( $data )
<
if ( $data ***91; ‘city’ ***93;) <
$result = self :: sendToCity ( $data ***91; ‘city’ ***93;);
if ( $result && $result ***91; ‘code’ ***93; == 200 ) <
$result = json_decode ( $result ***91; ‘result’ ***93;);
if (!isset( $result -> geonames )) <
self :: toAnswer (array( ‘error’ => ‘No cities found’ ));
> else <
self :: toAnswer (array(
‘id’ => $result -> geonames ***91; 0 ***93;-> id ,
‘city’ => $result -> geonames ***91; 0 ***93;-> cityName ,
‘region’ => $result -> geonames ***91; 0 ***93;-> regionName ,
‘country’ => $result -> geonames ***91; 0 ***93;-> countryName
));
>
> else <
self :: toAnswer (array( ‘error’ => ‘Wrong answer code from server : ‘ . $result ***91; ‘code’ ***93;));
>
> else <
self :: toAnswer (array( ‘error’ => ‘No city to search given’ ));
>

// PVZ
protected static function getPVZFile ()
<

$arPVZ = self :: requestPVZ ();

protected static function requestPVZ ()
<
if (! function_exists ( ‘simplexml_load_string’ )) <
self :: toAnswer (array( ‘error’ => ‘No php simplexml-library installed on server’ ));
return false ;
>

$request = self :: sendToSDEK ( ‘pvzlist’ , false , ‘type=ALL’ );
$arLL = array();
if ( $request && $request ***91; ‘code’ ***93; == 200 ) <
$xml = simplexml_load_string ( $request ***91; ‘result’ ***93;);

$arList = array( ‘PVZ’ => array(), ‘CITY’ => array(), ‘REGIONS’ => array(), ‘CITYFULL’ => array(), ‘COUNTRIES’ => array());

foreach ( $xml as $key => $val ) <

if ( $_REQUEST ***91; ‘country’ ***93; && $_REQUEST ***91; ‘country’ ***93; != ‘all’ && ((string) $val ***91; ‘CountryName’ ***93; != $_REQUEST ***91; ‘country’ ***93;)) <
continue;
>

$cityCode = (string) $val ***91; ‘CityCode’ ***93;;
$type = (string) $val ***91; ‘Type’ ***93;;
$city = (string) $val ***91; «City» ***93;;
if ( strpos ( $city , ‘(‘ ) !== false )
$city = trim ( substr ( $city , 0 , strpos ( $city , ‘(‘ )));
if ( strpos ( $city , ‘,’ ) !== false )
$city = trim ( substr ( $city , 0 , strpos ( $city , ‘,’ )));
$code = (string) $val ***91; «Code» ***93;;

$arList ***91; $type ***93;***91; $cityCode ***93;***91; $code ***93; = array(
‘Name’ => (string) $val ***91; ‘Name’ ***93;,
‘WorkTime’ => (string) $val ***91; ‘WorkTime’ ***93;,
‘Address’ => (string) $val ***91; ‘Address’ ***93;,
‘Phone’ => (string) $val ***91; ‘Phone’ ***93;,
‘Note’ => (string) $val ***91; ‘Note’ ***93;,
‘cX’ => (string) $val ***91; ‘coordX’ ***93;,
‘cY’ => (string) $val ***91; ‘coordY’ ***93;,
‘Dressing’ => (string) $val ***91; ‘IsDressingRoom’ ***93;,
‘Cash’ => (string) $val ***91; ‘HaveCashless’ ***93;,
‘Station’ => (string) $val ***91; ‘NearestStation’ ***93;,
‘Site’ => (string) $val ***91; ‘Site’ ***93;,
‘Metro’ => (string) $val ***91; ‘MetroStation’ ***93;,
‘AddressComment’ => (string) $val ***91; ‘AddressComment’ ***93;,
);
if ( $val -> WeightLimit ) <
$arList ***91; $type ***93;***91; $cityCode ***93;***91; $code ***93;***91; ‘WeightLim’ ***93; = array(
‘MIN’ => (float) $val -> WeightLimit ***91; ‘WeightMin’ ***93;,
‘MAX’ => (float) $val -> WeightLimit ***91; ‘WeightMax’ ***93;
);
>

$arImgs = array();
if (! is_array ( $val -> OfficeImage )) <
$arToCheck = array(array( ‘url’ => (string) $val -> OfficeImage ***91; ‘url’ ***93;));
> else <
$arToCheck = $val -> OfficeImage ;
>

foreach ( $val -> OfficeImage as $img ) <
if ( strstr ( $_tmpUrl = (string) $img ***91; ‘url’ ***93;, ‘http’ ) === false ) <
continue;
>
$arImgs ***91;***93; = (string) $img ***91; ‘url’ ***93;;
>

if ( count ( $arImgs = array_filter ( $arImgs )))
$arList ***91; $type ***93;***91; $cityCode ***93;***91; $code ***93;***91; ‘Picture’ ***93; = $arImgs ;
if ( $val -> OfficeHowGo )
$arList ***91; $type ***93;***91; $cityCode ***93;***91; $code ***93;***91; ‘Path’ ***93; = (string) $val -> OfficeHowGo ***91; ‘url’ ***93;;

if (! array_key_exists ( $cityCode , $arList ***91; ‘CITY’ ***93;)) <
$arList ***91; ‘CITY’ ***93;***91; $cityCode ***93; = $city ;
$arList ***91; ‘CITYFULL’ ***93;***91; $cityCode ***93; = (string) $val ***91; ‘CountryName’ ***93; . ‘ ‘ . (string) $val ***91; ‘RegionName’ ***93; . ‘ ‘ . $city ;
$arList ***91; ‘REGIONS’ ***93;***91; $cityCode ***93; = implode ( ‘, ‘ , array_filter (array((string) $val ***91; ‘RegionName’ ***93;, (string) $val ***91; ‘CountryName’ ***93;)));
>

krsort ( $arList ***91; ‘PVZ’ ***93;);

return $arList ;
> elseif ( $request ) <
self :: toAnswer (array( ‘error’ => ‘Wrong answer code from server : ‘ . $request ***91; ‘code’ ***93;));
return false ;
>
>

// Calculation
protected static function calculate ( $shipment )
<
$headers = self :: getHeaders ();

$arData = array(
‘dateExecute’ => $headers ***91; ‘date’ ***93;,
‘version’ => ‘1.0’ ,
‘authLogin’ => $headers ***91; ‘account’ ***93;,
‘secure’ => $headers ***91; ‘secure’ ***93;,
‘senderCityId’ => $shipment ***91; ‘cityFromId’ ***93;,
‘receiverCityId’ => $shipment ***91; ‘cityToId’ ***93;,
‘tariffId’ => ( $shipment ***91; ‘tariffId’ ***93;) ? $shipment ***91; ‘tariffId’ ***93; : false
);

if ( $shipment ***91; ‘tariffList’ ***93;) <
foreach ( $shipment ***91; ‘tariffList’ ***93; as $priority => $tarif ) <
$tarif = intval ( $tarif );
$arData ***91; ‘tariffList’ ***93; ***91;***93; = array(
‘priority’ => $priority + 1 ,
‘id’ => $tarif
);
>
>

if ( $shipment ***91; ‘goods’ ***93;) <
$arData ***91; ‘goods’ ***93; = array();
foreach ( $shipment ***91; ‘goods’ ***93; as $arGood ) <
$arData ***91; ‘goods’ ***93; ***91;***93; = array(
‘weight’ => $arGood ***91; ‘weight’ ***93;,
‘length’ => $arGood ***91; ‘length’ ***93;,
‘width’ => $arGood ***91; ‘width’ ***93;,
‘height’ => $arGood ***91; ‘height’ ***93;
);
>
>

$result = self :: sendToCalculate ( $arData );

if ( $result && $result ***91; ‘code’ ***93; == 200 ) <
if (! is_null ( json_decode ( $result ***91; ‘result’ ***93;))) <
return json_decode ( $result ***91; ‘result’ ***93;, true );
> else <
self :: toAnswer (array( ‘error’ => ‘Wrong server answer’ ));
return false ;
>
> else <
self :: toAnswer (array( ‘error’ => ‘Wrong answer code from server : ‘ . $result ***91; ‘code’ ***93;));
return false ;
>
>

Читать еще:  Критерий михайлова matlab

// API
protected static function sendToSDEK ( $where , $XML = false , $get = false )
<
$where .= ‘.php’ . (( $get ) ? «?» . $get : » );
$where = ‘https://integration.cdek.ru/’ . $where ;

if ( $XML )
$XML = array( ‘xml_request’ => $XML );

return self :: client ( $where , $XML );
>

protected static function sendToCalculate ( $data )
<
$result = self :: client (
‘http://api.cdek.ru/calculator/calculate_price_by_json_request.php’ ,
array( ‘json’ => json_encode ( $data ))
);
return $result ;
>

protected static function sendToCity ( $data )
<
$result = self :: client (
‘http://api.cdek.ru/city/getListByTerm/json.php?q=’ . urlencode ( $data )
);
return $result ;
>

protected static function client ( $where , $data = false )
<
if (! function_exists ( ‘curl_init’ )) <
self :: toAnswer (array( ‘error’ => ‘No php CURL-library installed on server’ ));
return false ;
>

$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $where );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , TRUE );
if ( $data ) <
curl_setopt ( $ch , CURLOPT_POST , TRUE );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $data );
>
$result = curl_exec ( $ch );
$code = curl_getinfo ( $ch , CURLINFO_HTTP_CODE );
curl_close ( $ch );
return array(
‘code’ => $code ,
‘result’ => $result
);
>

// LANG
protected static function getLangArray ()
<
return array(
‘YOURCITY’ => ‘Ваш город’ ,
‘COURIER’ => ‘Курьер’ ,
‘PICKUP’ => ‘Самовывоз’ ,
‘TERM’ => ‘Срок’ ,
‘PRICE’ => ‘Стоимость’ ,
‘DAY’ => ‘дн.’ ,
‘RUB’ => ‘руб.’ ,
‘NODELIV’ => ‘Нет доставки’ ,
‘CITYSEATCH’ => ‘Поиск города’ ,
‘CITYSEARCH’ => ‘Поиск города’ ,
‘ALL’ => ‘Все’ ,
‘PVZ’ => ‘Пункты выдачи’ ,
‘MOSCOW’ => ‘Москва’ ,
‘RUSSIA’ => ‘Россия’ ,
‘COUNTING’ => ‘Идет расчет’ ,

‘NO_AVAIL’ => ‘Нет доступных способов доставки’ ,
‘CHOOSE_TYPE_AVAIL’ => ‘Выберите способ доставки’ ,
‘CHOOSE_OTHER_CITY’ => ‘Выберите другой населенный пункт’ ,

‘L_ADDRESS’ => ‘Адрес пункта выдачи заказов’ ,
‘L_TIME’ => ‘Время работы’ ,
‘L_WAY’ => ‘Как к нам проехать’ ,
‘L_CHOOSE’ => ‘Выбрать’ ,

‘H_LIST’ => ‘Список пунктов выдачи заказов’ ,
‘H_PROFILE’ => ‘Способ доставки’ ,
‘H_CASH’ => ‘Расчет картой’ ,
‘H_DRESS’ => ‘С примеркой’ ,
‘H_SUPPORT’ => ‘Служба поддержки’ ,
);
>

// answering
protected static $answer = false ;

protected static function toAnswer ( $wat )
<
$stucked = array( ‘error’ );
if (! is_array ( $wat )) <
$wat = array( ‘info’ => $wat );
>
if (! is_array ( self :: $answer )) <
self :: $answer = array();
>
foreach ( $wat as $key => $sign ) <
if ( in_array ( $key , $stucked )) <
if (! array_key_exists ( $key , self :: $answer )) <
self :: $answer ***91; $key ***93; = array();
>
self :: $answer ***91; $key ***93; ***91;***93; = $sign ;
> else <
self :: $answer ***91; $key ***93; = $sign ;
>
>
>

protected static function printAnswer ()
<
echo json_encode ( self :: $answer );
>
>

В нем строки тарифов

ISDEKservice::setTarifPriority(
array(233, 137, 139, 16, 18, 11, 1, 3, 61, 60, 59, 58, 57, 83),
array(234, 136, 138, 15, 17, 62, 63, 5, 10, 12)
);

и когда я пытаюсь передать тарифы с массива который вывожу с базы данных то тарифы уже не передаются

Вот как я делаю на примере:

$tarifs_pickup = $shipment_params[‘tarifs_pickup’]; // массив с тарифами

$tarifspickup = trim($tarifs_pickup, ‘[]’); // убираю скобки и получаю строку тарифов в виде 233, 137, 139, 16, 18, 11, 1, 3, 61, 60, 59, 58, 57, 83

но когда помещаю переменную то в array их дальше не видно, хотя принтовал саму переменную $tarifspickup точно выводится тарифы в строку.
ISDEKservice::setTarifPriority(
array($tarifspickup),
array(234, 136, 138, 15, 17, 62, 63, 5, 10, 12)
);

Вот именно почему array($tarifspickup) не передается как строка? Что я не так делаю?

Design A Highly Available MySQL Clusters With Orchestrator And ProxySQL In GCP — Part 2

In part1, we explained how we are going to approach the HA setup. Here we can see how to install and configure Orchestrator and ProxySQL, then do the failover testing.

Install and configure MySQL Replication:

We need a MySQL with 4 Read replica and the 4’th replica will have a replica for it. And we must have to use GTID replication. Because once the master failover done, the remaining replicas will start replicating from the new master. Without GTID its not possible, but as an alternate Orchestrator provides Pseudo-GTID.

VM Details:

  • Subnet: 10.142.0.0/24
  • OS: Ubuntu 18.04LTS

Installing MySQL on all servers:

Enable GTID & Other settings:

Do the below changes on all the servers on my.cnf file and restart mysql service.
Note: server-id must be unique for all the servers. So use different ids for other servers.

Create a database with sample data:

Run the below queries on mysql-01

Backup the database:

Run the command on mysql-01

Create the user for replication:

Run the query on mysql-01

Establish the Replication:

Restore the database on the below servers and run the below query.

Setup Replication for Report Server:

Take the dump of report-01 server and restore it on report-ha

Enable SEMI-SYNC replication:

To prevent the dataloss and make sure the pending binlogs on the failover instances during the failover process, we need to enable Semi_sync between mysql-01 and mysql-ha .

Install the plugin on both servers.

Enable Semi-Sync on Master:

rpl_semi_sync_master_timeout — Master will wait for the acknowledgment till this value. Please give this value in milliseconds.

Enable Semi-Sync on Slave (replica-03):

We need to add this parameter in my.cnf as well.

Sometimes it’ll say invalid parameter then use the below lines instead.

Replication part has been done. Now its time to play with Orchestrator.

Install Orchestrator:

Orchestrator VM’s IP address: 10.142.0.4

It’s installed on /usr/local/orchestrator

Configuring Orchestrator:

We have a sample conf file the orchestrator’s home location. We need to copy that file as the main config file.

MySQL Backend:

Orchestrator needs a backend database either SQLite or MySQL. I prefer MySQL. And to make sure this will be in HA, we are going to use CloudSQL with Failover. But for this PoC I have installed MySQL on the server where I have Orchestrator.

So install MySQL and create a database and user for orchestrator.

Orchestrator needs to login on all of your nodes to detect the topology and perform seamless failover and etc. So we need to create a user for Orchestrator on all the servers. Run the below query on mysql-01 it’ll replicate it to all other slaves.

We are using orchestrator in autoscaling, so while creating the user use subnet range for the host.

Edit the Conf file:

Now we need to make the below changes on /usr/local/orchestrator/orchestrator.conf.json

Orchestrator backend details:

MySQL Topology User:

Promotion Node filters:

We want to Promote replica-03 when mysql-01 went down. It should not promote any other replica. So we need to tell don’t promote these nodes.

Other Parameters for failover:

Then start the Orchestrator.

The Web UI will run on port 3000.

To Read about the exact meaning of all parameters read the link.

Ссылка на основную публикацию
Adblock
detector