0

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

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

我在 /var/log/messages 或 /var/log/asterisk/messages 中没有发现任何错误

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

1 回答 1

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 正在记录到您的系统日志,以便您可以在 /var/log/messages 中找到错误。您可以通过在您的/etc/php.ini这一行中设置来做到这一点:

error_log = syslog

最后,为了尝试复制错误,我建议使用开发框,并为自己发起一堆调用,并构建一个脚本来创建一堆“调用文件”

这是一个可以帮助您入门的调用文件:

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 应用程序提供有趣的数据。

于 2013-05-28T13:53:10.907 回答