【问题标题】:Asterisk Concurrent Calls from MySQL来自 MySQL 的 Asterisk 并发调用
【发布时间】:2017-02-01 21:31:01
【问题描述】:

我正在尝试从我的 CDR 中获取并发调用,以通过 MySQL Query 进行星号报告。我看到了其他建议,其中包括 JOIN 和 ON 以及其他一些我不完全了解它们在做什么的调用,因此我无法针对我的应用程序进行调整。

我有多个部门,他们有自己的一组 DID,我需要单独的报告。我当前的脚本是错误的,因为它获取了通话进行时发生的通话次数,这意味着如果从下午 1 点到下午 2 点连接了一个呼叫,它将计算在下午 1 点到 2 点之间发生的所有后续呼叫,这不是我的想。我想要并发呼叫的数量而不是发生的呼叫数量。

我的数据集

calldate            | callsource  | calldestination | duration | callended
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:00 | 12121111111 | 12031234567     | 120      | 2016-12-01 15:47:00          
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:10 | 12122332223 | 12121111111     |  15      | 2016-12-01 15:45:25 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:12 | 12121111111 | 12033254678     | 15       | 2016-12-01 15:45:27 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:20 | 12123333333 | 12031223244     | 50       | 2016-12-01 15:47:10 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:26 | 12121111111 | 12031231222     | 10       | 2016-12-01 15:45:33 
--------------------|-------------|-----------------|----------|----------
2016-12-01 15:45:27 | 12120433322 | 12031456544     | 10       | 2016-12-01 15:45:37 

我想知道计费部门的最大并发通话数:

帐单部门的 DID:
1212111111
1212333333

所以上面会输出:
最大并发调用数:3

我正在尝试使用 MySQL 和 PHP 来执行此操作,因此格式和所有内容都与网页端无关。我只需要从 MySQL 查询中取出 3。

我当前的尝试将返回 5,因为它们都发生在第一次调用的开始和结束时间内。

我目前看到这样做的唯一方法是遍历每一行,每行的内循环查看它是否发生在外循环期间,如果超过则增加最大并发数。

想法?

谢谢,
--E

【问题讨论】:

    标签: mysql concurrency asterisk


    【解决方案1】:

    如果您可以访问 Asterisk CLI,那么您只需在 Asterisk 服务器控制台上触发一个命令,您就会获得并发调用的数量:

    asterisk -rx "core show calls" | grep "active" | cut -d' ' -f1
    

    你可以在 PHP 脚本中使用的这个命令也像:

    <?php
    
    $cmd = `asterisk -rx "core show calls" | grep "active" | cut -d' ' -f1`; //getting current active calls on asterisk server
    echo "ConCurrentCalls:".$cmd."\n";
    
    ?>
    

    【讨论】:

    • 我同意这一点,我实际上在每小时进行基准测试时会使用此命令。但是,当我尝试确定部门的使用情况时,这无济于事。我正在尝试每天与特定号码进行最大并发呼叫
    【解决方案2】:

    没有简单的方法。

    最简单的方法是这样做:

    select max(c) from 
     ( select a.uniqueid,a.calldata,
        (select count(*) from cdr as b
           where  
            b.calldate <date_add(a.calldate,interval a.duration second) and  
            date_add(b.calldate,interval  b.duration second) >a.calldate
        ) as c    
     from cdr as a ) as res 
    

    但是这个查询将是非常非常糟糕的优化。

    优化: 为每个内部查询添加调用日期限制

    您可以使用 php。只需按 calldate 整理所有查询,然后使用 stopdate=calldate+duration 放置相同的集合。将此类记录标记为结束记录。

    在对两组进行排序之后,通过结果循环。当您看到开始记录时,请执行 +1。当你看到停止记录时,检查当前值是否>max(如果是,设置max=c)并减少计数。

    或者使用 pl-sql 做同样的事情。这一种变体很可能会快得多。

    【讨论】:

    • 检查所有记录。对于每条记录,检查从该记录的开始和停止之间开始的所有记录(在该记录结束后,您会收到 LESS 调用,因此最大值应该在某个记录内)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多