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
相关产品推荐
相关产品推荐

