Clickhouse-cdr-import.php
From Initech Technical Wiki
Revision as of 22:40, 18 October 2019 by Timprice (talk | contribs) (Created page with "This script logs into a XC5 softswitch using the JSON api, exports the CDR records and imports them into clickhouse. You'll need the phpclickhouse library which you can g...")
This script logs into a XC5 softswitch using the JSON api, exports the CDR records and imports them into clickhouse.
You'll need the phpclickhouse library which you can get by invoking the command `composer require smi2/phpclickhouse` from the directory that this script is saved in.
#!/usr/bin/php
<?php
require __DIR__ . '/vendor/autoload.php';
require_once('clickhouse_config.php');
require_once('softswitch_config.php');
function is_not_null($val){
return !is_null($val);
}
// Get next CDR ID to request from softswitch by querying the last CDRID from the clickhouse database and adding one.
$db = new ClickHouseDB\Client($clickhouse_config);
$db->database('softswitch');
$db->setTimeout(1.5); // 1500 ms
$db->setTimeout(10); // 10 seconds
$db->setConnectTimeOut(5); // 5 seconds
$result = $db->select('select max(cdrid)+1 as nextcdrid from cdr');
$row = $result->fetchOne();
$nextcdrid = $row['nextcdrid'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, "http://10.1.1.2/api-sys/cdr/?rows=10000&cdrid=${nextcdrid}");
curl_setopt($ch, CURLOPT_USERPWD, "${api_username}:${api_password}");
$json=curl_exec($ch);
curl_close($ch);
if(($json=="[]")||($json===false)) {
//echo "Nothing returned from softswitch for CDR query, oh oh, exiting now!\n";
exit;
}
$array = json_decode($json, true);
$array_count = count($array);
//echo "CDR Array has {$array_count} elements in it\n";
$cdr_count=0;
$stream = fopen('php://memory','r+');
foreach ($array as $line) {
fwrite($stream, json_encode(array_filter($line,'is_not_null')));
$cdr_count++;
}
rewind($stream);
$streamWrite=new ClickHouseDB\Transport\StreamWrite($stream);
$streamWrite->applyGzip();
$callable = function ($ch, $fd, $length) use ($stream) {
return ($line = fread($stream, $length)) ? $line : '';
};
$streamWrite->closure($callable);
$r=$db->streamWrite($streamWrite,'INSERT INTO {table_name} FORMAT JSONEachRow', ['table_name'=>'softswitch.cdr']);