はじめての方へTrixbox CE2.6IP電話機IP電話サービスPHPAGI参考情報導入事例紹介
トップページ >PHPAGI >AGIで回線切断時の処理をしたい(DeadAGI)

PHPAGI

AGIで回線切断時の処理をしたい(DeadAGI)

AGIで回線切断時の処理をしたくても、AGIでは処理ができません。

この場合、AGIではなく、DeadAGIを利用します。

AGIとDeadAGIの違いは、回線切断時にプロセスを強制終了するか、しないかの違いです。
AGIは回線切断と同時にプロセスが強制終了させられますが、DeadAGIは回線が切断されてもプロセスは強制終了させられません。

これはAGI、DeadAGIのプロセスが、回線切断前と後とで、動いているかどうかで確認できます。

ちなみに、AGIを前提に書かれたプログラムを、DeadAGIで動かすことはできますが、回線が切断されるケースを考慮していないと、無限ループになる場合があります。

例えば、DTMF入力で特定の番号入力を受け付ける処理の場合、もし特定の番号が入力されるまでループさせていたりすると、ほぼ間違いなく無限ループになります。

AGIは回線切断されるとプロセスを終了してくれるのでいいですが、DeadAGIの場合はプロセスを終了させてくれないので、もう誰も止められない状況になります。こうなると、psコマンドとかで該当のプロセスを探してkillコマンドでプロセスを強制終了させるしかありません。

さて、DeadCGIでいろいろと検索したところ、情報がありました。

Asterisk cmd DeadAGI
---
PHP (though you must compile with --enable-pcntl to get this function):
pcntl_signal(SIGHUP, SIG_IGN)
---

しかしこれ以上の情報は見つからず、 pcntl_signalコマンドを使っても、思うような動作結果になってくれません。

途方にくれましたが、まずは動かしてみることでアイデアが思い浮かびました。

PHPAGIは、回線切断の状態であれば、戻り値のresultが-1になるので、それを判定して回線切断時の処理を行えばよさそうです。
---
$result = $agi->stream_file("custom/welcome");
if($result['result']==-1){
//回線切断時の処理
exit;
}
---

現状ではこのアイデアでいきます。