Астериск используется для обработки транзитного трафика: сортировка по каналам, ограничение одновременных звонков... и еще куча прибамбасов.
Для всего этого используется самопальный диалплан с использованием 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} *************)
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); // происходит закрытие файла
?>
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);
?>