需要通过WSDL返回对大量数据进行排序

时间:2013-03-21 15:26:44

标签: php html database arrays wsdl

我有一个复杂的问题,我需要一些指导。我们是一家非营利组织,对全世界的工厂进行道德或非道德认证。我们有一个WSDL Web服务,它返回全球各国认证工厂的名称和联系信息。它接受一个三字母字符串作为参数(即孟加拉国为BGD,中国为CHN,哥伦比亚为COL

我设计了一个带有HTML选择的页面,以便用户可以选择一个国家/地区并查看工厂列表。我希望能够编写一种过滤器,只能将经过认证的工厂的国家列入此列表中,并将那些没有认证工厂的国家排除在外。

我已经编写了以下代码来完成这项工作,但是它的速度非常慢并且真的让网站陷入困境。 (为了简洁起见,我只包括前几个国家。完整的数组包括大约210个国家。此外,factCountByCountryID()函数返回当前在给定国家/地区的工厂数量。

<?php
ini_set("soap.wsdl_cache_enabled", "0");    
$client = new SoapClient("http://apollov-dev.worlddata.com:8080/WrapSystem/services/FactoriesWS?wsdl",array("trace" => 1,     "exceptions" => 0));

$countryList=array("AFG"=>"Afghanistan","ALA"=>"Aland Islands","ALB"=>"Albania","DZA"=>"Algeria","ASM"=>"American Samoa","AND"=>"Andorra","AGO"=>"Angola","AIA"=>"Anguilla","ATG"=>"Antigua and Barbuda","ARG"=>"Argentina","ARM"=>"Armenia","ABW"=>"Aruba","AUS"=>"Australia","AUT"=>"Austria","AZE"=>"Azerbaijan","BHS"=>"Bahamas","BHR"=>"Bahrain","BGD"=>"Bangladesh","BRB"=>"Barbados","BLR"=>"Belarus","BEL"=>"Belgium","BLZ"=>"Belize","BEN"=>"Benin","BMU"=>"Bermuda","BTN"=>"Bhutan","BOL"=>"Bolivia","BIH"=>"Bosnia and Herzegovina","BWA"=>"Botswana","BRA"=>"Brazil","VGB"=>"British Virgin Islands","BRN"=>"Brunei Darussalam","BGR"=>"Bulgaria","BFA"=>"Burkina Faso","BDI"=>"Burundi","KHM"=>"Cambodia","CMR"=>"Cameroon","CAN"=>"Canada","CPV"=>"Cape Verde","CYM"=>"Cayman Islands");


foreach($countryList as $code=>$country)
{
    $params->countryCd=$code;
    $number=$client->factCountByCountryID($params);
    $factval=$number->factCountByCountryIDReturn;
    if($factval!=0)
    {
        $countriesWithFactories["$code"]="$country";
    }
    else continue;
}



?>

1 个答案:

答案 0 :(得分:1)

如果我们假设您可以修改Web服务,那么我认为解决方案非常明显?

你会创建一个名为“getCountriesWithFactories()”的新函数。您可以将此服务添加到Web服务并在数据库中运行查询,而不是尝试将其过滤到客户端(在PHP中)。

通话只会返回任何拥有工厂的国家/地区。编写MySQL查询(或者你正在使用的任何东西)应该很容易做到这一点。

现在它变慢的原因是你在每个国家/地区循环并为每个国家/地区拨打一个HTTP电话。因此,对于每个页面加载,您都会对Web服务进行210次调用。

如果你可以实现getCountriesWithFactories方法,那么每页加载只能进行1次调用。

希望这是有道理的。