PHP foreach循环为live dashboard减慢速度。我有什么选择?

PHP foreach循环为live dashboard减慢速度。我有什么选择?,php,xml,cron,Php,Xml,Cron,我正在使用PHP从呼叫中心获取大约80个用户的可用性数据。我希望每隔5秒向呼叫中心查询每个用户的状态/可用性,并在仪表板上显示结果 呼叫中心一次只能通过URL为一个用户查询,并且用户名在URL中(因此URL不是常量)。来自呼叫中心的答案在XML页面中。我一直在使用fopen()读取url/XML的内容,因为这总是一个随机生成的XML名称,因此查询url指向一个目录,而不是确切的XML url 我使用了一个foreach循环,其中USER001使用一个唯一的url,读取XML页面的内容并更新一个变

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

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

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

用户阵列:

$users = array( 
        "username" => array("fullname" => "Full Name",
                            "status" => ""  
                            ),
        "username" => array("fullname" => "Full Name",
                            "status" => "")
                );
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"; }
Foreach循环:

$users = array( 
        "username" => array("fullname" => "Full Name",
                            "status" => ""  
                            ),
        "username" => array("fullname" => "Full Name",
                            "status" => "")
                );
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秒就会查询所有用户的呼叫中心服务器

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

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

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

这是一个“智能”解决方案吗?您会推荐什么以及如何编写?

(我是PHP乞丐)

我必须完全同意@Alexandru Mihai在上面的评论

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


因此,即使您的代理脚本落后,您仍然会得到js级别上其他操作员的有效响应,因此整个过程将感觉平稳且响应迅速。

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

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

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

第一次使用

echo microtime(true)
在GET查询之前和之后,确定您从呼叫中心获得响应的速度-这将让您知道您的最大收益是来自(A)查询数量还是(B)单个查询的速度

如果您无法让呼叫中心更改其数据处理过程,您也必须按照下面所述的快速路线进行:

处理ajax/jQuery调用。

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

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

...

希望这是清楚的。

只想感谢所有回复的用户。我认为用这种方法解决我的问题没有什么好办法,所以我最后还是按照我在最初的帖子中的建议去做。我使用cronjob创建了多个每1分钟运行一次的页面并收集数据。然后其他页面每隔x秒提取一次数据。

查询呼叫中心需要1分钟?@SkuliAxelson尝试优化您的脚本,似乎文件\u get\u contents()的速度要快一点。也许,你可以试着为每个用户创建一个php文件,每X秒同时启动它们@SkuliAxelson我会创建一个数据库,在数据库中输入用户的状态。我单独创建php文件,并使用cronjob同时更新用户状态(类似于status_updater.php)。另一方面,一个php文件(get_status.php)每5秒解析一次数据库中用户的状态,当然jQuery用于获取客户端的状态。@HamZa DzCyberDeV-感谢您提供了文件“get_contents()info”。我要照你的建议去试。有一个DataCollector.php、AgentInfo.php,然后每4个用户有一个页面,获得4个结果并将它们发送到DataCollector页面。然后,仪表板包括DataCollector,jquery更新用户的统计信息。@HamZaDzCyberDeV+1这将充当数据的“缓存”。我使用microtime(开始和结束)来进行time1用户查询。结果为0.579805。我将研究线程化,每页大约4个调用。前几天我尝试了jquery,但由于这是一个跨域查询,我无法让jquery工作。啊,是的,这可能会造成问题,你可以使用php get脚本为你做这件事,文件内容既可以发布,也可以访问任何url。因此,基本上您可以使用ajax调用本地脚本,本地脚本从外部url获取,本地ajax调用不应该延迟您的时间。