来自MySQL的星号并发调用

来自MySQL的星号并发调用,mysql,concurrency,asterisk,Mysql,Concurrency,Asterisk,我试图通过MySQL查询从我的CDR获得asterisk报告的并发调用。我看到了其他的建议,其中包括连接和连接,以及一些我不完全理解他们在做什么的其他调用,因此我无法根据我的应用程序进行调整 我有多个部门有自己的DID,我需要单独的报告。我当前的脚本是错误的,因为它获取了一个正在进行的呼叫时发生的呼叫数,这意味着如果一个呼叫从下午1点连接到下午2点,它将统计下午1点到下午2点之间发生的所有后续呼叫,这不是我想要的。我想要的是并发调用的数量,而不是发生了多少调用 我的数据集 我想了解计费部门的最大

我试图通过MySQL查询从我的CDR获得asterisk报告的并发调用。我看到了其他的建议,其中包括连接和连接,以及一些我不完全理解他们在做什么的其他调用,因此我无法根据我的应用程序进行调整

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

我的数据集

我想了解计费部门的最大并发呼叫数:

asterisk -rx "core show calls" | grep "active" | cut -d' ' -f1
计费部门的DID: 1212111111 1212333333

因此,上述结果将是: 最大并发呼叫数:3

我正试图用MySQL和PHP来实现这一点,因此格式和所有内容都与网页无关。我只需要从MySQL查询中得到3

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

目前我看到的唯一方法是通过每一行的内部循环遍历每一行,查看它是否发生在外部循环期间,如果超过,则增加max concurrent

想法

谢谢,
-做这件事没有简单的方法

最简单的方法是这样做:

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 
但是这个查询将非常糟糕

优化: 为每个内部查询添加calldate限制

您可以使用php来完成。只需按calldate对所有查询进行排序,然后将相同的集合放入stopdate=calldate+duration。将这些记录标记为结束记录

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


或者使用pl sql执行同样的操作。这一变体很可能会快得多。

如果您有权访问Asterisk CLI,那么您可以在Asterisk server console上启动一个命令,并获得并发调用数:

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";

?>

我同意这一点,并且在每小时进行基准测试时实际使用了这个命令。然而,当我试图确定部门的使用情况时,这并没有帮助。我正在尝试每天从特定号码获取最大并发呼叫数检查所有记录。对于每个记录,检查在该记录的开始和停止之间开始的所有记录在该记录结束后,您得到的调用较少,所以最大值应该在某些记录内。