解析XML太慢了?

时间:2015-06-13 15:36:44

标签: php mysql xml

我读过类似的问题,但我不明白如何更快地从网址获取xml数据?

为什么这段代码运行得如此之慢:

while($id = $getFix->fetch()){ 
    $odds=$this->soccer->GetAllOddsByFixtureMatchId(array("fixtureMatch_Id"=>$id['Id']));
    }

    if(!empty($odds)){
       $stmt = $this->PDO->prepare("CALL insupd_Odds(:fixturematchid, :bookmaker, :updatedDate, :type,:homeodds, :drawodds, :awayodds, :handicap)");
    foreach($odds as $key=>$value){
       $stmt->bindParam(':fixturematchid',$value->FixtureMatch_Id);
       $stmt->bindParam(':bookmaker',$value->Bookmaker);    
       $stmt->bindParam(':updatedDate',$value->UpdatedDate);
       $stmt->bindParam(':type',$value->Type);
       $stmt->bindParam(':homeodds',$value->HomeOdds);
       $stmt->bindParam(':drawodds',$value->DrawOdds);
       $stmt->bindParam(':awayodds',$value->AwayOdds);
       $stmt->bindParam(':handicap',$value->Handicap);
       $stmt->execute();
    }
    }

我需要列出存储在我的数据库中的夹具ID的所有赔率,所以我需要从数据库调用所有ID并将该ID发送给xml送货员,他从夹具中返回所有赔率然后我存储它进入数据库...... 它运行超过300秒然后执行...

这是一个重要的解析器代码:

public function __call($name,$params){
    $data=$this->request($this->buildUrl($name,$params));
    if(false===($xml = simplexml_load_string($data))) throw new XMLSoccerException("Invalid XML");
    if(strstr($xml[0],"To avoid misuse of the service")){
        switch($name){
            case "GetLiveScore":
            case "GetLiveScoreByLeague":
            case "GetOddsByFixtureMatchID":
            case "GetHistoricMatchesByLeagueAndSeason":
            case "GetAllTeams":
            case "GetAllTeamsByLeagueAndSeason":
                throw new XMLSoccerException($xml[0],constant("self::TIMEOUT_".$name));
            default:
                throw new XMLSoccerException($xml[0],self::TIMEOUT_Others);
        }
    }
    return $xml;
}

我知道这可能是xml检查id中的主要问题,但这只是我可以通过灯具获得赔率的方式,也可以由联盟使用,但它是相同的......

感谢。

1 个答案:

答案 0 :(得分:1)

以下......

while($id = $getFix->fetch())
{ 
  $odds=$this->soccer->GetAllOddsByFixtureMatchId(array("fixtureMatch_Id"=>$id['Id']));
}

看起来你可能正在远程查询一大堆赔率但是将它们全部存储在同一个变量中。当您离开循环时,您可以收集最后一组可用于插入/更新或其他处理的赔率。

然而,对于你正在做什么,期望做什么和返回的不同方法有更多的描述,这将是非常好的。等等。

再次猜测,但也许您的记录上次更新日期?如果是这样,并且你依赖它,那么第一个调用可能会返回所有记录,然后下一个调用可能会返回除一个记录以外的所有记录(因为它看起来只有最后一个记录被处理),依此类推。这是对外部网站的大量获取请求 - 这可以解释很长的执行时间。

如果我咆哮错误的树,请提供更多详细信息,我会尝试提供更好的诊断。