PHP foreach循环缓慢实时仪表板。我有什么选择?

时间:2012-11-14 12:57:21

标签: php xml cron

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

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

我使用 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分钟才能完成循环并将所有结果返回到Dashboard页面。至关重要的是,CallCenter用户可以查看在给定时间有多少用户/代理可用,以便他们知道是否有足够的代理可用于处理CallCenter负载。

可能的解决方案:
对我的案子来说,最好的解决办法是什么?

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

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

4 个答案:

答案 0 :(得分: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>
...
希望这很清楚。

答案 1 :(得分:0)

我必须在上面的评论中完全赞同@Alexandru Mihai。

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

因此,即使您的代理脚本滞后,您仍然会在js级别获得其他运算符的有效响应,因此整个过程将会感觉顺畅且响应迅速。

答案 2 :(得分:0)

由于我们在评论中确定用户列表是静态定义的,而不是以某种方式查询,因此您可以让页面知道用户列表。

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

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

答案 3 :(得分:0)

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