2013-05-27 190 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