VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Asterisk and PHP - оптимизация и разгрузка сервера

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Sanek
Сообщения: 81
Зарегистрирован: 17 май 2012, 14:55

Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Sanek »

Всем привет!
Астериск используется для обработки транзитного трафика: сортировка по каналам, ограничение одновременных звонков... и еще куча прибамбасов.
Для всего этого используется самопальный диалплан с использованием MYSQL и PHP - всё работает почти нормально, за исключением одного "но":

на некоторых маршрутах довольно высокая скорость потока звонков (в пики до 15-20 новых в сек.) и естественно всё это "умирает"... при разборе полетов выяснилось, что почти 99% серверных ресурсов используется на обработку поступающих (новых) звонков из-за частых обращений к MYSQL базе и вызове скриптов PHP. Было принято решение оптимизировать диалплан на предмет минимального обращения к базе и внешним РНР скриптам, но уперся в недостаточность знаний самого астериска, а время на доработку поджимает...
Сам диалплан:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

[pools]
; звонки обрабатываются согласно префикса отделенного "#"
;ограничение одновременных звонков в секунду
exten => _X.,1,NoOp()
exten => _X.,n,Set(endtrunk='NULL'); задание переменной для корректного завершения при ошибках вызова внешних скриптов
exten => _X.,n,Set(CPS=2); предел Call Per Sec (звонков в секунду)
exten => _X.,n,GotoIf($[${calcount${CUT(EXTEN,#,1)}}=""]?resetcps); проверяем наличие голб. переменной счетчика CPS привязанного к префиксу... если нет - инициализируем "0"
exten => _X.,n,Set(GLOBAL(calcount${CUT(EXTEN,#,1)})=$[${calcount${CUT(EXTEN,#,1)}}+1]); если счетчик CPS есть - увеличиваем его на 1
;exten => _X.,n,NoOp(****timestamp_old=${timestamp${CUT(EXTEN,#,1)}}***timestamp_new=${EPOCH}******calcount=${calcount${CUT(EXTEN,#,1)}}); проверка что получилось...
exten => _X.,n,GotoIf($[${timestamp${CUT(EXTEN,#,1)}}<${EPOCH}]?resetcps:setstamp); если новая секунда - обнуляем счетчик, если нет - обновляем timestamp
exten => _X.,n(resetcps),Set(GLOBAL(calcount${CUT(EXTEN,#,1)})=0); сброс счетчика
exten => _X.,n(setstamp),Set(GLOBAL(timestamp${CUT(EXTEN,#,1)})=${EPOCH}); обновление timestamp
exten => _X.,n,GotoIf($[${calcount${CUT(EXTEN,#,1)}}>${CPS}]?han34); если лимит превышен - отбой
;---------------------------------
;параметры подключения к БД
exten => _X.,n,Set(DBHOST="localhost")
exten => _X.,n,Set(DBUSER="asteriskuser")
exten => _X.,n,Set(DBPASS="Vladimir")
exten => _X.,n,Set(DB="asteriskpooldb")
exten => _X.,n,Set(resh=${FIELDQTY(EXTEN,#)})
exten => _X.,n,NoOp(******resh=${resh}******** DBHOST= ${DBHOST}  DBUSER= ${DBUSER} DBPASS= ${DBPASS} DB= ${DB}*************)
exten => _X.,n,GotoIf($[${resh}==1]?han:)
;---------------------------------

;обработка префикса
exten => _X.,n,Wait(1)
exten => _X.,n,Set(prefixp=${CUT(EXTEN,#,1)})
exten => _X.,n,Set(p=+)
exten => _X.,n,Set(lenprefixp=$[${LEN(${prefixp})}+1])
exten => _X.,n,NoOp(***p=${p}*****lenprefixp=${lenprefixp}****** UNIQUEID = ${UNIQUEID}*************)
exten => _X.,n,MYSQL(Connect connid ${DBHOST} ${DBUSER} ${DBPASS} ${DB})
;exten => _X.,n,NoOp(**************connid=${connid} callerid = ${CALLERID(num)} tt ${CALLERID}*************)
exten => _X.,n,MYSQL(Query resultid ${connid} SELECT poolid,name,prefix,maxtrunks,maxcalls,maxsec,whitesec,blackcalls,trunks,metodbal,busttmp,bloff,blmanage,wloff,wlmanage,disabled,bl_name,wl_name,bl_wl,record_call FROM pools WHERE prefix='${prefixp}' ); из БД берем параметры транков для этого префикса
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} poolid name prefix maxtrunks maxcalls maxsec whitesec blackcalls trunks metodbal busttmp bloff blmanage wloff wlmanage disabled bl_name wl_name bl_wl record_call)
;exten => _X.,n,NoOp(***${resultid}****fetchid=${fetchid}******* ${poolid} ${name} ${dst} ${maxcalls} ${whitesec} ${blackcalls} ${trunks} ${metodbal} disabled = ${disabled} ${blmanage} ${wlmanage} ${bl_name} ${wl_name} ${bl_wl} record_call=${record_call}*************)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,MYSQL(Disconnect ${connid})
exten => _X.,n,Set(tel_out=${EXTEN:${lenprefixp}})
;------------------------------------

exten => _X.,n,Set(redialcount${tel}=0); сбрасываем (инициализируем) счетчик попыток дозвона по исх. номеру....


; Счетчик активных каналов
exten => _X.,n,Set(GROUP()=${prefixp})
;exten => _X.,n,NoOp(-----------GROUP${prefixp}--------------CALL_COUNT=${GROUP_COUNT(${prefixp})})
exten => _X.,n,GotoIf($[${GROUP_COUNT(${prefixp})} > ${maxtrunks}]?han:); если ограничение одонвр. звонков превышено - отбой
;-----------------------------------------


exten => _X.,n(redial),NoOp(************** trunks=${trunks} *************); метка повтора дозвона
exten => _X.,n,Set(GLOBAL(redialcount${tel_out})=$[${redialcount${tel_out}}+1])
exten => _X.,n,NoOp(************** redialcount${tel_out}=${redialcount${tel_out}} *************)
exten => _X.,n,GotoIf($[${redialcount${tel_out}} > ${maxtrunks}]?han:); если исчерпали лимит исх. каналов - отбой

;проверка доступности исх. каналов
exten => _X.,n,ChanIsAvail(${trunks},as)
exten => _X.,n,Set(chanall=${FIELDQTY(AVAILSTATUS,&)})
exten => _X.,n,Set(varstat=${AVAILSTATUS})
exten => _X.,n,Set(varav=0); колич. доступных каналов
exten => _X.,n,Set(varnoav=0); колич. недоступных каналов
;цикл прохода по каналам
exten => _X.,n,While($["${SET(var=${SHIFT(varstat,&)})}"!=""])
exten => _X.,n,Set(varav=${IF($[${var}=1]?${MATH(${varav}+1,int)}:${varav})})
exten => _X.,n,Set(varnoav=${IF($[${var}=5]?${MATH(${varnoav}+1,int)}:${varnoav})})
exten => _X.,n,Set(varnoav=${IF($[${var}=4]?${MATH(${varnoav}+1,int)}:${varnoav})})
exten => _X.,n,EndWhile
;-------------------------------------
exten => _X.,n,NoOp(**$[${chanall}-${varav}-${varnoav}]**${IF($[${maxtrunks}>$[${chanall}-${varav}-${varnoav}]]?yes:${varnoav})}***${IF($[${EXTEN:${lenprefixp}:1}=7]?+:)}***maxtrunks=${maxtrunks}**** varav=${varav} *****varnoav=${varnoav}****chanall=${chanall}****)
exten => _X.,n,NoOp(************** AVAILCHAN=${AVAILCHAN}**AVAILORIGCHAN=${AVAILORIGCHAN}**AVAILSTATUS=${AVAILSTATUS}**AVAILCAUSECODE=${AVAILCAUSECODE})
exten => _X.,n,GotoIf($[${IF($[${maxtrunks}>$[${chanall}-${varav}-${varnoav}]]?yes:${varnoav})}!=yes]?han:); если свободного доступного канала нет - отбой



exten => _X.,n,GotoIf($[${bl_wl}!=off]?bwl:disc) ;проверка на включение белого и черного списков
exten => _X.,n(bwl),GotoIf($[${bl_wl}=bl]?bl:wl)
exten => _X.,n(wl),MYSQL(Connect connid ${DBHOST} ${DBUSER} ${DBPASS} ${DB})
exten => _X.,n,MYSQL(Query resultid ${connid} SELECT tel FROM ${wl_name} WHERE tel='${EXTEN:${lenprefixp}}' ) ;проверка белого списков
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} tel)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,MYSQL(Disconnect ${connid})
exten => _X.,n,NoOp(*******fetchid=${fetchid}******* ${tel}*************)
exten => _X.,n,GotoIf($[${tel}!=${EXTEN:${lenprefixp}}]?han:disc)
exten => _X.,n(bl),MYSQL(Connect connid ${DBHOST} ${DBUSER} ${DBPASS} ${DB})
exten => _X.,n,MYSQL(Query resultid ${connid} SELECT tel FROM ${bl_name} WHERE tel='${EXTEN:${lenprefixp}}' ) ;проверка черного списков
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} tel)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,MYSQL(Disconnect ${connid})
exten => _X.,n,NoOp(*******fetchid=${fetchid}******* ${tel}*************)
exten => _X.,n,GotoIf($[${tel}=${EXTEN:${lenprefixp}}]?han:disc)
exten => _X.,n(disc),NoOp(*** ${resultid})





exten => _X.,n,AGI(poolscript.php,${prefixp},${AVAILORIGCHAN},${EXTEN:${lenprefixp}},${AVAILSTATUS}); РНР скрипт выбора исх. канала (имя канала возвращает в переменной endtrunk
exten => _X.,n,Verbose(${endtrunk})
exten => _X.,n,GotoIf($[${endtrunk}='NULL']?han34:); если канал не выбран - отбой
exten => _X.,n,MYSQL(Connect connid ${DBHOST} ${DBUSER} ${DBPASS} ${DB}) ;Выполняем SQL-запрос для получения парамеров trunks
exten => _X.,n,MYSQL(Query resultid ${connid} SELECT trunkid, name, prefix, tech, maxcalls, maxtime, calls, time, disabled, timeout, lastcall FROM trunks WHERE name='${endtrunk}' )
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} trunkid trunkname prefixt tech maxcalls maxtime calls time disabled timeout lastcall)
exten => _X.,n,NoOp(****${resultid}****$[${chanall}-${varav}-${varnoav}]**${IF($[${maxtrunks}>$[${chanall}-${varav}-${varnoav}]]?yes:${varnoav})}***${IF($[${EXTEN:${lenprefixp}:1}=7]?+:)}***maxtrunks=${maxtrunks}**** varav=${varav} *****varnoav=${varnoav}****chanall=${chanall}****)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,MYSQL(Disconnect ${connid})
exten => _X.,n,NoOp(*****${IF($[${endtrunk}='NULL']?+:)}********* endtrunk = ${endtrunk} *************)
exten => _X.,n,GotoIf($[${endtrunk}='NULL']?han34:)


;включение записи разговоров
exten => _X.,n,NoOp(*****record_call=${record_call}*************)
exten => _X.,n,GotoIf($[${record_call}=on]?call_rec:dial); если запись включена...
exten => _X.,n(call_rec),MixMonitor(/home/rec/${endtrunk}-${tel}-${filename}.wav); формируем файл
;------------------------------------
exten => _X.,n(dial),Dial(SIP/${endtrunk}/${prefixt}${EXTEN:${lenprefixp}},120,tT); собственно вызов
exten => _X.,n,NoOp(**************  DIALSTATUS= ${DIALSTATUS}******)
exten => _X.,n,GotoIf($[${DIALSTATUS}='FAILED']?redial); если неудачно - пробуем еще раз в другой канал
exten => _X.,n,Goto(h,1)
exten => _X.,n(han),HangUp(34)
exten => _X.,n(han34),HangUp(34)


exten => h,1,NoOp(************** UNIQUEID = ${UNIQUEID} *************)
exten => h,n,GotoIf($[${endtrunk}='NULL']?end:); при невыбранном исх. канаеле нет смысла в дальнейшей обработке....
exten => h,n,Set(cdrdur=${CDR(duration)}); длит. соединения
exten => h,n,NoOp(************** CHANNEL=${CHANNEL} ****** cdrdur=${cdrdur}****cdrbill=${CDR(billsec)}***)
exten => h,n,AGI(trunkscript-m.php,${endtrunk},${CDR(billsec)},${prefixp},${tel}); вызываем скрипт обработки завершенного вызова
exten => h,n(end),NoOp(************** UNIQUEID = ${UNIQUEID} *************)
скрипт выбора исх. каналов (транков) poolscript.php:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

#!/usr/bin/php -q
<?php
/* Скрипт для для обработки звонков пула
Принимаются три аргумента
arg1 - префикс (номер) пула
arg2 - список свободных транков
arg3 - номер (exten)
*/

$db_username = "asteriskuser";
$db_password = "Vladimir";
$db_hostname = "localhost";
$database = "asteriskpooldb";
$cdrdatabase = "asteriskcdrdb";
$monitor = "/var/spool/asterisk/monitor/";
$stat = "\n--------Time start: ".time()."--------\n";

//ведение лог -файла
$temp = "/var/log/asterisk/asterstat-$argv[1].txt";
$handle = fopen($temp, "a");


$mydata=array();
$mydata = explode("&",$argv[2]);
$chnambefree = count($mydata);
foreach ($mydata as $key => $val) {
$mydata[$key]= str_replace('SIP/','',$val);
}

//echo "$mydata[0]"."$mydata[1]"."\r\n";
// Соединяемся, выбираем базу данных
$link = mysql_connect($db_hostname, $db_username, $db_password)
    or die('Не удалось соединиться: ' . mysql_error());
/*echo 'Соединение успешно установлено';*/
mysql_select_db($database) or die('Не удалось выбрать базу данных');
// Выполняем SQL-запрос для получения парамеров pool
$query = "SELECT poolid, name, prefix, maxtrunks, maxcalls, maxsec, whitesec, blackcalls, trunks, metodbal, busttmp, bloff, wloff, disabled, blmincalltime, bl_name, wl_name  FROM pools WHERE prefix='$argv[1]'";
$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
$pools = mysql_fetch_array($result, MYSQL_ASSOC);
//echo $pools['poolid'].$pools['name'].$pools['prefix'].$pools['maxtrunks'].$pools['maxcalls'].$pools['maxsec'].$pools['whitesec'].$pools['blackcalls'].$pools['trunks'].$pools['metodbal'].$pools['busttmp'].$pools['bloff'].$pools['wloff'].$pools['disabled']."\n\r";
mysql_free_result($result);
//всего транков в пуле
$trunksnm = array();
$trunksnm = explode("&",$pools['trunks']);
$chnambeall = count($trunksnm); //всего транков в пуле
//echo $chnambeall."chnambeall\n\r";
foreach ($trunksnm as $key1 => $val) {
$trunksnm[$key1]= str_replace('SIP/','',$val);
}
$chanunreg = substr_count($argv[4],'5');
$freetrunks = array();
//echo $chanunreg;
//проверка на разрешенное количество занятых линий в пуле
//if($pools['maxtrunks'] < $chnambeall-$chnambefree-$chanunreg) {
//	$stat .= " Превышено колич. одновременных звонков в пулле \n";
//	return;
//	}
//print_r( $mydata);
// Выполняем SQL-запрос для получения парамеров trunks
$i=0;
foreach ($mydata as $key => $value) {
// Выполняем SQL-запрос
    $query = "SELECT trunkid, name, tech, maxcalls, maxtime, calls, time, disabled, timeout, lastcall FROM trunks WHERE name='$value'";
    $result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

/* получаем данные о транке */
    $trunk[$value] = mysql_fetch_array($result, MYSQL_ASSOC);
//    $stat .= $stat.$trunk[$value]['name'].$trunk[$value]['tech'].$trunk[$value]['maxcalls'].$trunk[$value]['maxtime'].$trunk[$value]['calls'].$trunk[$value]['time'].$trunk[$value]['disabled']."\n";
    //Проверяем - отключен ли транк
    //print_r( $trunk[$value]);
    if($trunk[$value]['disabled']=='on') {
	continue;
	}

//проверяем время задержки 
$timeuottmp= time()-$trunk[$value]['lastcall'];
//echo "Таймаут не прошел еще $timeuottmp \n\r";
    if($timeuottmp<$trunk[$value]['timeout']) {
//   echo "Таймаут не прошел еще $timeuottmp \n\r";
    continue;
    }

    //порверяем, нет ли привышение транком максимального времени разговора $pools['maxsec']и максимального количества звонков $trunk[$value]['maxcalls']
    if($trunk[$value]['maxcalls']==0) {
	if($trunk[$value]['maxtime']==0) {
	    $freetrunks[$i] = $trunk[$value]['name'];
	    //echo $freetrunks[$i]."\n\r";
	    $i++;
	}
	elseif($trunk[$value]['time']<=$trunk[$value]['maxtime']) {
	    $freetrunks[$i] = $trunk[$value]['name'];
	    //echo $freetrunks[$i]."\n\r";
	    $i++;
	} 
	else {continue;}
    }
    elseif($trunk[$value]['calls']<=$trunk[$value]['maxcalls']) { 
	if($trunk[$value]['maxtime']==0) {
	    $freetrunks[$i] = $trunk[$value]['name'];
	    $stat .= $freetrunks[$i]."\n";
	    $i++;
	}
	elseif($trunk[$value]['time']<=$trunk[$value]['maxtime']) {
	    $freetrunks[$i] = $trunk[$value]['name'];
	    $stat .= $freetrunks[$i]."\n";
	    $i++;
	} 
	else {continue;}
    } 
    else {continue;}
//print_r($freetrunks);
}

// Проверка на включение черного списка
//if($pools['bloff'] == 'on') {
//// Выполняем SQL-запрос для проверки черного списка
//	//echo "черный списк включен\n\r";
//	$query = "SELECT tel  FROM ".$pools['bl_name']." WHERE tel='$argv[3]'";
//	$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
//	$blist = mysql_fetch_array($result, MYSQL_ASSOC);
//	if($blist['tel']==$argv[3]) {
//		$stat = $stat.$blist['telnmb']."присутствует в черном списке\n";
//		mysql_free_result($result);
//		return; //завершаем обработку
//		}
//	}

// Проверка на включение белом списка
//if($pools['wloff'] == 'on') {
//// Выполняем SQL-запрос для проверки белого списка
//	$query = "SELECT tel  FROM ".$pools['wl_name']." WHERE tel='$argv[3]'";
//	$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
//	$wlist = mysql_fetch_array($result, MYSQL_ASSOC);
//	if($wlist['tel']!=$argv[3]) {
//		$stat = $stat.$wlist['tel']."не присутствует в белом списке\n";
//		mysql_free_result($result);
//		return; //завершаем обработку
//		}
//		//else echo $wlist['tel']."присутствует в белом списке\n\r";
//	}

//если метод случайный выбор
if($pools['metodbal']=='rand') {
$trunkkey = array_rand( $freetrunks);
//print_r($freetrunks);
$endtrunk = $freetrunks[$trunkkey];
	//echo $freetrunks[$trunkkey]."rand\n\r";
	}

//если метод посл. перебор
if($pools['metodbal']=='bust') {
	if($pools['busttmp']==NULL) {
		$endtrunk = $freetrunks[0];
		//echo $endtrunk."bust\n\r";
		$query = "UPDATE pools SET busttmp='$endtrunk' WHERE prefix='$argv[1]'";
		$result1 = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
	}
	else {          //??????????????
			$bustkey = array_search($pools['busttmp'],$trunksnm );
			$tempbust = $trunksnm[$bustkey];
		while(in_array($tempbust,$trunksnm))  {
			if($bustkey==$chnambeall-1) { //если достигнут конец массива
			$endtrunk = $freetrunks[0];
			$query = "UPDATE pools SET busttmp='$endtrunk' WHERE prefix='$argv[1]'";
			$result1 = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
			break;
			}

			$bustkey++;
			$tempbust = $trunksnm[$bustkey];
			//echo $bustkey."keybust\n\r";
			//$tempbust = next($trunksnm);
			//echo $tempbust."keybust\n\r";
 		if(in_array($tempbust,$freetrunks )) {  //если есть в массиве $freetrunks
			$endtrunk = $trunksnm[$bustkey];
			 //echo $endtrunk."keybust\n\r";
			$query = "UPDATE pools SET busttmp='$endtrunk' WHERE prefix='$argv[1]'";
			$result1 = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
			break;
			 }
		else {continue;}
			}
		}
	}

// Освобождаем память от результата
//mysql_free_result($result1);
// Закрываем соединение
mysql_close($link);
//$sout = fopen('/home/gik/sout', 'w');
//echo "\n\r";
//fputs($sout,"SET VARIABLE endtrunk $endtrunk");
//fclose($sout);
$stdout = fopen('php://stdout', 'w');
//echo "\n\r";
fputs($stdout,"SET VARIABLE endtrunk $endtrunk");
//$stat .= "Выбран транк. $endtrunk \n";
//fwrite($handle, $stat);
fclose($handle); // происходит закрытие файла

?>
trunkscript-m.php:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

#!/usr/bin/php -q
<?php
/* Скрипт для для обработки статистики  звонков пула
Принимаются три аргумента
arg1 - транк 
arg2 - длительность разговора 
arg3 - pool prefix
arg4 - номер

*/

$db_username = "asteriskuser";
$db_password = "Vladimir";
$db_hostname = "localhost";
$database = "asteriskpooldb";
$cdr = "asteriskcdrdb";
$trunks= "trunks";
$pools = "pools";

$timem=ceil($argv[2]/60);
// Соединяемся, выбираем базу данных
$link = mysql_connect($db_hostname, $db_username, $db_password)
    or die('Не удалось соединиться: ' . mysql_error());
/*echo 'Соединение успешно установлено';*/
mysql_select_db($database) or die('Не удалось выбрать базу данных');
// Выполняем SQL-запрос для получения парамеров trunks
$query = "SELECT trunkid, name, tech, maxcalls, maxtime, calls, time, disabled FROM $trunks WHERE name='$argv[1]'";
$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

/* получаем данные о транке */
$trunk = mysql_fetch_array($result, MYSQL_ASSOC);
// Освобождаем память от результата
mysql_free_result($result);

//echo $trunk['trunkid'].$trunk['name'].$trunk['tech'].$trunk['maxcalls'].$trunk['maxtime'].$trunk['calls'].$trunk['time'].$trunk['disabled']."\n\r";
$trunk['time'] = $trunk['time']+$timem;
$trunk['calls']++;
if($trunk['maxcalls']<=$trunk['calls'] ) {
	$trunk['disabled'] = 'on';
	}

if($trunk['maxtime']<=$trunk['time'] ) {
	$trunk['disabled'] = 'on';
	}
$lastcall = time();
//echo $trunk['name'].$trunk['maxcalls'].$trunk['maxtime'].$trunk['calls'].$trunk['time'].$trunk['disabled']."\n\r";
$query = "UPDATE trunks SET calls=$trunk[calls],time=$trunk[time], lastcall=$lastcall WHERE name='$argv[1]'";
$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

// Выполняем SQL-запрос для получения парамеров pool
$query = "SELECT poolid, name, prefix, whitesec, blackcalls, blmanage, wlmanage, bl_name, wl_name FROM $pools WHERE prefix='$argv[3]'";
$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

$pools = mysql_fetch_array($result, MYSQL_ASSOC);
if($argv[2]>0){
  if($pools['wlmanage']='on') {
  echo "tess1 \n\r";
    if($pools['whitesec']<=$argv[2]) {
      $query = "SELECT *  FROM ".$pools['wl_name']."  WHERE tel='$argv[4]'";
      $result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
      if(mysql_num_rows($result) > 0) {
  echo "tess2 \n\r";
      mysql_free_result($result);
      mysql_close($link);
      }
      else {
      $query = "INSERT INTO ".$pools['bl_name']."  VALUES (NULL,'$argv[4]')";
      $result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
  echo "tess3 \n\r";
      }
     }
  }
}
// Закрываем соединение
//mysql_close($link);

?>
Для оптимизации и доработки диалплана требуется помощь "астерисковеда", знающего свое дело. За помощь готов платить деньги, в пределах разумного, конечно...
awsswa
Сообщения: 2390
Зарегистрирован: 09 июн 2012, 10:52
Откуда: Россия, Пермь skype: yarick_perm

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение awsswa »

вариант раз - индексы в mysql
вариант два - попробовать переписать через odbc
платный суппорт по мере возможностей
Sanek
Сообщения: 81
Зарегистрирован: 17 май 2012, 14:55

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Sanek »

To switch
За такую цену можно купить готовый сервер...
awsswa
Сообщения: 2390
Зарегистрирован: 09 июн 2012, 10:52
Откуда: Россия, Пермь skype: yarick_perm

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение awsswa »

так купите MERA
платный суппорт по мере возможностей
Sanek
Сообщения: 81
Зарегистрирован: 17 май 2012, 14:55

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Sanek »

Ну вот, один начал и все подхватили :(
Мера стоит и прекрасно работает, но в ней нет нужных нам функций... и прибамбасы к ней довольно-таки трудно прибамбасывать...

Друзья, давайте по существу, а то получается типа такого:
чел задал вопрос типа "помогите настроить зажигание в авто" а ему ответ: "купи новый автомобиль"
Sanek
Сообщения: 81
Зарегистрирован: 17 май 2012, 14:55

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Sanek »

А теперь по существу:

Анализ нагрузки показал, что из-за нагрузки ядром самого астериска на процессор, MYSQL сервер начинает "тормозить" и в конечном итоге происходит "затык"...
Перенос базы на другой сервер немного "разгрузил" сервер с астериском, но не дал исчерпывающего результата: упираюсь в скорость соединения астера с базой... и опять затык.


Возникла мысль для каждого пулла транков ввести глобальные переменные, в которые "ссыпать" данные из базы при инициализации и, скажем, каждые 10 сек работы сервера. И так-же из этих переменных выгружать данные в базу...
Если внимательно проанализировать мой диалплан, видно, что данные по транкам меняются значительно реже, чем запрашиваются из базы, а вот выгружаются практически при каждом звонке. Выгружаемые данные накапливать в переменных и потом их выгружать в базу.
Вопрос к гуру: можно ли как-то очищать переменные для избегания "засорения" памяти? В нете по этому вопросу ничего внятного не нашел.
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Vlad1983 »

у вас при каждом вызове открывается соединение с мускулом
уже сказали - ODBC (в астре func_odbc для этого. сессия держится постоянно открытой)
ЛС: @rostel
Sanek
Сообщения: 81
Зарегистрирован: 17 май 2012, 14:55

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение Sanek »

Друзья! Еще раз повторюсь: нечего сказать по существу поднятой темы - лучше промолчите...
To switch
В продолжение Вашей темы:
допустим Вы прораб и Вам дали задание: прокопать траншею 0,7Х2,2Х1200 и по смете, допустим, определили стоимость работ в ...руб(баксов, тугриков ;) ). И перед Вами встал выбор:
1) Попытаться уложиться в сроки исполнения, забрать все деньги себе и прокопать эту траншею вручную...
2) За половину стоимости нанять кучу узбеков (не в обиду им сказано) и остальную часть этих денег и энную кучу времени потратить на исправление их работы...
3) Обсудить со специалистом, заказать (арендовать, нанять) необходимое оборудование и выполнить качественно и в срок...
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение ded »

Sanek, не принято на форуме затыкать рот кому либо.
Вижу, что Вы по теме Asterisk and PHP - оптимизация и разгрузка сервера как раз и высказываетесь по существу? -
Sanek писал(а):допустим Вы прораб и Вам дали задание: прокопать траншею 0,7Х2,2Х1200
gosha
Сообщения: 375
Зарегистрирован: 06 сен 2010, 17:41
Контактная информация:

Re: Asterisk and PHP - оптимизация и разгрузка сервера

Сообщение gosha »

у нас транзит....много... FastAGI на перле + MySQL за мемкешом.

А оптимизировать не видя того что у вас происходит это как пальцем в небо.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH