2016-04-11 2 views
1

Как я могу самым простым образом повторно использовать SOAP-соединение, если оно уже создано?Повторное использование PHP SOAP-соединения, если оно уже создано?

Функция подключения мыла во многих случаях может запускать многопользовательские времена при загрузке одной страницы на PHP, поэтому нет необходимости заново создавать соединение, если оно было создано - его просто нужно повторно использовать.

(И иногда его даже не запускают, потому что он не нужен, поэтому было бы пустой тратой времени, называя его в начале всей страницы PHP. Функция должна быть выполнена только там, где есть необходимость connect.)

Я знаю, что есть другие решения этой проблемы (когда я это делаю), но я не смог их понять. Я много пробовал, но они не работали для меня. Я даже попытался сохранить объект SOAP в сеансе, чтобы следующая загруженная страница PHP могла повторно использовать мыльное соединение (из предыдущей загрузки PHP), но оно не работало истребителем.

Лучшее решение заключается в том, что соединение запоминается для загрузки всех страниц PHP в сеансе браузера, а следующим лучшим решением является то, что он запоминается для текущей загрузки страницы PHP.

Вот мой код:

protected static function Economic_API() { 

    static $client; 

    $settingsOld = Settings::GetOld();  

    try {    
     $client = new SoapClient("https://api.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL", array("trace" => 1, "exceptions" => 1)); 
     $client->ConnectWithToken(array(
      'token' => $settingsOld->economic_token_secret, 
      'appToken' => $settingsOld->economic_token_app 
     ));   
    } 
    . 
    . 
    . 

ОБНОВЛЕНО КОД:

class EcoAPI { 

static $client; 

static public function getClient() { 

    if (empty(self::$client)) { 
     self::initClient(); 
    } 

    return self::$client; 
} 

static private function initClient() { 

    $settingsOld = Settings::GetOld(); 
    self::$client = new SoapClient("https://api.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL", array("trace" => 1, "exceptions" => 1)); 
    self::$client->ConnectWithToken(array('token' => $settingsOld->economic_token_secret, 'appToken' => $settingsOld->economic_token_app));   

} 
} 

И называть его:

$result = EcoAPI::getClient()->Account_FindByNumber(array('number' => intval($accountID))); 

ответ

2

, возможно, вы могли бы попробовать использовать класс вместо функции. Соединение будет жить в вашем экземпляре класса, в то время как публичная функция getClient() доступна для приложения для использования соединения soapClient.

class Economic_API { 

    private $client; 
    private $token; 
    private $appToken; 

    public function __construct($token, $appToken){ 
     $this->token = $token; 
     $this->appToken = $appToken; 
    } 

    private function initClient() { 
     $this->client = new SoapClient("https://api.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL", array("trace" => 1, "exceptions" => 1)); 
     $this->client->ConnectWithToken(array(
      'token' => $settingsOld->economic_token_secret, 
      'appToken' => $settingsOld->economic_token_app 
     ));   
    } 

    /** 
     * @returns SoapClient 
     */ 
    public function getClient() { 
     if($this->client === null) { 
      $this->initClient(); 
     } 
     return $this->client; 
    }   
} 
$token = '123'; 
$appToken = "abc" 
$economicApi = new Economic_API($token, $appToken); 

$economicApi->getClient()->YourSoapFunction(); 
+0

Он продолжает инициализацию. Это не повторное использование мыльного соединения при следующем вызове клиента мыла. Зачем? Я обновил свой код выше. –

+0

Я исправил это, сделав статические функции :-) –

Смежные вопросы