0

いくつかのガイダンスが必要な複雑な問題があります。私たちは、世界中の工場が倫理的かどうかを認定する非営利団体です。世界中の認定工場の名前と連絡先情報を返す WSDL Web サービスがあります。パラメータとして 3 文字の文字列を受け入れます (つまり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クエリ(または使用しているもの)を作成するのは非常に簡単です。

現在遅い理由は、すべての国をループして、国ごとに 1 つの HTTP 呼び出しを行っているためです。したがって、ページが読み込まれるたびに、Web サービスに対して 210 回の呼び出しが行われます。

代わりに getCountriesWithFactories メソッドを実装できる場合は、ページの読み込みごとに 1 回の呼び出しのみを行います。

それが理にかなっていることを願っています。

于 2013-03-22T03:27:42.933 に答える