0

我有一个复杂的问题需要一些指导。我们是一家非营利组织,负责认证世界各地的工厂是否符合道德规范。我们有一个 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;
}



?>
4

1 回答 1

1

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

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

该调用仅返回任何拥有工厂的国家/地区。编写一个 MySQL 查询(或您正在使用的任何东西)应该很容易做到这一点。

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

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

希望这是有道理的。

于 2013-03-22T03:27:42.933 回答