有人能告诉我为什么SOAP客户端没有被重用吗?它不断被初始化,应该从最后一次调用中重用它。
当我在初始化后打印出SOAP客户端对象时,它就在那里,但是在下次调用时会忘记它。
因此php脚本不断初始化连接。
我的代码:
class EcoAPI {
private $client;
public function getClient() {
if (empty($this->client)) {
echo "<br>initializing...";
$this->initClient();
}
return $this->client;
}
private function initClient() {
$settingsOld = Settings::GetOld();
$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));
}
}
我通过以下方式连接:
$ecoApi = new EcoAPI();
$result = $ecoApi->getClient()->Account_GetVatAccount(array('accountHandle' => (object) array('Number' => (string) $VatAccount)));
答案 0 :(得分:1)
每次您创建新的EcoAPI对象时,它都不会拥有任何SOAP客户端信息。只要您使用注入相同的$ecoApi->getClient()->...
对象,在整个代码中使用$ecoApi
应该可以正常工作。
如果要确保每个EcoAPI对象都具有相同的连接对象,无论如何,您可以尝试使用静态方法使客户端成为静态属性来操作SOAP对象。
class EcoAPI {
static private $client;
static public function getClient() {
if (empty(self::$client)) {
echo "<br>initializing...";
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_GetVatAccount(array('accountHandle' => (object) array('Number' => (string) $VatAccount)));
当然,我建议不要使用静态对象和方法,这会导致紧耦合。在我看来,最好的方法是根据需要注入实例化的对象。