中级PHP开发者求助:Asterisk坐席登录及会话维护分步实现指南
嘿,作为常年和Asterisk+PHP打交道的呼叫中心开发者,我来给你拆解第一周的三个任务,一步步帮你搞定坐席登录、会话维持和重定向的事儿:
分步实现坐席登录与Asterisk连接、会话维持及重定向
1. 坐席登录并连接Asterisk
核心是通过**Asterisk Manager Interface(AMI)**建立PHP和Asterisk的通信,同时验证坐席的MySQL账号。
步骤1:配置Asterisk AMI权限
首先得让Asterisk允许你的PHP服务器连接。编辑Asterisk的/etc/asterisk/manager.conf,添加一个专门给坐席用的AMI账号:
[agent_ami_user] secret=YourStrongAMI@Password123 deny=0.0.0.0/0.0.0.0 permit=192.168.1.100/255.255.255.0 ; 替换成你的PHP服务器IP read=agent,call,status ; 只给必要的读取权限 write=originate,agent ; 只给必要的写入权限
保存后重启AMI服务:
asterisk -rx "manager reload"
步骤2:实现登录表单与MySQL验证
先做一个简单的HTML登录页(login.html):
<!DOCTYPE html> <html> <head> <title>坐席登录</title> </head> <body> <h1>呼叫中心坐席登录</h1> <form method="POST" action="login.php"> <div> <label>坐席账号:</label> <input type="text" name="agent_username" required> </div> <div> <label>密码:</label> <input type="password" name="agent_password" required> </div> <button type="submit">登录</button> </form> </body> </html>
然后写PHP处理逻辑(login.php),先验证MySQL里的坐席账号,再连接Asterisk:
<?php session_start(); // 初始化数据库连接 $db = new mysqli('localhost', 'db_username', 'db_password', 'call_center_db'); if ($db->connect_error) die("数据库连接失败:" . $db->connect_error); // 获取表单提交的账号密码 $agent_username = trim($_POST['agent_username']); $agent_password = trim($_POST['agent_password']); // 验证坐席账号(假设agents表存了username、哈希密码、分机号) $stmt = $db->prepare("SELECT id, password, extension FROM agents WHERE username = ?"); $stmt->bind_param("s", $agent_username); $stmt->execute(); $result = $stmt->get_result(); $agent = $result->fetch_assoc(); // 密码验证(一定要用哈希存储!) if (!$agent || !password_verify($agent_password, $agent['password'])) { die("<script>alert('账号或密码错误'); window.location.href='login.html';</script>"); } // 连接Asterisk AMI(用composer安装的php-asterisk-manager库) require_once 'vendor/autoload.php'; use Asterisk\Manager; $ami = new Manager(); try { $ami->connect('你的Asterisk服务器IP', 'agent_ami_user', 'YourStrongAMI@Password123'); // 可选:监听坐席上线事件,做日志记录 $ami->addEventListener(function($event) use ($agent) { error_log("坐席 {$agent['username']} 已上线,事件:" . $event->getName()); }); } catch (Exception $e) { die("<script>alert('连接Asterisk失败:{$e->getMessage()}'); window.location.href='login.html';</script>"); } // 保存关键信息到会话 $_SESSION['agent_id'] = $agent['id']; $_SESSION['agent_username'] = $agent['username']; $_SESSION['agent_extension'] = $agent['extension']; // 注意:不要直接序列化AMI对象,建议存连接参数,需要时重新连接 $_SESSION['ami_config'] = [ 'host' => '你的Asterisk服务器IP', 'user' => 'agent_ami_user', 'pass' => 'YourStrongAMI@Password123' ]; // 重定向到Campaign页面 header("Location: campaign.php"); exit; ?>
如果还没安装AMI库,用Composer安装:
composer require php-asterisk/php-asterisk-manager
2. 登录后维持坐席会话
要确保两个层面的会话:PHP用户会话,以及PHP和Asterisk的连接会话。
步骤1:PHP会话验证与续命
在所有需要登录的页面(比如campaign.php)开头,先验证会话有效性:
<?php session_start(); // 设置会话超时时间(30分钟) ini_set('session.gc_maxlifetime', 1800); session_set_cookie_params(1800); // 检查会话是否有效 if (!isset($_SESSION['agent_id'])) { header("Location: login.html"); exit; } // 续命会话(刷新会话过期时间) $_SESSION['last_activity'] = time(); ?>
步骤2:维持Asterisk连接
Asterisk的AMI连接如果长时间闲置会断开,所以可以用AJAX定时发送Ping请求续命:
在campaign.php里加一段JS:
<script> // 每30秒发送一次续命请求 setInterval(() => { fetch('keep_alive.php') .then(res => res.text()) .then(msg => console.log('Asterisk连接状态:', msg)) .catch(err => console.error('续命失败:', err)); }, 30000); </script>
然后写keep_alive.php处理Ping请求:
<?php session_start(); if (!isset($_SESSION['agent_id'])) exit; require_once 'vendor/autoload.php'; use Asterisk\Manager; $ami_config = $_SESSION['ami_config']; $ami = new Manager(); try { $ami->connect($ami_config['host'], $ami_config['user'], $ami_config['pass']); $ami->sendRequest('Ping'); echo "连接正常"; } catch (Exception $e) { echo "连接断开:" . $e->getMessage(); // 可选:清除会话,让用户重新登录 // session_destroy(); } ?>
3. 将用户重定向至Campaign
这一步其实在登录成功后已经用header("Location: campaign.php")实现了,但要注意两个细节:
- 必须在输出任何HTML内容之前调用
header(),否则会报错(如果有输出,可以用ob_start()开启输出缓冲) - 在
campaign.php里一定要验证会话有效性,防止未登录用户直接访问
内容的提问来源于stack exchange,提问作者Zargham irtza
相关产品推荐
相关产品推荐

