2013-03-21 46 views
0

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

我设计了一个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; 
} 



?> 
+0

我应该注意:我的问题是没有人有任何想法如何使这更有效? – 2013-03-21 15:31:57

回答

0

如果我们假设您可以修改Web服务,那么我认为解决的办法是很明显?

你会创建一个名为“getCountriesWithFactories()”的新功能,用户可以添加此服务,Web服务,运行在数据库中查询,而不是试图过滤掉客户端(在PHP中)

该调用只是retu任何有工厂的国家。编写一个MySQL查询(或者你正在使用的)应该很容易。

现在速度缓慢的原因是您正在遍历每个国家并在每个国家/地区进行一次HTTP调用。因此,对于每次页面加载,您都会对Web服务进行210次调用。

如果您可以改为实现getCountriesWithFactories方法,则每个页面只能加载1个调用。

希望是有道理的。