我有一个复杂的问题,我需要一些指导。我们是一家非营利组织,对全世界的工厂进行道德或非道德认证。我们有一个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;
}
?>
答案 0 :(得分:1)
如果我们假设您可以修改Web服务,那么我认为解决方案非常明显?
你会创建一个名为“getCountriesWithFactories()”的新函数。您可以将此服务添加到Web服务并在数据库中运行查询,而不是尝试将其过滤到客户端(在PHP中)。
通话只会返回任何拥有工厂的国家/地区。编写MySQL查询(或者你正在使用的任何东西)应该很容易做到这一点。
现在它变慢的原因是你在每个国家/地区循环并为每个国家/地区拨打一个HTTP电话。因此,对于每个页面加载,您都会对Web服务进行210次调用。
如果你可以实现getCountriesWithFactories方法,那么每页加载只能进行1次调用。
希望这是有道理的。