如果已经创建,请重新使用PHPSOAP连接


Re-use PHP SOAP connection if already created?

如果SOAP连接已经创建,我如何以最简单的方式重用它?

在许多情况下,soap连接函数可以在一个PHP页面加载过程中多次运行,因此如果已经创建了连接,就不需要重新创建,只需要重新使用即可。

(有时它甚至根本不运行,因为不需要它,所以在所有PHP页面的开头调用它会浪费时间。该函数只需要在需要连接时运行。)

我知道这个问题还有其他解决方案(当我在谷歌上搜索时),但我没能理解它们。我尝试了很多方法,但都不适用。我甚至尝试将SOAP对象存储在会话中,这样加载的下一个PHP页面就可以重用SOAP连接(来自以前的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)));

也许您可以尝试使用类而不是函数。当公共函数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();