Hi folks,
I’m trying to make php daemon that logs answered calls to DB and when the call finished to delete them. I guess I’m reaching some timeouts. My script exits around 23 o’clock (when the PBX is idle). I’m making some checks about the DB timeout, how to be sure that the script will not disconnect from AMI? The source:
<?php
require_once ('/var/lib/asterisk/agi-bin/phpagi/phpagi-asmanager.php');
$manager_ip = "127.0.0.1";
$username = "myuser";
$secret = "mysecret";
$dbhost = "127.0.0.1";
$dbname = "asterisk";
$dbuser = "mydbuser";
$dbpass = "mydbpass";
$dbtable = "current_calls";
$logfile = "/tmp/manager.log";
$dbcon = connect_to_db(); // initial connection
$manager = new AGI_AsteriskManager();
$con = $manager->connect($manager_ip,$username,$secret);
$manager->add_event_handler('bridge','dump_to_db'); //insert all answered calls
$manager->add_event_handler('hangup','dump_to_db'); // delete the corresponding anwered calls
$manager->Events("on");
function connect_to_db() {
global $dbhost, $dbuser, $dbpass, $dbname;
$dbcon = mysql_pconnect($dbhost,$dbuser,$dbpass);
if (!$dbcon) {
logger(mysql_error());
exit();
}
$dbsel = mysql_select_db($dbname);
if (!$dbsel) {
logger(mysql_error());
exit();
}
return $dbcon;
}
function dump_to_db($ecode, $data, $server, $port) {
global $dbcon, $dbtable;
check_db($dbcon); // check if we lost the connection and create if necessary
logger(print_r($data,true));
$event = $data['Event'];
if ($event == "Bridge") {
if (($data['Bridgestate'] != "Link") || ($data['Bridgetype'] != "core")) {
return;
}
$channel1 = mysql_real_escape_string($data['Channel1']);
$channel2 = mysql_real_escape_string($data['Channel2']);
$uniqueid1 = mysql_real_escape_string($data['Uniqueid1']);
$uniqueid2 = mysql_real_escape_string($data['Uniqueid2']);
$callerid1 = preg_replace('/[^0-9+]/','',$data['CallerID1']);
$callerid2 = preg_replace('/[^0-9+]/','',$data['CallerID2']);
//$callerid1 = mysql_real_escape_string($data['CallerID1']);
//$callerid2 = mysql_real_escape_string($data['CallerID2']);
$sql = "INSERT INTO `$dbtable` (";
$sql .= "`channel1`,";
$sql .= "`channel2`,";
$sql .= "`uniqueid1`,";
$sql .= "`uniqueid2`,";
$sql .= "`callerid1`,";
$sql .= "`callerid2`";
$sql .= ") VALUES (";
$sql .= "'$channel1',";
$sql .= "'$channel2',";
$sql .= "'$uniqueid1',";
$sql .= "'$uniqueid2',";
$sql .= "'$callerid1',";
$sql .= "'$callerid2')";
logger($sql);
$result = mysql_query($sql);
if (!$result) {
logger(mysql_error());
exit();
}
} elseif ($event == "Hangup") {
$channel = mysql_real_escape_string($data['Channel']);
$uniqueid = mysql_real_escape_string($data['Uniqueid']);
$callerid = preg_replace('/[^0-9]/','',$data['CallerIDNum']);
//$callerid = mysql_real_escape_string($data['CallerIDNum']);
$sql = "DELETE FROM `$dbtable` WHERE (`channel1` = '$channel' OR `channel2` = '$channel')";
$sql .= " AND (`uniqueid1` = '$uniqueid' OR `uniqueid2` = '$uniqueid')";
$sql .= " AND (`callerid1` = '$callerid' OR `callerid2` = '$callerid')";
$result = mysql_query($sql);
if (!$result) {
logger(mysql_error());
exit();
}
} else {
// we handle Bridge and Hangup for now..
return;
}
}
function check_db($dbcon) {
$status = mysql_ping($dbcon);
if (!$status) {
mysql_close($dbcon);
$dbcon = connect_to_mysql();
}
return $dbcon;
}
function logger($message) {
global $logfile;
if (!empty($logfile)) {
$handle = fopen($logfile,"a");
$data = date("[Y-m-d H:i:s] ");
fwrite($handle,"$data$message");
fwrite($handle,"\n");
fclose($handle);
}
}
?>