Сброс соединения mpd5
Для того чтобы выполнить принудительный разрыв соединения mpd, необходимо в консоли выполнить:
1 2 |
ngctl shutdown ngXXX: |
, где ngXXX можно посмотреть по ifconfig
Для того чтобы выполнить принудительный разрыв соединения mpd, необходимо в консоли выполнить:
1 2 |
ngctl shutdown ngXXX: |
, где ngXXX можно посмотреть по ifconfig
Вот если выбирать как писать код, вот так:
1 |
$url = ($path == '') ? 'javascript:void(0)' : "index.php?content_page=$path"; |
Или вот так:
1 2 3 4 5 |
if ($path==""){ $url='javascript:void(0)'; } else { $url="index.php?content_page=$path"; }; |
То я выберу последнее. И меня коробит немножко когда читаю код, написаный в «коротком» стиле. Не роботы же. Может конечно это сила привычки, и со временем, если постоянно писать «сокращенный» код то он становится читаемым «на лету». Но я всё-же за более «человечный» код, чтоб было понятно сразу, без разбора конструкции.
Задача: разрешить пользователям проводить документы только внутри разрешенных им складов.
Частично данная задача успешно решается при помощи RLE и соответствующих ролей. Но! не полностью. Во всяком случае в конфигурации 1С Розница 2.2 нет возможности ограничить пользователя (без изменения конфигураци)…ну например реализовывать товар с «чужого» склада/Магазина, делать перемещение товаров на «чужие» склады (ограничения работают только для Ордеров???).
Решение: используем относительно новую фичу от 1С — подписка на события. А именно на событие «Запись». Данные по которым будем проверять можно пользователю записывать данный документ или нет, будем брать из специально созданного справочника.
Например можно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Функция ПолучитьГруппуПользователя() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ГруппыПользователей.Наименование КАК Наименование |ИЗ | Справочник.ГруппыПользователей КАК ГруппыПользователей |ГДЕ | ГруппыПользователей.Состав.Пользователь.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ПараметрыСеанса.ТекущийПользователь); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); группа=""; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл сообщить(ВыборкаДетальныеЗаписи.Наименование); группа=ВыборкаДетальныеЗаписи.Наименование; конеццикла; возврат группа; КонецФункции Функция ПроверкаВсяческихПрав(Источник, Отказ) Экспорт сообщить("-- какойто негодяй из "+ПолучитьГруппуПользователя()+" хочет записать документ! Проверяем а нужно ли?"); КонецФункции |
В файл my.cnf добавляем/изменяем следующие строки:
1 2 3 4 |
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = radme_rep bind-address = 10.10.0.1 |
Перезапускаем mysql, создаем базу (в моем случае это radme_rep)
В консоли выполняем:
1 2 3 4 5 6 7 |
SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 117 | radme_rep | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) |
Создаем пользователя и даем ему права на операции с БД (под ним будет заходить Сервер 2)
1 2 |
create user 'replicator'@'%' identified by 'password'; grant replication slave on *.* to 'replicator'@'%'; |
В файл my.cnf добавляем/изменяем следующие строки:
1 2 3 4 |
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = radme_rep bind-address = 10.10.0.2 |
Перезапускаем mysql, создаем базу (в моем случае это radme_rep)
В консоли выполняем:
1 2 3 4 5 6 7 |
SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 107 | radme_rep | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) |
Создаем пользователя и даем ему права на операции с БД (под ним будет заходить Сервер 1)
1 2 |
create user 'replicator'@'%' identified by 'password'; grant replication slave on *.* to 'replicator'@'%'; |
В консоли выполняем
1 2 3 |
slave stop; CHANGE MASTER TO MASTER_HOST = '10.10.0.2', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; slave start; |
В консоли выполняем
1 2 3 |
slave stop; CHANGE MASTER TO MASTER_HOST = '10.10.0.1', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 117; slave start; |
На обоих серверах можно в my.cnf добавить строчку
1 |
slave-skip-errors = 1062 |
Для пропуска ошибок вида Error ‘Duplicate entry…’ в случае одновременной записи в таблицу на обоих серверах (при небольшой нагрузке маловероятно). Иначе — необходимо настроить разный автоинскремент на серверах.
1 2 |
auto-increment-increment = 2 auto-increment-offset = 2 |
В консоли на обоих серверах выполняем:
1 2 3 |
RESET MASTER; stop slave; CHANGE MASTER TO ""; |
Далее останавливаем сервер и из папки mysql удаляем все файлы вида
1 2 |
relay-* *.info |
Посмотреть статус репликации можно так:
mysql> SHOW SLAVE STATUS \G;
Поле Seconds_Behind_Master должно стремится к нулю.