public function __construct($url, $username, $password, $timeout = 3600, $response_timeout = 3600)
 {
     $this->username = $username;
     $this->password = $password;
     $this->url = $url;
     $this->result_object = new ResultObject();
     // Caching the WSDL
     $cache = new nusoap_wsdlcache('.', 300);
     $wsdl = $cache->get($url);
     if (is_null($wsdl)) {
         $wsdl = new wsdl($url, '', '', '', '', 5);
         $cache->put($wsdl);
     }
     $this->client = new nusoap_client($wsdl, $this->service_type, false, false, false, false, $timeout, $response_timeout, '');
     if (!is_null($username) && !is_null($password)) {
         $this->client->setHeaders($this->getRequestHeader($this->username, $this->password));
     }
     $err = $this->client->getError();
     if ($err) {
         echo '<h2>Constructor error</h2> <pre>' . $err . '</pre>';
     }
 }
 protected function getClient()
 {
     if (!isset($this->client) || !$this->client) {
         nusoap_base::setGlobalDebugLevel(0);
         $wsdl_path = $this->getWSDLLocation();
         $cache = new nusoap_wsdlcache('/tmp', 86400);
         $wsdl = $cache->get($url);
         if (is_null($wsdl)) {
             $wsdl = new wsdl($wsdl_path, '', '', '', '', 5);
             $cache->put($wsdl);
         }
         $client = new nusoap_client($wsdl, 'wsdl');
         //$client = new nusoap_client($wsdl_path, true);
         $client->decode_utf8 = false;
         //$client->setDebugLevel(9);
         //$client->clearDebug();
         if ($client->getError()) {
             throw new Exception("Initialising soap client failed, invalid wsdl?");
         }
         $this->client = $client;
     }
     return $this->client;
 }
 /**
  * Internal utility methods
  */
 private function call($service, $method, $params)
 {
     ini_set('memory_limit', '1024M');
     ini_set('max_execution_time', 1800);
     set_time_limit(0);
     $url = $this->wsdl_root . $service . '.asmx?wsdl';
     $timeout = 3000;
     $cache = new nusoap_wsdlcache($this->cache_dir, $timeout);
     $wsdl = $cache->get($url);
     // Set the WSDL
     if (is_null($wsdl)) {
         $wsdl = new wsdl($url, NULL, NULL, NULL, NULL, 0, $timeout, NULL, TRUE);
         $error = $wsdl->getError();
         $debug = $wsdl->getDebug();
         $wsdl->clearDebug();
         // Check for SOAP errors
         if (!empty($error)) {
             $this->errors[] = $error;
             if ($debug) {
                 $this->errors[] = '<pre>' . print_r($debug, TRUE) . '</pre>';
             }
             return FALSE;
         }
         $cache->put($wsdl);
     }
     // Send the SOAP request
     $params['securityPassword'] = $this->wsdl_keys[$service];
     $client = new nusoap_client($wsdl, 'wsdl', FALSE, FALSE, FALSE, FALSE, 0, $timeout);
     $client->setDebugLevel(0);
     // 0 - 9, where 0 is off
     $client->useHTTPPersistentConnection();
     if ($service == 'DataAccess' && $method == 'ExecuteStoredProcedure') {
         /*
          * See http://www.codingforums.com/archive/index.php/t-85260.html
          * and http://users.skynet.be/pascalbotte/rcx-ws-doc/nusoapadvanced.htm
          * for how to thwart the "got wsdl error: phpType is struct, but value is not an array"
          * error returned by nusoap when processing the response from $client->call()
          *
          * */
         $request = $client->serializeEnvelope(vsprintf('<ExecuteStoredProcedure xmlns="http://ibridge.isgsolutions.com/%s/">
                   <securityPassword>%s</securityPassword>
                   <name>%s</name>
                   <parameters>%s</parameters>
                   </ExecuteStoredProcedure>', array($service, $params['securityPassword'], $params['name'], $params['parameters'])));
         $response = $client->send($request, 'http://ibridge.isgsolutions.com/' . $service . '/' . $method, 0, $timeout);
     } else {
         $response = $client->call($method, $params);
     }
     $error = $client->getError();
     $debug = $client->getDebug();
     $client->clearDebug();
     // Check for SOAP errors
     if (!empty($error)) {
         $this->errors[] = $error;
         if ($debug) {
             $this->errors[] = '<pre>' . print_r($debug, TRUE) . '</pre>';
         }
         return FALSE;
     }
     // Process response
     $response = $response[$method . 'Result'];
     $data = NULL;
     if (strpos($response, '<') == 0) {
         // Some ISGweb methods return strings instead of XML
         libxml_use_internal_errors(TRUE);
         $response = preg_replace('/(<\\?xml[^?]+?)utf-16/i', '$1utf-8', $response);
         // Change encoding string to UTF8
         $response = utf8_encode($response);
         $response = $this->strip_invalid_xml($response);
         $obj = simplexml_load_string($response);
         $data = $response;
         $error = libxml_get_errors();
         // Check for XML parsing errors
         if (!empty($error)) {
             foreach ($error as $e) {
                 $this->errors[] = $e;
             }
             libxml_clear_errors();
             return FALSE;
         }
         $data = $this->object_to_array($obj);
         // Check for ISGweb errors (e.g. invalid data input, failure of service, etc.)
         if (array_key_exists('Errors', $data)) {
             $error = $data['Errors'];
             foreach ($error as $e) {
                 $this->errors[] = $e['@attributes']['Description'];
             }
             return FALSE;
         }
     } else {
         $data = $response;
     }
     return $data;
 }