Рассматривал вариант написания модуля для ejabberd - отказался : сильная загрузка систем при каждой авторизации, отсутствие возможности создавать независимых от биллинга учетных записей джабера (к примеру с помощью авторегистрации).
По итогам написал сей скрипт, повесил его на события билинга Добавление и Изменение учетных записей. Загрузка системы минимальна, можно создавать не зависимых джабер-пользователей и т.п.
Алгоритм простой - выгребаются пользователи билинга напрямую из базы, в цикле создается один запрос на INSERT с ON DUPLICATE KEY UPDATE (если нет - вставляем, если есть - обновляем пароль), выполняем запрос на в базе джаббера.
На 1000 пользователей работает мнгновенно. Ну а так как вызывается он изредка, то нагрузки лишней не создает совсем.
Правда не удалоь логи писать, в билинге, в правиле файрвола строка
php /netup/utm5/bin/jabber_user_refresh.php >> /netup/utm5/log/jabber_user_refresh.log выполняется, но вывод не перенаправляется. Не знаю почему, да и так сойдет.
Код: Выделить всё
<?php
@ini_set("display_errors", "1");
error_reporting(E_ALL);
$db_host_UTM5 = 'localhost:3306';
$db_base_UTM5 = 'UTM5';
$db_host_Jabber = '10.0.0.9:3306';
$db_base_Jabber = 'ejabberd';
$db_user = 'login'; // сделал один логин на базу биллинга и джабера, чтоб не путаться.
$db_password = 'pass';
print date("d.m.Y H:i").' start'."\r\n";
$db_connect_UTM5=mysql_connect($db_host_UTM5,$db_user,$db_password) or die ("Connect failed");
mysql_select_db($db_base_UTM5,$db_connect_UTM5);
$query_UTM5 = "Select users.login AS username, users.`password` From users Where users.is_deleted = '0'";
$result_UTM5 = mysql_query($query_UTM5,$db_connect_UTM5);
$query_Jabber = "INSERT INTO users (username, password) VALUES ";
while ($row = mysql_fetch_array($result_UTM5)) {
$query_Jabber = $query_Jabber.sprintf("(\"%s\",\"%s\"),", $row[0], $row[1]);
}
$query_Jabber = $query_Jabber."***ON DUPLICATE KEY UPDATE password=password";
$query_Jabber = str_replace(',***',' ',$query_Jabber);
mysql_free_result($result_UTM5);
$db_connect_Jabber = mysql_connect($db_host_Jabber,$db_user,$db_password) or die("Could not connect: " . mysql_error());
mysql_select_db($db_base_Jabber,$db_connect_Jabber) or die ('Can\'t use foo : ' . mysql_error());
mysql_query($query_Jabber,$db_connect_Jabber);
print date("d.m.Y H:i").' stop'."\r\n";
?>