2013-05-27 142 views
1

由于某种原因phpagi脚本随机停在中间。每20-50次呼叫只发生一次。在asterisk CLI中,我能够实时注意到几个这样的“失败”。没有显示错误。脚本发送了几个详细的消息直到刚刚停止。phpagi脚本随机停止

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

我没有找到在/ var任何错误/ log/messages文件或/ var /日志/星号/消息

  • 星号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 

有什么不对?

回答

4

从我从您的症状中听到的消息来看,听起来不像是一个特殊的星号问题,但可能是您的脚本存在问题。这里有一些关于如何在不知道AGI脚本本身背后发生的情况的情况下调试应用程序的技巧......

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

[[email protected] ~]$ ./script.php 
[[email protected] ~]$ echo $? 
0 

这就是Asterisk告诉你发生了什么事情脚本。任何非零的东西都是“这里出了问题”。一般来说,你可以根据自己的喜好自定义这些,所以特别是4,我不确定。你会想要做

一件事是打开AGI调试像这样:

host*CLI> agi set debug on

然后运行脚本,看看是否能找到你的PHP脚本被吐出任何错误。

我的另一个建议是确保你的php正在登录到你的系统日志,这样你就可以在/ var/log/messages中发现错误。可以通过在你的/etc/php.ini这条线设置做到这一点:

error_log = syslog

最后,要尽量复制错误,我会建议使用开发中,并发起了一堆自己的话费,并建立一个脚本到create a bunch of "call files"

这里有一个调用的文件,让你开始:

Channel: LOCAL/[email protected] 
MaxRetries: 2 
RetryTime: 60 
WaitTime: 30 
Application: Wait 
Data: 30 

当你创建一个文件,将其移动到/var/spool/asterisk/outgoing(移动是很重要的,你要指针移动,因为星号可以拿起文件如果你首先在那个目录中写信给它,太早了)。

你也可以发起从CLI的分机的电话:

host*CLI> channel originate LOCAL/[email protected] application Wait 5

您可能还需要使用呼叫文件中的其他选项,如CallerID: John Doe <8005551212>以有趣的数据提供给您的AGI应用程序,同时创建测试来复制问题。

+0

感谢您的详细解答,但我不认为这个问题与脚本有关,因为它只发生在3%的调用中。我已经尝试直接运行脚本,启用agi调试,启用PHP错误日志到文件等。今天我发现了这个讨论:http://lists.digium.com/pipermail/asterisk-users/2011-September /266522.html,我认为我面临同样的问题。我将尝试使用System()而不是AGI()。我会让你知道结果。 – k4h

+0

你正在运行什么版本? /你尝试过另一个版本吗? – dougBTV

+0

另外,查看与版本1.8.7有关的错误报告/修复 - https://issues.asterisk.org/jira/browse/ASTERISK-18811 – dougBTV