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

中级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:40:50