我有一个 PHP 脚本,在单次呼叫生命周期内执行 2-3 次,如果是入站呼叫,它将在队列中执行一次,在呼叫开始时执行一次,最后一次在呼叫结束时执行。对于出站呼叫,它将跳过队列阶段(显然)。
每 1,000-2,000 次呼叫中大约有 1 次会发生最后事件、呼叫结束、错误,呼叫的时间或条件似乎没有任何模式。
在日志中这是我得到的(减少了噪音)
-- Executing [h@sub-queue-bookings:1] Set("SIP/CL-000298d4", "CALLWHEN=END") in new stack
-- Executing [h@sub-queue-bookings:2] AGI("SIP/CL-000298d4", "presence_2.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/presence_2.php
AGI Tx >> agi_request: presence_2.php
AGI Tx >> agi_channel: SIP/CL-000298d4
AGI Tx >> agi_language: en_AU
AGI Tx >> agi_type: SIP
AGI Tx >> agi_uniqueid: 1405038747.11111
AGI Tx >> agi_version: 1.8.5.0
AGI Tx >> agi_callerid: anonymous
AGI Tx >> agi_calleridname: NZ anonymous
AGI Tx >> agi_callingpres: 0
AGI Tx >> agi_callingani2: 0
AGI Tx >> agi_callington: 0
AGI Tx >> agi_callingtns: 0
AGI Tx >> agi_dnid: anonymous
AGI Tx >> agi_rdnis: unknown
AGI Tx >> agi_context: sub-queue-bookings
AGI Tx >> agi_extension: h
AGI Tx >> agi_priority: 2
AGI Tx >> agi_enhanced: 0.0
AGI Tx >> agi_accountcode:
AGI Tx >> agi_threadid: 139985928873744
AGI Tx >>
-- AGI Script presence_2.php completed, returning 4
我在脚本中添加了一个日志记录功能,以便在脚本运行时写入脚本,在包含 AGI 库 (PHPAgi) 之前,当发生此错误时,它不会写入日志。所以我认为这与脚本上的 AGI 通信无关
调用脚本的extension.conf如下所示:
;Hangup Event
exten => h,1,Set(CALLWHEN=END)
exten => h,n,AGI(presence_2.php)
我还在 PHP 脚本中加入了以下内容,以防止它被杀死(但这似乎没有什么区别):
/* Evil Process Block Fixing Code */
declare(ticks = 1);
pcntl_signal(SIGHUP, SIG_IGN);
pcntl_signal(SIGPIPE, SIG_IGN);
pcntl_signal(SIGILL, SIG_IGN);
pcntl_signal(SIGQUIT, SIG_IGN);
pcntl_signal(SIGABRT, SIG_IGN);
pcntl_signal(SIGSEGV, SIG_IGN);
pcntl_signal(SIGTERM, SIG_IGN);
有人能给我什么建议以防止这种情况发生?(向 PHP 脚本添加一些内容、检查 x、重写 extensions.conf、记录一些额外信息等)。我相当困惑,我在 google 上搜索了一下,发现有几个人遇到了和我几乎一模一样的事情,但除了“处理它”之外没有其他解决方案......
“常规” AGI 执行如下所示:
-- Executing [h@sub-queue-sales:1] Set("SIP/CL-00029e74", "CALLWHEN=END") in new stack
-- Executing [h@sub-queue-sales:2] AGI("SIP/CL-00029e74", "presence_2.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/presence_2.php
<SIP/CL-00029e74>AGI Tx >> agi_request: presence_2.php
<SIP/CL-00029e74>AGI Tx >> agi_channel: SIP/CL-00029e74
<SIP/CL-00029e74>AGI Tx >> agi_language: en_AU
<SIP/CL-00029e74>AGI Tx >> agi_type: SIP
<SIP/CL-00029e74>AGI Tx >> agi_uniqueid: 1405134386.171952
<SIP/CL-00029e74>AGI Tx >> agi_version: 1.8.5.0
<SIP/CL-00029e74>AGI Tx >> agi_callerid: 000000000
<SIP/CL-00029e74>AGI Tx >> agi_calleridname: 000000000
<SIP/CL-00029e74>AGI Tx >> agi_callingpres: 0
<SIP/CL-00029e74>AGI Tx >> agi_callingani2: 0
<SIP/CL-00029e74>AGI Tx >> agi_callington: 0
<SIP/CL-00029e74>AGI Tx >> agi_callingtns: 0
<SIP/CL-00029e74>AGI Tx >> agi_dnid: 000000000
<SIP/CL-00029e74>AGI Tx >> agi_rdnis: unknown
<SIP/CL-00029e74>AGI Tx >> agi_context: sub-queue-sales
<SIP/CL-00029e74>AGI Tx >> agi_extension: h
<SIP/CL-00029e74>AGI Tx >> agi_priority: 2
<SIP/CL-00029e74>AGI Tx >> agi_enhanced: 0.0
<SIP/CL-00029e74>AGI Tx >> agi_accountcode:
<SIP/CL-00029e74>AGI Tx >> agi_threadid: 139987080693520
<SIP/CL-00029e74>AGI Tx >>
<SIP/CL-00029e74>AGI Rx << GET VARIABLE UNIQUEID
<SIP/CL-00029e74>AGI Tx >> 200 result=1 (1405134386.171952)
<SIP/CL-00029e74>AGI Rx << GET VARIABLE UNIQUEID
<SIP/CL-00029e74>AGI Tx >> 200 result=1 (1405134386.171952)
<SIP/CL-00029e74>AGI Rx << VERBOSE "Started: 1405134386.171952" 1
presence_2.php: Started: 1405134386.171952
........ lots of events and communcation with AGI ........
<SIP/CL-00029e74>AGI Tx >> 200 result=1
-- <SIP/CL-00029e74>AGI Script presence_2.php completed, returning 0
注意:我从这些日志中删除了所有识别信息注意2:运行Asterisk 1.8.5
答案1
AGI 的返回代码 = 所用脚本的返回代码。
因此,请检查您的脚本 presence_2.php 中是否有 exit(4) 命令。
欲了解更多信息,请
1)停止星号
2)通过以下方式启动星号
asterisk -vvvvc
如果是这样,您将在控制台上看到脚本错误。