2

我正在使用 PHP 从呼叫中心获取有关 80 个用户的可用性数据。我希望每 5 秒向 CallCenter 查询每个用户的状态/可用性,并将结果显示在仪表板上。

CallCenter 一次只能通过 URL 查询一个用户,并且用户名在 url 中(因此 url 不是恒定的)。CallCenter 的答案在 XML 页面中。我一直在使用fopen()来读取 url / XML 的内容,因为这始终是随机生成的 XML 名称,因此查询 url 指向一个目录,而不是确切的 xml url。

我的所有东西都使用foreach循环,其中唯一的 url 用于 USER001,读取 XML 页面的内容并更新变量。演示代码:

用户数组:

$users = array( 
        "username" => array("fullname" => "Full Name",
                            "status" => ""  
                            ),
        "username" => array("fullname" => "Full Name",
                            "status" => "")
                );

Foreach 循环:

foreach($users as $username => $userstatus) {
$url = 'http://'.$username.':PasswordForUser@serveraddress.com:80/callcenter/'.$username.'/services/callcenter/';
$get = fopen($url, "r");
    if ($get) {
        while (!feof($get)) {
            $status = fgets($get, 4096);
        }
        fclose($get);
    }
if(strpos($status, 'Available')) { $users[$username]["status"] = "Available"; } else { $users[$username]["status"] = "Offline"; }

}

问题:
我有一个 jquery 脚本,它每 5 秒刷新一次仪表板,因此每 5 秒向 CallCenter 服务器查询所有用户。

这可行,但查询实际上需要 1 多分钟才能完成循环并将所有结果返回到仪表板页面。CallCenter 用户可以看到在给定时间有多少用户/代理可用,以便他们知道是否有足够的代理可用以处理 CallCenter 负载,这一点至关重要。

可能的解决方案:
什么是我的案例的最佳解决方案?

我想到的是为每个用户创建一个 PHP 页面。有一个 CRONJOB,每 x 小时运行一次页面(刷新),页面上有一个脚本,每 5 秒循环通过 XML 查询到 CallCenter。在每个循环结束时(每 5 秒),用户状态被发送到并更新收集器页面。每个用户页面将结果发送到收集器页面,然后仪表板页面每 5 秒将数据获取到收集器页面。

这是一个“聪明”的解决方案吗?你会推荐什么,你会如何编码?
(我是 PHP 初学者)

4

4 回答 4

1

首次使用

echo microtime(true)

在 GET 查询之前和之后确定您从呼叫中心获得的响应速度 - 这将使您了解您的最大收益是否来自 (A) 查询数量或 (B) 单个查询的速度询问。

如果您无法让呼叫中心更改他们的数据流程,您也将不得不走这条路线,如下所述:

线程化你的 ajax/jQuery 调用。

当您的页面刷新时 - 执行 4-6 次 ajax 调用,将线程 ID 传递给脚本,然后溢出用户数据收集,即:每个线程 80 / 4 = 20 个用户(大多数浏览器只能处理几个 http 请求,所以不要创建太多线程,因为它们基本上会堆叠并等待一个完成 - 这不是你想要的) - 一旦返回数据,你可以简单的 jquery 写入一个 id 即:

<div id="threadresults1"></div>
<div id="threadresults2"></div>
<div id="threadresults3"></div>
...

希望这很清楚。

于 2012-11-14T13:41:09.427 回答
0

我必须完全同意@Alexandru Mihai 在他上面的评论中的观点。

不要在 php 中运行 foreach 循环,而是将其放到 jQuery 级别,并将您的 php 脚本仅用作一对一代理。这将占用更多资源,但同时您将能够同时运行无限数量的线程/读取,因为 JS 依赖于回调,而 php 一次只需要处理一个名称。

所以即使你的代理脚本落后了,你仍然会在 js 级别上得到其他操作员的有效响应,因此整个过程会感觉流畅且响应迅速。

于 2012-11-14T13:32:40.217 回答
0

由于我们在评论中建立了用户列表是静态定义的,并且不会以某种方式查询,因此您可以让页面了解用户列表。

然后你可以为每个用户异步查询一个php页面:queryPage.php?username=john

在该页面中,您只需查询该特定用户的呼叫中心。因此,为所有 60 个用户设置 60 个异步请求而不是仅 1 个应该对您的情况有所帮助。

于 2012-11-14T13:35:58.133 回答
0

只是想感谢所有回复的用户。我不认为这种方法可以很好地解决我的问题,所以我按照我在最初帖子中的建议结束了。我创建了多个页面,每 1 分钟运行一个 cronjob 并收集数据。然后其他页面每 x 秒获取一次数据。

于 2012-11-27T16:15:51.290 回答