В попытке использовать запуск скриптов по событиям потерпел крах.
Скрипт на добавление и изменение выполнялся почти постоянно с непредсказуемыми интервалами.
Странно. Повесил на событие добавление и изменение скрипт.
Одминку никто не трогает. Друними сбособами тоже (урфа к примеру) ядро не тревожим. В отчете изменения пользователе чисто за этот период. Но скрипт вызывается, причем регулярно:
04.03.2009 15:07:44 start - 04.03.2009 15:07:44 stop
04.03.2009 15:08:28 start - 04.03.2009 15:08:29 stop
04.03.2009 15:11:32 start - 04.03.2009 15:11:32 stop
04.03.2009 15:11:32 start - 04.03.2009 15:11:32 stop
04.03.2009 15:19:14 start - 04.03.2009 15:19:14 stop
04.03.2009 15:19:14 start - 04.03.2009 15:19:14 stop
04.03.2009 15:24:18 start - 04.03.2009 15:24:18 stop
04.03.2009 15:24:18 start - 04.03.2009 15:24:19 stop
04.03.2009 15:30:20 start - 04.03.2009 15:30:20 stop
04.03.2009 15:32:05 start - 04.03.2009 15:32:05 stop
04.03.2009 15:35:31 start - 04.03.2009 15:35:31 stop
04.03.2009 15:41:19 start - 04.03.2009 15:41:19 stop
04.03.2009 15:43:56 start - 04.03.2009 15:43:56 stop
04.03.2009 15:45:11 start - 04.03.2009 15:45:11 stop
Удалось выяснить следующее:
Включение Интернета (через админку, урфу, личный кабинет) интерпретируется как событие Изменение пользователя. Причем выключение игнорируется.
Хотя скорее всего (ИМХО) разработчики просто забыли убрать кусок кода на обработку включения/выключениея инета.
Забыл добавить - Сборка 5.2.1-005
События Добавление, Изменение, удалени.
Убедился в полной неработоспособности встроенных событий билинга.
Сделал свой костыль, может кому пригодится...
Пришлось в user_log добавить поле event_passed тип int default 0, перед использованием сделал UPDATE user_log SET event_passed = 1 (чтобы старые события не лопатить).
Запускаю по крону раз в минуту, можно и чаще.
Можно отслеживать все события и по ним запускать внешние скрипты. Сделал только 3, как билинге.
В пхп не силен, если увидите ошибки - поправьте меня.
Сделал свой костыль, может кому пригодится...
Пришлось в user_log добавить поле event_passed тип int default 0, перед использованием сделал UPDATE user_log SET event_passed = 1 (чтобы старые события не лопатить).
Запускаю по крону раз в минуту, можно и чаще.
Можно отслеживать все события и по ним запускать внешние скрипты. Сделал только 3, как билинге.
В пхп не силен, если увидите ошибки - поправьте меня.
Код: Выделить всё
<?php
$db_host='127.0.0.1:3306';
$db_base='UTM5';
$db_user='юзер';
$db_password='пасс';
$user_add_exec = "";
$user_edit_exec = "php /netup/utm5/bin/jabber_user_refresh.php";
$user_delete_exec = "";
/* События которые можно отслеживать :
add IP group
add service to tariff
add tariff
delete account
delete service from tariff
edit account
edit tariff
link tariff to account
remove tariff
unlink tariff from account
user_add
user_delete
user_edit
Содержимое $row, можно передавать в качестве параметра
$row['id'] => 39211
$row['user_id'] => 2
$row['date'] => 1236864097
$row['who'] => -4
$row['what'] => edit account
$row['comment'] => account <2>: credit changed from 5.000000 to 0.000000.
*/
$db_connect=mysql_connect($db_host,$db_user,$db_password) or die ("Connect failed");
mysql_select_db($db_base,$db_connect);
$query="Select id, user_id,`date`, who, what, `comment` From user_log Where event_passed = '0'";
$result=@mysql_query($query);
while ($row=mysql_fetch_array($result)) {
switch ($row['what']) {
case "user_add":
exec($user_add_exec." ".$row['user_id']);
break;
case "user_edit":
// exec($user_edit_exec." ".$row['user_id']);
exec($user_edit_exec);
break;
case "user_delete":
exec($user_delete_exec." ".$row['user_id']);
break;
}
}
$query="UPDATE user_log SET event_passed = 1 WHERE event_passed = '0'";
@mysql_query($query);
?>
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
Да, думал над этим, но лениво было цикл писатьmikkey finn писал(а):апдейт лучше переделать в том плане, чтоб апдейтить по id записи, иначе можно потерять необработанные записи, появившиеся за время отработки скрипта(да он быстр, но может оказаться недостаточно быстр)

Хотя тут два варианта: перенести апдейт сразу после селекта и надеятся на сверхскорость

Вот вариант с надеждой на сверх скорость
Еще добавил логирование и выполнение нескольких скриптов на событие (их правда бы тоже в массив да в цикле выполнять, но сегодня уже лениво)

Код: Выделить всё
<?php
$db_host='127.0.0.1:3306';
$db_base='UTM5';
$db_user='логин';
$db_password='пасс';
$user_add_exec = "";
$user_edit_exec01 = "php /netup/utm5/bin/jabber_user_refresh.php";
$user_edit_exec02 = "/netup/utm5/bin/utm2arp_dhcp.sh";
$user_delete_exec = "";
$log_file = "/netup/utm5/log/events.log";
/* События которые можно отслеживать :
add IP group
add service to tariff
add tariff
delete account
delete service from tariff
edit account
edit tariff
link tariff to account
remove tariff
unlink tariff from account
user_add
user_delete
user_edit
Содержимое $row, можно передавать в качестве параметра
$row['id'] => 39211
$row['user_id'] => 2
$row['date'] => 1236864097
$row['who'] => -4
$row['what'] => edit account
$row['comment'] => account <2>: credit changed from 5.000000 to 0.000000.
*/
$file_handle = fopen($log_file,"a+");
fwrite($file_handle, date("d.m.Y H:i:s").' start'." - ");
$db_connect=mysql_connect($db_host,$db_user,$db_password) or die ("Connect failed");
mysql_select_db($db_base,$db_connect);
$query="Select id, user_id,`date`, who, what, `comment` From user_log Where event_passed = '0'";
$result=@mysql_query($query);
$query="UPDATE user_log SET event_passed = 1 WHERE event_passed = '0'";
@mysql_query($query);
while ($row=mysql_fetch_array($result)) {
switch ($row['what']) {
case "user_add":
// exec($user_add_exec." ".$row['user_id']);
break;
case "user_edit":
exec($user_edit_exec01);
exec($user_edit_exec02);
fwrite($file_handle, $user_edit_exec01." - ");
fwrite($file_handle, $user_edit_exec02." - ");
break;
case "user_delete":
// print_r($row);
// exec($user_delete_exec." ".$row['user_id']);
break;
}
}
fwrite($file_handle, date("d.m.Y H:i:s").' stop'."\r\n");
fclose($file_handle);
?>
Удивительно, но работает отлично. Сутки - полет нормальный.
По логам мускуля и мунина, никакой белее-менее значимой нагрузки не появилось, да и не могло появитья.
Похоже в билинге теперь есть события, да еще столько разных, прямо простор для творчества
Погоняю скрипт еще с периодичностью в 10 сек - для пущего реалтайма, хотя так часто наверное не нужно.
Тут подумал что на users_log можно повесить trigger на insert чтоб он вывешивал семафор в какой нибудь табличке, но пока наверно это излишество.
По логам мускуля и мунина, никакой белее-менее значимой нагрузки не появилось, да и не могло появитья.
Похоже в билинге теперь есть события, да еще столько разных, прямо простор для творчества

Погоняю скрипт еще с периодичностью в 10 сек - для пущего реалтайма, хотя так часто наверное не нужно.
Тут подумал что на users_log можно повесить trigger на insert чтоб он вывешивал семафор в какой нибудь табличке, но пока наверно это излишество.