phpagi脚本随机停止

时间:2013-05-27 18:27:14

标签: asterisk agi

出于某种原因,phpagi脚本在中间随机停止。这种情况只发生在每20-50个电话一次。我能够注意到几个这样的'失败'在星号CLI中实时。没有显示错误。脚本发送了几条详细消息,直到停止。

脚本用于计费,它有几个while和sql查询。最大执行时间设置为30秒。

我在/ var / log / messages或/ var / log / asterisk / messages中找不到任何错误

  • Asterisk 1.6.2.24
  • PHP 5.1.6(cli)(建于2012年6月27日12:21:13)

    [context-x]
    exten => 1,1,Dial(SIP/XXXXXX)
    exten => h,1,AGI(script.php)
    

为什么它可以停止随机调用的任何想法?

感谢。

更新: 我刚刚注意到,当问题发生时,AGI返回4:

-- <SIP/xxxxxx-00000185>AGI Script script.php completed, returning 4

出了什么问题?

1 个答案:

答案 0 :(得分:3)

从我听到的症状来看,听起来并不是特定的Asterisk问题,但是,可能是你的脚本问题。以下是关于如何调试应用程序而不知道AGI脚本本身幕后发生的事情的一些提示......

首先,AGI Script script.php completed, returning 4表示您的脚本退出时没有干净的退出状态代码。 returning 0是您希望看到的。您可以通过运行脚本然后使用$?变量检查状态代码,在bash提示符下查看最后一个退出状态代码。像这样:

[user@host ~]$ ./script.php
[user@host ~]$ echo $?
0

这就是Asterisk告诉你脚本发生了什么的原因。任何非零都是“这里有些不对劲”。一般来说,你可以根据自己的喜好自定义这些,特别是4,我不确定。

你要做的一件事就是开启agi调试:

host*CLI> agi set debug on

然后运行你的脚本,看看你是否能发现你的php脚本正在吐出任何错误。

我的另一个建议是确保你的php登录到你的syslog,这样你就可以在/ var / log / messages中找到错误。您可以在/etc/php.ini这一行中设置:

error_log = syslog

最后,为了尝试复制错误,我建议使用开发框,并为自己发起一堆调用,并为create a bunch of "call files"构建一个脚本。

这是一个让你入门的调用文件:

Channel: LOCAL/100@mycontext
MaxRetries: 2
RetryTime: 60
WaitTime: 30
Application: Wait
Data: 30

当您创建文件时,将其移至/var/spool/asterisk/outgoing(移动很重要,您希望指针移动,因为如果您先在该目录中写入文件,星号可能会过早地提取文件)。

您还可以从CLI发起对分机的呼叫:

host*CLI> channel originate LOCAL/100@mycontext application Wait 5

您可能还想在调用文件中使用其他选项,例如CallerID: John Doe <8005551212>,以便在创建测试以复制问题时将有趣的数据提供给AGI应用程序。