本文整理汇总了PHP中log::writeln方法的典型用法代码示例。如果您正苦于以下问题:PHP log::writeln方法的具体用法?PHP log::writeln怎么用?PHP log::writeln使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类log
的用法示例。
在下文中一共展示了log::writeln方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: saveLog
public function saveLog($xml)
{
// !!!
// @todo Вот не знаю стоит ли тут делать так, или все же легче вызвать self::initReqXml(); но там у нас сессия инициализируется
$this->_clientXml = new DOMDocument();
libxml_use_internal_errors(true);
if (!$this->_clientXml->loadXML($xml)) {
$this->_debug = 1;
$xe_levels = array(LIBXML_ERR_WARNING => 'WARNING', LIBXML_ERR_ERROR => 'ERROR', LIBXML_ERR_FATAL => 'FATAL');
foreach (libxml_get_errors() as $xe) {
$err .= $xe_levels[$xe->level] . ": (line: {$xe->line}, column: {$xe->column}): {$xe->message}";
}
libxml_clear_errors();
$this->error(EXTERNAL_ERR_WRONG_REQ, $err);
}
$ns_name = basename($this->_clientXml->documentElement->getAttribute('xmlns:f'));
if ($ns_name == '') {
$ns_name = basename($this->_clientXml->documentElement->getAttribute('xmlns:hh'));
} else {
$ns_name = 'freetray';
}
if ($ns_name == '') {
$ns_name = 'other';
}
$log = new log("external/{$ns_name}-%d%m%Y.log");
$log->writeln('--------------' . getRemoteIP() . '--------------');
$log->writeln($xml);
}
示例2: payment
public function payment($sum)
{
// На бете альфе включаем дебаг режим
if (!is_release()) {
//$sum = 0.1;// @debug
$this->api->setDebug(true);
}
$result = $this->api->requestPayment(round((double) $sum, 2), $this->account->id);
if ($result['status'] == API_Webmoney::STATUS_SUCCESS) {
$process = $this->api->processPayment($this->api->merchant_transaction_id, $result['processor_transaction_id']);
switch ($process['status']) {
case API_Webmoney::STATUS_PAYMENT_PROGRESS:
case API_Webmoney::STATUS_PAYMENT_SUCCESS:
// Зачисляем деньги на бете/альфе
// if(!is_release()) {
// $paymentDateTime = date('d.m.Y H:i');
// $orderNumber = rand(1, 99999999);
// $descr = "WebMoney с кошелька {$this->data['wallet']} сумма - {$sum}, обработан {$paymentDateTime}, номер покупки - $orderNumber";
//
// $this->account->deposit($op_id, $this->account->id, $sum, $descr, 3, $sum, 12);
// }
return true;
break;
case API_Webmoney::STATUS_PAYMENT_FAIL:
ob_start();
var_dump($result);
var_dump($process);
$content = ob_get_clean();
$this->log->writeln("FAIL Payment:\naccount:{$this->account->id}\n");
$this->log->write("Request:\n " . $this->api->last_request->getBody());
$this->log->write("Result:\n {$content}");
return false;
break;
// Отложить платеж на пол часа
// @todo придумать как отложить запрос на потом
//case API_Webmoney::STATUS_PAYMENT_PROCESS:
// Отложить платеж на пол часа
// @todo придумать как отложить запрос на потом
//case API_Webmoney::STATUS_PAYMENT_PROCESS:
default:
return;
break;
}
} else {
ob_start();
var_dump($result);
$content = ob_get_clean();
$this->log->writeln("FAIL Payment:\naccount:{$this->account->id}\n");
$this->log->write("Request:\n " . $this->api->last_request->getBody());
$this->log->write("Result:\n {$content}");
return false;
}
}
示例3: cron
/**
* Берет список записей и генерирует документы
*/
public function cron()
{
$queue = $this->getList();
require_once ABS_PATH . '/classes/log.php';
$log = new log('docgen_cron/' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S: ");
foreach ($queue as $item) {
try {
$docGenClass = $this->getClass($item['class_name'], $item['class_params']);
$docGenClass->setData(mb_unserialize($item['fields']));
$docGenClass->setDocName($item['type'], $item['original_name']);
$docGenClass->beforeGenerate();
if ($docGenClass->isExcel($item['type'])) {
$ok = $docGenClass->generateExcel($item['type']);
} else {
$ok = $docGenClass->generate($item['type']);
}
if ($ok) {
$this->removeItem($item['id']);
} else {
$this->incrementTry($item['id']);
}
} catch (Exception $e) {
$log->writeln(sprintf("id = %s: %s", $item['id'], iconv('CP1251', 'UTF-8', $e->getMessage())));
$this->incrementTry($item['id']);
}
}
}
示例4: _log
/**
* Пишет сообщение в лог.
* @param string $msg сообщение.
*/
private function _log($msg)
{
if (!$this->log) {
return;
}
$this->log->writeln($msg);
}
示例5: _log
private function _log($message, $type = 'info')
{
if (!$this->_log) {
return;
}
$msg = date("Y-m-d H:i:s") . " [{$type}] " . $message;
$this->_log->writeln($msg);
}
示例6: analyze
/**
* Берем таблицы, последний анализ, которых был ранее чем analyze_min_age секунд назад
* или количество изменненных строк > analyze_changed_factor * кол-во строк.
* Сначала идут по времени последнего анализа.
* Вопрос в том, что если сработал обычный автовакуум, то в autovacuum_log статистика не поменяется,
* т.е. не будет известно сколько строк в реальности изменилось с последнего анализа.
* Решение: не принимать во внимание, т.е. просто соблюдаем условия выше. Может случиться "лишний" анализ, не беда.
*/
public function analyze($db_alias, $mode = self::MODE_ANALYZE)
{
$cfg = $this->_config[$mode];
$log = new log($cfg['log_file'], 'w');
// !!! SERVER добавить (для альфы/беты).
$DB = new DB($db_alias);
$log->linePrefix = $this->_config['log_line_prefix'];
$log->writeln('Получаем список таблиц');
$last_av_col = 'COALESCE(maintenance.max(' . ($mode == self::MODE_ANALYZE ? 'pt.last_analyze, pt.last_autoanalyze, ' : '') . "pt.last_vacuum, pt.last_autovacuum), 'epoch')";
$sql = "\n WITH w_stat as (\n SELECT ts.*, pt.*, ts.relid IS NULL as _is_new, {$last_av_col} as _last_av\n FROM pg_stat_user_tables pt\n LEFT JOIN\n maintenance.table_stat ts\n ON ts.relid = pt.relid\n WHERE pt.schemaname = 'public'\n AND pt.n_live_tup + pt.n_dead_tup > 0\n )\n (\n (SELECT *, 0 as ord, 0.00 as ord2 FROM w_stat WHERE (_is_new OR _last_av + interval '?i seconds' <= now()))\n UNION ALL\n (SELECT *, 1, tup_factor FROM w_stat WHERE tup_factor >= ?f)\n )\n ORDER BY ord, ord2 DESC, _last_av\n ";
$tbls = $DB->rows($sql, $cfg['min_age'], $cfg['changed_factor']);
$acnt = 0;
$log->writeln(count($tbls) . ' таблиц');
foreach ($tbls as $t) {
if ($log->getTotalTime(null) >= $cfg['max_duration']) {
$log->writeln('Время истекло.');
break;
}
$DB->query(($mode == self::MODE_VACUUM ? 'VACUUM ' : 'ANALYZE') . " VERBOSE {$t['relname']}");
$cmpls[(int) ($t['_is_new'] == 't')][] = $t['relid'];
$log->writeln(pg_last_notice(DB::$connections[$db_alias]));
++$acnt;
}
// Обновляем статистику.
if ($cmpls[0]) {
$cols = $this->_mt_cols;
unset($cols[0], $cols[1]);
$lcols = implode(',', $cols);
$rcols = 'pt.' . implode(', pt.', $cols);
$sql = "UPDATE maintenance.table_stat ts SET ({$lcols}) = ({$rcols}) FROM pg_stat_user_tables pt WHERE pt.relid IN (?l) AND ts.relid = pt.relid";
$DB->query($sql, $cmpls[0]);
}
if ($cmpls[1]) {
$cols = implode(',', $this->_mt_cols);
$sql = "INSERT INTO maintenance.table_stat ({$cols}) SELECT {$cols} FROM pg_stat_user_tables WHERE relid IN (?l)";
$DB->query($sql, $cmpls[1]);
}
// Удаляем лишние таблицы, типа catalog_positions2 (создаются/удаляются автоматом)
$DB->query('DELETE FROM maintenance.table_stat ts WHERE NOT EXISTS (SELECT 1 FROM pg_stat_user_tables WHERE relid = ts.relid)');
$log->writeln("Обработано {$acnt} таблиц");
}
示例7: get_files
/**
* Копирует массив файлов из WebDav в локальную файловую систему
* Формат входных данных array("remotepath" => "localpath").
*
* @param type $filelist
*
* @return bool
*/
public function get_files($filelist)
{
foreach ($this->_wdcs as $wdc) {
if ($ok = $this->_connect($wdc)) {
$ok = $wdc->mget($filelist);
}
if (!$ok) {
$filelist = implode(', ', array_map(function ($v, $k) {
return sprintf('from:%s to:%s', $k, $v);
}, $filelist, array_keys($filelist)));
$this->_log->writeln("error: could not get files {$filelist}, server: {$wdc->_server}");
} else {
return true;
}
}
return false;
}
示例8: parseFile
/**
* Парсим реестр и генерируем счет-фактуры.
*
* @param type $filename
*/
public function parseFile($filename)
{
//@todo: это не красиво :(
ini_set('max_execution_time', 300);
//ini_set('memory_limit', '512M');
$uri = WDCPREFIX_LOCAL . $this->path . $filename;
$list = array();
$ids = array();
$handle = fopen($uri, 'r');
while (($data = fgetcsv($handle, 1000, ';')) !== false) {
if ($data[0] == 'order_id' || count($data) != 7) {
continue;
}
//order_id;sf_num;sf_date;sf_summa;pp_num;pp_date;pp_type
$res = array('id' => $this->getOrderId($data[0]), 'sf_num' => $data[1], 'sf_date' => $data[2], 'sf_summa' => $data[3], 'pp_num' => $data[4], 'pp_date' => $data[5], 'pp_type' => $data[6]);
$ids[] = $res['id'];
$list[] = $res;
}
fclose($handle);
if ($list) {
$reserveModel = ReservesModelFactory::getInstance(ReservesModelFactory::TYPE_TSERVICE_ORDER);
$empData = $reserveModel->getEmpByReserveIds($ids);
foreach ($list as $key => $data) {
if (!isset($empData[$data['id']])) {
continue;
}
$data['employer']['login'] = $empData[$data['id']]['login'];
$data['employer']['uid'] = $empData[$data['id']]['uid'];
$reserveModel->getReserve($ids[$key]);
$data['employer']['reqv'] = $reserveModel->getEmpReqv();
try {
$doc = new DocGenReserves($data);
$doc->generateFactura();
} catch (Exception $e) {
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/log.php';
$log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', '%d.%m.%Y %H:%M:%S: ');
$log->writeln(sprintf('Order Id = %s: %s', $data['id'], iconv('CP1251', 'UTF-8', $e->getMessage())));
}
}
}
}
示例9: payment
/**
* Автооплата услуги
*
* @param $sum
* @return bool|mixed
*/
public function payment($sum)
{
$this->createOrder($sum);
$this->api->getAccessData('autopay');
$result = $this->api->register($sum, $this->orderNumber, $this->account->id);
if ($result['orderId'] != '') {
walletAlpha::updateOrder($this->orderNumber, array('order_id' => $result['orderId'], 'state' => walletAlpha::STATE_NEW));
$payment = $this->api->paymentOrderBinding($result['orderId']);
switch ($payment['errorCode']) {
case API_AlphaBank::STATUS_SUCCESS:
$status = $this->api->getOrderStatus($result['orderId']);
$update = array('pan' => $status['Pan'], 'expiration' => $status['expiration'], 'cardholder_name' => $status['cardholderName'], 'ip' => $status['Ip'], 'binding_id' => Wallet::des()->encrypt($status['bindingId']));
$update['state'] = $this->deposit($this->account, $this->account->id, $status, $this->data['wallet'], $this->orderNumber, $sum);
$this->updateOrder($this->orderNumber, $update);
break;
default:
// Ошибка оплаты
ob_start();
var_dump($result);
var_dump($payment);
$content = ob_get_clean();
$this->log->writeln("FAIL Payment:\naccount:{$this->account->id}\n");
$this->log->write("Request:\n " . $this->api->last_request->getBody());
$this->log->write("Result:\n {$content}");
return false;
break;
}
} else {
ob_start();
var_dump($result);
$content = ob_get_clean();
$this->log->writeln("FAIL Payment:\naccount:{$this->account->id}\n");
$this->log->write("Request:\n " . $this->api->last_request->getBody());
$this->log->write("Result:\n {$content}");
return false;
//error
}
}
示例10: cron
/**
* @deprecated Не использовать. Выплата делается в очереди PGQ там же и повторяется
*
* Крон переодического опроса API сервиса выплат
* по сделкам в статусе ожидания выплаты
*
* @todo: документация API рекомендует опрашивать с интервалом мах 30 минут
* @todo: возможно не лучшее место для этого?
*
* @param type $limit - количество сделок обрабатываемых за запуск
* @return int - количество успешно обработанных сделок
*/
public function cron($limit = 10)
{
return false;
$reservesModel = new ReservesModel();
$reserveDataList = $reservesModel->getReservesWithStatusPayByService(ReservesModel::SUBSTATUS_INPROGRESS, $limit);
$cnt = 0;
if ($reserveDataList) {
$log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S: ");
foreach ($reserveDataList as $reserveData) {
$reserveInstance = ReservesModelFactory::getInstance($reserveData['type']);
$reserveInstance->setReserveData($reserveData);
$status = $this->payout($reserveInstance, $reserveData['pay_type']);
$is_done = $reserveInstance->changePayStatus($status);
if ($is_done && $reserveInstance->isClosed()) {
$cnt++;
$orderData = array('id' => $reserveData['src_id'], 'reserve_data' => $reserveInstance->getReserveData(), 'reserve' => $reserveInstance, 'employer' => array('login' => $reserveData['emp_login'], 'email' => $reserveData['emp_email']));
try {
$doc = new DocGenReserves($orderData);
$doc->generateActServiceEmp();
$doc->generateAgentReport();
} catch (Exception $e) {
$log->writeln(sprintf("Order Id = %s: %s", $orderData['id'], iconv('CP1251', 'UTF-8', $e->getMessage())));
}
}
}
}
return $cnt;
}
示例11: process_event
public function process_event(&$event)
{
$message = false;
$cid = (string) @$event->data['cid'];
try {
$options = array('cid' => $cid, 'sc' => 'start', 'cd1' => $cid);
if (isset($event->data['uid']) && $event->data['uid'] > 0) {
$options['cd5'] = $event->data['uid'];
}
unset($event->data['uid']);
$ga = StatisticFactory::getInstance('GA', $options);
switch ($event->type) {
case 'service_payed':
$is_emp = (bool) @$event->data['is_emp'];
$label = (string) @$event->data['label'];
$ammount = floatval(@$event->data['ammount']);
$ga->serviceWasPayed($is_emp, $label, $ammount, $cid);
break;
case 'project_answer':
$project_kind_ident = (string) @$event->data['project_kind_ident'];
$offer_count = (int) @$event->data['offer_count'];
$is_pro = (bool) @$event->data['is_pro'];
$offer_id = @$event->data['offer_id'];
$ga->projectAnwer($cid, $project_kind_ident, $offer_count, $is_pro);
break;
case 'newsletter_projects_open_hit':
$type = (int) @$event->data['type'];
$label = (string) @$event->data['label'];
$timestamp = (int) @$event->data['timestamp'];
if ($type == 1) {
$ga->newsletterNewProjectsOpenHitEmp($label, $timestamp);
} else {
$ga->newsletterNewProjectsOpenHitFrl($label, $timestamp);
}
break;
//Обрабатываем методы которые поддерживает $ga инстанс
//Обычно это типовые методы типа GA::event
//Обрабатываем методы которые поддерживает $ga инстанс
//Обычно это типовые методы типа GA::event
default:
unset($event->data['cid']);
$ga->call($event->type, $event->data);
break;
}
//Запись событий в лог
if (is_object($ga) && method_exists($ga, 'getLastRequest')) {
require_once ABS_PATH . '/classes/log.php';
$log = new log('statistic/' . SERVER . '-%d%m%Y.log');
$suffix = '';
if (isset($offer_id) && !empty($offer_id)) {
$suffix = " offer_id={$offer_id}";
}
$log->writeln(date('d.m.Y H:i:s') . ' - ' . $ga->getLastRequest()->getBaseUrlWithQuery() . $suffix);
}
} catch (Exception $e) {
$message = 'Ошибка: ' . $e->getMessage();
}
if ($message) {
$data = '';
foreach ($event->data as $key => $value) {
$data .= $key . '=' . $value . '; ';
}
$log_message = sprintf(self::LOG_FORMAT, $event->type, $data, $message);
$this->log->notice(iconv('CP1251', 'UTF-8', $log_message));
//Повторить через 60 сек
//$event->retry_delay = 60;
//return PGQ_EVENT_RETRY;
}
return PGQ_EVENT_OK;
}
示例12: create
/**
* @todo: рекомендуется не использовать замена см addServiceAndCheckout
*
* Создаем запись в "Списке услуг"
*
* @param int $op_code ИД операции по которой создаем запись (@see table op_codes)
* @param int $auto Автопродление для этого типа услуг
* @param bool $clean_queue Очистить очередь
*
* @return int Возвращает ИД созданной услуги
*/
public function create($op_code, $auto = 0, $clean_queue = true)
{
//Чистим корзину заказов
if ($clean_queue) {
$this->cancelAllNewAndReserved();
}
//Эти приготовления делаются без учета скидки и
//только потом она будет использована если имеется
if (in_array($op_code, self::getOpcodesByAutopayed('pro'))) {
// Определяем автоматическую подставку автопро если не пользовались услугами долгое время
$this->loadMainData();
if (isset($this->list_types_services['notused']['pro'])) {
$auto = 1;
}
}
//Пробуем получить скидку
$op_code = $this->getDiscountOpCode($op_code);
//Подготовка к покупке
$options = $this->prepareOperationCode($op_code);
$log = new log('billing/create-' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S:\r\n");
$log->writeln("create order ({$op_code}, {$auto})");
$log->write("login:{$this->user['login']}, uid:{$this->user['uid']}, account:{$this->acc['id']}, acc_sum:{$this->acc['sum']}\r\n");
ob_start();
var_dump($options);
$out = ob_get_clean();
$log->write($out);
$log->write("\r\n--------------------\r\n\r\n");
if (empty($options)) {
return false;
}
$data = array('uid' => $this->user['uid'], 'op_code' => $op_code, 'auto' => $auto == 1 ? true : false);
$insert = array_merge($data, $options);
return $this->_db->insert('bill_queue', $insert, 'id');
}
示例13: setIsAllowed
/**
* Разрешить отправку сообщений.
*
* @global type $DB
*
* @param type $to_id
* @param type $from_id
*
* @return bool
*/
public static function setIsAllowed($to_id, $from_id, $stop_check = false)
{
global $DB;
if (!$stop_check && self::_isAllowed($to_id, $from_id)) {
return true;
}
$DB->val('
INSERT INTO ' . self::TABLE_ALLOWED . ' (to_id, from_id)
SELECT ?i, ?i WHERE NOT EXISTS(SELECT 1 FROM ' . self::TABLE_ALLOWED . '
WHERE to_id = ?i AND from_id = ?i LIMIT 1);
', $to_id, $from_id, $to_id, $from_id);
$mem = new memBuff();
$cache_tag_key = sprintf(self::CACHE_TAG_IS_ALLOWED, $from_id);
$mem->delete($cache_tag_key);
if (is_beta()) {
require_once ABS_PATH . '/classes/log.php';
$log = new log('debug/0029319-%d%m%Y.log');
$log->writeln('----- ' . date('d.m.Y H:i:s'));
$log->writeln("to_id = {$to_id}, from_id = {$from_id}");
}
}
示例14: refund
/**
* Возврат денежных средств.
*
* @global type $DB
*
* @param type $payment_id ИД операции в paymaster
*
* @return bool
*/
public function refund($payment_id = null, $stage = null, $debug = false)
{
global $DB;
$log = new log('pmpay/refundPayments-%d%m%Y.log', 'a', '%d.%m.%Y %H:%M:%S : ');
$log->writeln("payment_id = [{$payment_id}], stage = [{$stage}], debug = [{$debug}]");
if (!$payment_id) {
return false;
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pmpay.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/exrates.php';
$pmpay = new pmpay();
// Возврат осуществляется только при резервировании через WMR
$sql = 'SELECT * FROM sbr_stages_payouts WHERE stage_id = ?i AND user_id = ?i AND is_refund IS NULL;';
$row = $DB->row($sql, $stage->id, $stage->sbr->emp_id);
// Возврат осуществляется только для работодателей
if ($row) {
if (DEBUG) {
$log->writeln('debug_mode = ON');
$pmpay->setDebugUrl($GLOBALS['host'] . '/norisk2/admin/pm-server-test.php');
}
$operation = (array) $pmpay->refundPayments($payment_id, $row['credit_sum']);
if ($operation && $operation['Status'] != 'FAILURE' && $operation['ErrorCode'] == 0) {
if ($operation['Status'] == 'EXECUTING' || $operation['Status'] == 'PENDING') {
$update = array('is_refund' => false, 'refund_id' => $operation['RefundID']);
$this->refundStatusUpdate($update, $row['id']);
} elseif ($operation['Status'] == 'SUCCESS') {
$update = array('is_refund' => true, 'refund_id' => $operation['RefundID'], 'completed' => 'NOW()');
$this->refundStatusUpdate($update, $row['id']);
} else {
$update = array('is_refund' => null, 'refund_id' => $operation['RefundID']);
$this->refundStatusUpdate($update, $row['id']);
}
}
} else {
$log = new log('pmpay/refundPayments-%d%m%Y.log', 'a', '%d.%m.%Y %H:%M:%S : ');
$log->writeln("Ошибка выдачи SQL -- [{$DB->sql}].");
}
}
示例15: __destruct
/**
* Деструктор. Закрывает открытую транзакцию и записывает в файл(ы) debug информацию.
*
*/
public function __destruct()
{
--self::$objects;
if ($this->debugLog) {
$log = new log("db/" . $this->alias . "/debug/" . $this->debug);
for ($i = 0; $i < count($this->debugLog); $i++) {
$log->writeln($this->debugLog[$i]['text']);
}
}
$log = new log("db/" . $this->alias . '/' . date('Y-m-d') . ".log");
if ($this->log) {
$log->writeln($this->log);
}
if ($this->_transaction) {
$rollback = false;
$xstat = pg_transaction_status($this->_transaction);
$xcodes = array(PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN', PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE', PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS', PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR', PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE');
switch ($xstat) {
case PGSQL_TRANSACTION_INTRANS:
case PGSQL_TRANSACTION_INERROR:
case PGSQL_TRANSACTION_ACTIVE:
$rollback = true;
break;
}
if ($rollback) {
$err = "Transaction status is BAD and it rollbacked: {$xcodes[$xstat]}, name=" . $this->alias;
$this->rollback();
} else {
$err = "Transaction counter is BAD on DESTRUCT: status {$xcodes[$xstat]}";
$this->_transaction = NULL;
}
$this->err($err);
}
if (!self::$objects) {
setLastUserAction();
if (DB::$_stby_log) {
// можно убрать, отладочное.
$stby_db = new DB('stat');
setlocale(LC_ALL, 'en_US.UTF-8');
foreach (DB::$_stby_log as $key => $val) {
list($val['day'], $val['real_mask'], $val['opts']) = explode('=', $key);
$sql = "\n UPDATE stby_log2\n SET master_cnt = master_cnt + ?i, standby_cnt = standby_cnt + ?i,\n master_time = master_time + interval ?, standby_time = standby_time + ?, ro_errors_cnt = ro_errors_cnt + ?i\n WHERE day = ? AND opts = ? AND real_mask = ?i\n ";
$res = $stby_db->query($sql, (int) $val['master_cnt'], (int) $val['standby_cnt'], (double) $val['master_time'] . ' seconds', (double) $val['standby_time'] . ' seconds', (int) $val['ro_errors_cnt'], $val['day'], $val['opts'], (int) $val['real_mask']);
if (!pg_affected_rows($res)) {
$sql = "\n INSERT INTO stby_log2 (master_cnt, standby_cnt, master_time, standby_time, ro_errors_cnt, day, opts, real_mask)\n VALUES (?i, ?i, ?, ?, ?i, ?, ?, ?i)\n ";
$stby_db->query($sql, (int) $val['master_cnt'], (int) $val['standby_cnt'], (double) $val['master_time'] . ' seconds', (double) $val['standby_time'] . ' seconds', (int) $val['ro_errors_cnt'], $val['day'], $val['opts'], (int) $val['real_mask']);
}
}
}
DB::$_stby_log = array();
}
}