Broken pipe
[May 19 11:52:12] ERROR[28451]: utils.c:1019 ast_carefulwrite: write() returned error: Broken pipe
куда копать? подскажите.
Астер 1609
_________________
Успехов!
_________________
Успехов!
Хочу вновь поднять вопрос, потому как у меня постоянно вылетает такая ошибка, но почему я немогу понять,никакой закономерности появления не выявил, может появится при любом звонке или действии... а может и не появиться...
ага, прям шаманство какое то, в диалплане четыре скрипта подряд выполняются и только после одного выдается такая ошибка.
ast_carefulwrite: write() returned error: Broken pipe
убираю скрипт, все нормально, ставлю на место, ошибка вылазит. Скрипт на "bash" , даже когда пустой (кроме заголовка #!/bin/bash) ошибка лезет.
Права на файл проверял такие же как и на другие скрипты !!!!
Видимо без бубна тут никак !!!
Периодически появляется в таком случае: необходимо ввести некоторый цифровой код с телефона, и если это сделать быстро, при этом нажать больше, чем ожидается на ввод, происходит разрыв связи, а в логах этот эксепшн
org.asteriskjava.fastagi.AgiNetworkException: Unable to send command to Asterisk: Broken pipe
Через AGI вызывается PHP-шный скрипт
| Code: |
| #!/usr/bin/php ... echo "SET VARIABLE NUMBER_ACCEPTED yes\n"; ... |
Переменная нормально устанавливается, диалплан нормально выполняется дальше, переменная в нем видна, но все-таки хотелось бы понять суть проблемы.
В первом приближении понятно, что ошибка появляется строго тогда когда AGI передает данные *.
Интуитивно мне кажется что когда * отвечает что-то скрипту, то у него не получается записать данные в поток. Похоже на правду?
Asterisk 1.4.26.2
_________________
Better simpler than clever
ERROR[20304]: utils.c:966 ast_carefulwrite: write() returned error: Broken pipe
Хотя сам скриптик очень сложный
#!/usr/bin/php -q
Или можно на эту ошибку не обращать внимание?
решением как я понимаю будет обновить астериск до последнего.
ps: ссылка была в топе гугла.
_________________
Успехов!
При запуске AGI на perl вываливаются ошибки:
| Code: |
| -- [May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe [May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe [May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe |
В 1.4.26.2 эти же скрипты работали без проблем
убери
\n
| Code: |
| ... function read() { global $debug; $input = str_replace("\n", "", fgets(STDIN, 4096)); if ($debug) fputs(STDERR, "read: $input\n"); return $input; } function write($line) { global $debug; if ($debug) fputs(STDERR, "write: $line\n"); #echo $line."\n"; fputs(STDOUT, "$line\n"); $a = read(); $num = substr($a,14); $num = substr($num,0,-1); return $num; } ... |
Сам agi скрипт
| Code: |
| #!/usr/bin/php -q |
совершаю вызов, вызывается agi скрипт, начинаю слушать сообщение и не дослушав кладу трубку, в логах вижу
| Code: |
| -- Launched AGI Script /var/lib/asterisk/agi-bin/agi/tech-support.php -- AGI Script Executing Application: (Playback) Options: (leavemessage_tech) -- Playing 'leavemessage_tech' (language 'ru') -- AGI Script Executing Application: (Record) Options: (/var/spool/asterisk/recordmessages/vm2011_01_27_17_04_10_tech_support_0.wav) [2011-01-27 17:04:10] WARNING[21115]: file.c:768 ast_readaudio_callback: Failed to write frame -- Playing 'beep' (language 'ru') [2011-01-27 17:04:10] WARNING[21115]: app_record.c:243 record_exec: ast_streamfile failed on SIP/test-check-000090b9 [2011-01-27 17:04:10] ERROR[21115]: utils.c:968 ast_carefulwrite: write() returned error: Broken pipe -- AGI Script agi/tech-support.php completed, returning 0 |
т.е после Playback он пытается выполнить Record, хотя я думаю он должен был выполнить agi_hangup_handler и завершить работу скрипта. В логах видно что скрипту выдается соответствующий сигнал
| Code: |
| # strace -fp 23810 Process 23810 attached - interrupt to quit read(0, "200 result=-1\n"..., 8192) = 14 write(2, "read: 200 result=-1\n"..., 20) = 20 --- SIGHUP (Hangup) @ 0 (0) --- |
Иногда, при непонятных обстоятельствах он отрабатывает нормально. Так же, если добавить одну строчку после Playback, то всегда все работает как нужно
| Code: |
| write("EXEC Playback leavemessage_tech"); write(""); |
но хочется найти причину сего, а не ставить подпорки.
_________________
Успехов!
_________________
Успехов!
| Code: |
| [Jun 6 23:08:21] == Using SIP RTP CoS mark 5 [Jun 6 23:08:21] -- Executing [7579@office:1] Answer("SIP/101-0000000d", "") in new stack [Jun 6 23:08:21] -- Executing [7579@office:2] AGI("SIP/101-0000000d", "test.php") in new stack [Jun 6 23:08:21] -- Launched AGI Script /var/lib/asterisk/agi-bin/test.php [Jun 6 23:08:21] test.php: phrase [Jun 6 23:08:21] ERROR[496]: utils.c:1133 ast_carefulwrite: write() returned error: Broken pipe [Jun 6 23:08:21] -- AGI Script test.php completed, returning 0 [Jun 6 23:08:21] -- Auto fallthrough, channel 'SIP/101-0000000d' status is 'UNKNOWN' |
| Code: |
| #!/usr/bin/php -q |
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
замечено, что некоторое количество софта просто отваливается если операции ввода/вывода работают долго(благодаря их большому количеству например, или медленной работе сервисной стороны). Возможно даже изза бага libc или какой-нибудь другой прокладки которая не ожидает долгой работы.
_________________
Slackware 13.1 - Asterisk 1.8
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
жаль под рукой нету исходников... пару раз был такой проблем, но там была вина AGI(то ли он умер преждевременно, то ли сам висел на select-е сокета, в общем ему было чхать на хост в лице *) и рытье в исходниках * подтвердило именно глюкавость AGI.
_________________
Slackware 13.1 - Asterisk 1.8
Через AMI та же проблема:
| Code: |
| [Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe [Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe [Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe [Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe |
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
| Code: |
| #!/usr/bin/php -q |
и еще, судя по -q в параметрах вызова php, вам стоит добавть сюда в начало скрипта следущие вызовы:
| Code: |
| ob_implicit_flush(false); set_time_limit(5); error_reporting(0); |
| Code: |
| #!/usr/bin/php -q |
Объясню зачем нужен первый блок с while(fgets). Когда астер запускает скрипт, самым первым делом, он сыпет ему на STDIN некоторые канальные переменные, которые затем можно использовать в скрипте, добавляя к ним префикс ast_.
Я так понимаю phpagi этим и занимается в том числе.
Параметр -q как я понимаю уже не актуален и оставлен для совместимости.
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
| Code: |
| -q Quiet-mode. Suppress HTTP Header output. |
Что бы проверть как собран php досточно запустить php -v
Будет либо:
PHP 5.1.6 (cgi-fcgi) (built: Nov 29 2010 16:43:56)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
либо:
PHP 5.1.6 (cli) (built: Nov 29 2010 16:47:46)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
| Quote: |
| # php -v PHP 5.3.6-pl0-gentoo (cli) (built: May 26 2011 17:25:39) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies |
xelas, а можешь пару слов о phpagi.php сказать, стоит использовать или есть смысл свой класс написать?
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
ПС по поводу "непонравилось": та версия, которая была у меня в руках, была скачена с офсайта, декларировалась как стабильная, но пестрила массой ошибок. Как результат многие методы просто не работали. В результате, полдня ушло только на то, что бы все исправить в коде phpagi. Нисколько не хочу умалить труд разработчиков phpagi, они молодцы. Просто надо чуть тщательнее подходить к релизам. Но и в любом случае, как я уже говорил выше -- это не мой путь.
может быть нужно разобраться в чем проблема? а не писать что плохо работает.
я то же не сторонник классов. но на один "->" в запросе больше, зато удобств масса.
| Code: |
| #!/usr/bin/php |
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
смысл тот же.
просто зачем делать если есть готовое?
играет роль, что нужно получить в таком AGI.
а может вообще лучше не использовать php, а например bash обойтись.
Скрипт простенький, смысл открывает порт бросает сообщение и закрывает его:
| Code: |
| #!/usr/bin/php -q |
Еще так и не понял, что не правильно делаю. Запускаю скрипт в h контексте функцией DeadAGI, вроде по теории верно, а на практике появляется варнинг(но самое главное работает):
WARNING[361]: res_agi.c:3784 deadagi_exec: DeadAGI has been deprecated, please use AGI in all cases!
Пробовал запускать как AGI но не работает. Может кто может что то сказать по этому поводу? DeadAGI has been deprecated переводится вроде "DeadAGI является устаревшим". Использую 1.8.4 астериск, может что то поменялось.
Попробуйте phpagi
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
Да убирание exit(0) помогло выполнению скрипта. Но всеравно загадочный брокен пип выскакивает.
Что ты можешь сказать про этот код (нашел на voip.rus.net)^
| Quote: |
| Asterisk всегда отсылает пучок в каждый момент времени к agi, вызываемый как показано ниже: agi_request: test.php agi_channel: Zap/1-1 agi_language: en agi_type: Zap agi_callerid: agi_dnid: agi_context: default agi_extension: 1000 agi_priority: 1 Сохраните инфу с этой функцией (или пример ниже): while (!feof($stdin)) { $temp = fgets($stdin); $temp = str_replace("\n","",$temp); $s = explode(":",$temp); $agivar[$s[0]] = trim($s[1]); if (($temp == "") || ($temp == "\n")) { break; } } |
Может этот код попробовать или это одно и тоже что ты привел выше?
to aven:
phpAGI мне выдала No Aplication. Он в стандартной сборке не идет я так понимаю, тоесть нужно модуль доустанавливать.
Тут качай, это обычный php-файл.
http://phpagi.sourceforge.net/
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
скрипт начинается так:
while() {
chomp;
last unless length($_);
if (/^agi_(\w+)\:\s+(.*)$/) {
$AGI{$1} = $2;
}
} пробовал в начало добавлять
$|=1;
не помогает....
- сделать agi set debug on в cli
#!/usr/bin/perl
use strict;
use DBI;
my $debug=1;
my $prefix_add_count=7; #К-во знаков в локальном наборе (меньше этого будем прибавлять prefix_add)
my $prefix_add='7812'; #Что прибавлять
my $allow_nowmonth_credit=1; # Разрешить не отключать локльную связь в этом месяце
open F , "/etc/bill.conf" or die ("Can't open config file: /etc/bill.conf\n");
my @lines=;
my $config;
foreach (@lines){
chomp;
next if /^#/;
next if /^;/;
~s/\s//g;
my ($name,$value)=split(/=/);
$config->{$name}=$value;
}
close F;
my ($dbase,$user,$password);
$dbase = "DBI:mysql:".$config->{dbase}.":".$config->{dbhost} if (defined $config->{dbhost} && defined $config->{dbase});
$user = $config->{dbuser} if (defined $config->{dbuser});
$password = $config->{dbpassword} if (defined $config->{dbpassword});
die ("Database, username or password not specified in /etc/bill.conf!\n") if (!($dbase && $user && $password));
my $db = DBI->connect($dbase,$user,$password) or { die("Cannot open database $_") };
# Setup some variables
my %AGI;
while() {
chomp;
last unless length($_);
if (/^agi_(\w+)\:\s+(.*)$/) {
$AGI{$1} = $2;
}
}
if ($debug){
print "VERBOSE \"BILLING_CLIENT_OUT: AGI Environment Dump:\" 5\n";
foreach my $i (sort keys %AGI) {
print STDERR " -- \n";
print "VERBOSE \"BILLING_CLIENT_OUT: AGI VARIABLE $i = $AGI{$i}\" 5\n" ;
}
}
my $dst_number=fix_number($AGI{extension});
verbose("DIALING NUMBER = $dst_number");
my $src_channel;
if ($AGI{channel}=~/^.*?\/(.*?)-[^-]+$/i){
$src_channel=$1;
verbose("SOURCE CHANNEL = $src_channel");
}
my $phone_id=$AGI{accountcode};
verbose("ACCOUNT CODE = $phone_id");
my $force_max_duration=50*60;
if ($phone_id){
my $mask_info=$db->selectrow_hashref("
SELECT trfzone_id,
group_id,
mask
FROM phones_masks
WHERE is_active=1 AND '".$dst_number."' LIKE CONCAT ( country_code, mask, '%' )
ORDER BY LENGTH ( CONCAT ( country_code, mask ) ) DESC
LIMIT 1
");
if ($mask_info){
my $user_info=$db->selectrow_hashref("
SELECT up.allow_city,
up.allow_mobile,
up.allow_crosscity,
up.allow_crosscountry,
up.enabled,
us.uid,
u.balance + COALESCE((SELECT SUM(summ) FROM pays_promise WHERE uid=u.id AND date_end>NOW() AND completed=0),0) as balance,
u.lim_money,
u.paytype,
ua.status,
EXTRACT(YEAR_MONTH FROM ua.refdate) as yearmonth_status,
EXTRACT(YEAR_MONTH FROM NOW()) as yearmonth_now,
ttz.price_min
FROM users_phones up
JOIN users_services us ON (up.service=us.id)
JOIN users u ON (us.uid=u.id)
JOIN users_active ua ON (u.curstatus_id=ua.id)
JOIN users_services_tarif ust ON (us.curr_service_tarif_id=ust.id)
JOIN tarifs t ON (ust.tarif=t.trf_id)
JOIN tarifs_trfzones ttz ON (ttz.trf_id=t.trf_id AND ttz.is_active=1 AND ttz.trfzone_id=$mask_info->{trfzone_id})
WHERE up.id = $phone_id
");
if ($user_info){
if ($user_info->{enabled}){
if ($user_info->{status}==1){
if (($mask_info->{group_id}==1 && $user_info->{allow_city}) ||
($mask_info->{group_id}==2 && $user_info->{allow_mobile}) ||
($mask_info->{group_id}==3 && $user_info->{allow_crosscity}) ||
($mask_info->{group_id}==4 && $user_info->{allow_crosscountry})){
#verbose("BALANCE:".$user_info->{balance});
my $maxduration;
if ($user_info->{paytype}==1 || $user_info->{balance}>=$user_info->{lim_money} || $user_info->{price_min}==0){
$maxduration=int($user_info->{balance}/$user_info->{price_min})*60 if ($user_info->{price_min});
if (!$maxduration || $maxduration$force_max_duration){
$maxduration=$force_max_duration;
verbose("Setting max duration to 50 minutes");
}
#$maxduration=30;
print "SET VARIABLE TIMEOUT(absolute) \"$maxduration\" \n" if ($maxduration);
verbose("allow, cost per minute: ".$user_info->{price_min}." maximum call duration: ".$maxduration." seconds" );
} else {
verbose("Balance < 0");
forbidden();
}
} else {
#this type of service was disabled
verbose("this type of service is disabled");
forbidden();
}
} else {
if ($allow_nowmonth_credit && $user_info->{yearmonth_status} eq $user_info->{yearmonth_now} && $user_info->{price_min}==0){
#was disabled in current month
#allow free calls
print "SET VARIABLE TIMEOUT(absolute) \"$force_max_duration\" \n" if ($force_max_duration);
verbose("allow, cost per minute: ".$user_info->{price_min}." maximum call duration: ".$force_max_duration." seconds" );
} else {
verbose("billing status=".$user_info->{status});
forbidden_nomoney();
}
}
} else {
#enable!=1
verbose("enable!=1");
forbidden();
}
} else {
verbose("account_code not found");
forbidden();
}
} else {
# UNKNOWN MASK
verbose("no such mask");
forbidden();
}
}
sub verbose{
my $message=shift;
my $level=shift || 1;
print "VERBOSE \"BILLING_CLIENT_OUT: [account:".$AGI{accountcode}."] dialing ".fix_number($AGI{extension}).": ".$message."\" ".$level."\n";
}
sub forbidden{
verbose("access forbidden");
print "EXEC PLAYBACK \"custom/bill/message_call_forbidden\" \n";
#print "EXEC PLAYBACK \"custom/bill/curstatusis&custom/bill/curstatusis-nomoney\" \n";
print "HANGUP ".$AGI{channel}."\n";
}
sub forbidden_nomoney{
verbose("access forbidden: no money");
print "EXEC PLAYBACK \"custom/bill/message_call_forbidden_nomoney\" \n";
#print "EXEC PLAYBACK \"custom/bill/curstatusis&custom/bill/curstatusis-nomoney\" \n";
print "HANGUP ".$AGI{channel}."\n";
}
sub fix_number{
my $number=shift;
$number=$prefix_add.$number if (length($number)> agi_request: bill/client_out.pl
AGI Tx >> agi_channel: SIP/78126409768-00064f44
AGI Tx >> agi_language: en
AGI Tx >> agi_type: SIP
AGI Tx >> agi_uniqueid: 1309263202.413508
AGI Tx >> agi_version: 1.6.2.11
AGI Tx >> agi_callerid: 78126409768
AGI Tx >> agi_calleridname: 78126409768
AGI Tx >> agi_callingpres: 0
AGI Tx >> agi_callingani2: 0
AGI Tx >> agi_callington: 0
AGI Tx >> agi_callingtns: 0
AGI Tx >> agi_dnid: 6408640
AGI Tx >> agi_rdnis: unknown
AGI Tx >> agi_context: silverbill4-out
AGI Tx >> agi_extension: 6408640
AGI Tx >> agi_priority: 1
AGI Tx >> agi_enhanced: 0.0
AGI Tx >> agi_accountcode: 221
AGI Tx >> agi_threadid: 140528377334032
AGI Tx >>
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx
my $response = ;
print STDERR "Response: $response";
как минимум. Но яб таки сходил на спан и забрал уже Asterisk::AGI, хотя судя по умело скопированному от туда куску с разбором agi_ переменных он уже у Вас есть.
| xelas wrote: |
| У меня ошибки с broken pipe вылазят только когда AGI/AMI приложения "забывают" вычитывать ответы от астера. Доказано и проверено на практике. |
Или не успевают.
Я пользуюсь телефонной книгой и на *1.4 никогда не было проблем, на *1,6 - начали валиться ошибки, а на *1,8 - вообще не работает.
Так надо просто вставить один sleep(1); в конце.
| Code: |
| $timeout = 10; $asterisk_ip = "127.0.0.1"; $socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, $timeout); fputs($socket, "Action: Login\r\n"); fputs($socket, "UserName: $UserName\r\n"); fputs($socket, "Secret: $Secret\r\n\r\n"); fputs($socket, "Action: Originate\r\n" ); fputs($socket, "Channel: SIP/$ext\r\n" ); fputs($socket, "Exten: $num\r\n" ); fputs($socket, "Callerid: $ext to $call \r\n"); fputs($socket, "Timeout: 15000\r\n" ); fputs($socket, "Context: $context\r\n" ); fputs($socket, "Priority: 1\r\n" ); fputs($socket, "Async: yes\r\n\r\n" ); fputs($socket, "Action: Logoff\r\n\r\n"); sleep (1); $wrets=fgets($socket,128); |
скрипт на PHP возвращал всего три переменных, и вообще это единственное что возвращается:
| Code: |
| fputs($stdout,"SET VARIABLE MY_REALCALLTO ".$mycalltoreal."\n"); fputs($stdout,"SET VARIABLE MY_NOANSDELAY ".$mycall_beforeforward."\n"); fputs($stdout,"SET VARIABLE MY_NOANSNUMBER ".$mycall_forwardnoans."\n"); fflush($stdout); |
а на финише было
| Code: |
| $result = fgets($stdin); exit(0); |
sleep не очень помогал. по крайней мере пару раз с двух секундным ожиданием прокатило.
но вот такая вот конструкция заработала
| Code: |
| $result = fgets($stdin); $result = fgets($stdin); $result = fgets($stdin); exit(0); |
Что скажут уважаемые гуру насчет такого странного поведения *?