You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8中使用Marcelog Pami监听Asterisk事件无响应问题

解决Laravel 8中使用Pami无法接收FreePBX/ Asterisk AMI事件的问题

以下是针对性的排查和解决步骤:

1. 检查FreePBX的AMI用户权限配置

FreePBX的AMI用户必须具备事件读取权限,否则即使连接成功也收不到事件:

  • 登录FreePBX后台,进入「Settings → Asterisk Manager Users」
  • 找到你用于连接的AMI用户,确保勾选了需要监听的事件权限(比如Call Events、Bridge Events等,直接选Read All可以快速测试)
  • 也可以直接修改/etc/asterisk/manager.conf的用户配置段:
    [laravel_ami_user]
    secret=your_secure_password
    permit=192.168.x.x/255.255.255.0 ; 填写Laravel服务器的IP段
    read=all ; 授予所有事件读取权限
    write=all ; 如果需要发送AMI命令则保留,仅监听可设为write=none
    

修改后执行fwconsole reload生效。

2. 确保Pami正确注册事件监听回调

官方基础代码可能仅实现了连接,需要手动注册事件处理逻辑:

// 在你的AmiTestListener中,连接成功后添加事件监听
use PAMI\Client\Impl\ClientImpl;
use Illuminate\Support\Facades\Log;

public function handle()
{
    $options = [
        'host' => env('AMI_HOST'),
        'port' => env('AMI_PORT', 5038),
        'username' => env('AMI_USER'),
        'secret' => env('AMI_PASSWORD'),
        'read_timeout' => 0, // 长连接禁用超时
    ];

    $pamiClient = new ClientImpl($options);
    try {
        $pamiClient->open();
        
        // 注册全局事件监听
        $pamiClient->registerEventListener(function ($event) {
            // 打印事件类型和数据到日志,方便排查
            Log::info('AMI事件触发', [
                '类型' => get_class($event),
                '数据' => $event->getKeys()
            ]);
        });

        // 维持长连接循环(关键!否则连接会立即断开)
        while (true) {
            $pamiClient->process();
            usleep(100000); // 每100ms处理一次事件队列
        }
    } catch (\Exception $e) {
        Log::error('AMI连接失败: ' . $e->getMessage());
        $pamiClient->close();
    }
}

3. 修正Laravel监听器的运行方式

Laravel的请求周期监听器会在请求结束后销毁连接,无法维持AMI长连接,正确做法是:

  • 创建Artisan命令来运行AMI监听进程(如上面代码中的逻辑)
  • 使用Supervisor等工具守护该进程,防止意外退出:
    ; /etc/supervisor/conf.d/ami_listener.conf
    [program:ami_listener]
    command=php /path/to/your/laravel/project/artisan ami:listen
    autostart=true
    autorestart=true
    user=www-data
    redirect_stderr=true
    stdout_logfile=/var/log/ami_listener.log
    

4. 验证Asterisk是否真的发送事件

在FreePBX服务器的命令行执行asterisk -rvvv,然后发起测试通话,执行manager show events查看是否有事件输出;也可以用tcpdump抓包验证:

tcpdump -i eth0 port 5038 and host [Laravel服务器IP]

如果有数据包传输,说明问题在Laravel/Pami侧;如果没有,回到FreePBX的AMI权限配置检查。

5. 检查版本兼容性

确保安装的Pami版本兼容Laravel 8,执行:

composer require marcelog/pami:^2.0

内容的提问来源于stack exchange,提问作者Aleg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:06:32