我有一个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)get之前,当这个错误发生时它不写入日志。 所以我不认为这与脚本上的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);
有人可以给我什么build议来防止这种情况发生? (给PHP脚本添加一些东西,检查x,重写extensions.conf,logging一些额外的信息等)。 我相当难住,我search了一些,发现有几个人几乎和我一样经历了同样的事情,但除了“处理它”之外没有任何解决scheme…..
这是一个“常规”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
AGI的返回码=所用脚本的返回码。
所以检查你的脚本presence_2.php是否/当它有退出(4)命令。
欲了解更多信息
1)停止星号
2)通过启动星号
asterisk -vvvvc
如果是这样,您将在控制台上看到脚本错误。