SoapClient
在线手册:中文 英文
PHP手册

SoapClient::__call

(PHP 5 >= 5.0.1)

SoapClient::__callCalls a SOAP function (deprecated)

说明

public mixed SoapClient::__call ( string $function_name , string $arguments )

This method is deprecated. Use SoapClient::__soapCall instead of it.


SoapClient
在线手册:中文 英文
PHP手册
PHP手册 - N: Calls a SOAP function (deprecated)

用户评论:

KRavEN (17-Jun-2009 02:56)

extend of __call thats adds a retry to handle the occasional 'Could not connect to host' exceptions

<?php
class LocalSoapClient extends SoapClient
{

  public function
__call($function_name, $arguments)
  {
   
$result = false;
   
$max_retries = 5;
   
$retry_count = 0;
   
    while(!
$result && $retry_count < $max_retries)
    {
      try
      {
       
$result = parent::__call($function_name, $arguments);
      }
      catch(
SoapFault $fault)
      {
        if(
$fault->faultstring != 'Could not connect to host')
        {
          throw
$fault;
        }
      }
     
sleep(1);
     
$retry_count ++;
    }
    if(
$retry_count == $max_retries)
    {
      throw new
SoapFault('Could not connect to host after 5 attempts');
    }
    return
$result;
  }
}
?>

bananos at dev dot co dot ua (11-Apr-2008 01:13)

I'm writing PHP SOAP client (based on php_soap extension) which uses Google AdService,
today, I tried to create sample Ad using   AdService::addAds()  and discovered that my SOAP library does not pass
"headline", "description1", "description2"  parameters in SOAP request.

First, I thought that this was something wrong with my data, coz I was getting validation errors like
"One or more input elements failed validation."   Then I decided to take a look at WSDL description
https://adwords.google.com/api/adwords/v11/AdService?wsdl

And voilà !  I've found this:

<complexType name="Ad" abstract="true">
<sequence>
  <element name="adGroupId" type="xsd:int"/>
  <element name="adType" nillable="true" minOccurs="0" type="impl:AdType"/>
  <element name="destinationUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="disapproved" type="xsd:boolean"/>
  <element name="displayUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="exemptionRequest" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="id" type="xsd:long"/>
  <element name="status" nillable="true" minOccurs="0" type="impl:AdStatus"/>
</sequence>

</complexType>

There is no any ''description", "headline1", "headline2", however there is another complexType

<complexType name="TextAd">
    <complexContent>
    <extension base="impl:Ad">
    <sequence>

<element name="description1" nillable="true" type="xsd:string"/>
<element name="description2" nillable="true" type="xsd:string"/>
<element name="headline" nillable="true" type="xsd:string"/>
</sequence>

</extension>
</complexContent>
</complexType>

So, the thing is when you are working with php_soap be aware of complexType extensions which does not work in php_soap when you try to do things like:

<?php

$client
= new
   
SoapClient(
      
"https://adwords.google.com/api/adwords/v11/AdService?wsdl",
        array( 
'trace'      => true,
               
'exceptions' => true,
             )
     
    );

$entropy     = substr(md5(rand(0, time())), 0, 10);
//create Ad test structure
$sample_ad =  array(
              
"id" => 0,
              
"adGroupId" => 0,
              
"adType" => 'TextAd',
              
"disapproved" => false,
              
"destinationUrl" => 'http://test.com',
              
"displayUrl" => 'www.Test.com',
              
"status" => "Paused", //  Enabled / Disabled
              
"descr_iption1" => 'D1_'.$entropy,
              
"des_cription2" => 'D2_'.$entropy,
              
"head_line" => 'H_'.$entropy
       
);

$client->addAds(array('ads' => array($sample_ad) );
?>

Samil Abud (19-Dec-2007 08:00)

Hi,
This is a good example, for the SOAP function "__call".
However it is deprecated.

<?php
$wsdl
= "http://webservices.tekever.eu/ctt/?wsdl";
$int_zona = 5;
$int_peso = 1001;
$cliente = new SoapClient($wsdl);
print
"<p>Envio Internacional: ";
$vem = $cliente->__call('CustoEMSInternacional',array($int_zona, $int_peso));
print
$vem;
print
"</p>";
?>