Link to home
Start Free TrialLog in
Avatar of Ima Jedi
Ima JediFlag for United States of America

asked on

help make SOAP-encapsulated Web Service https post faster

I use the following code to post form information to a client's server.  It works, but it is extremely slow and I'm afraid that we may be losing customers because of how long they have to wait before the form submits.  I would really appreciate it if any of you wonderful experts could take a look and tell me if there is anything that I could change to make it faster.  Thanks.

/* This function is used for HTTPS posts. */
function pc_post_request($host,$url,$content='')
{
      $timeout = 2;

      // create a new XML document
      $doc = domxml_new_doc('1.0');

      $envelope = $doc->create_element('soap:Envelope');
      $envelope = $doc->append_child($envelope);
      $envelope->set_attribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
      $envelope->set_attribute('xmlns:xsd','http://www.w3.org/2001/XMLSchema');
      $envelope->set_attribute('xmlns:soap','http://schemas.xmlsoap.org/soap/envelope/');

      $sbody = $doc->create_element('soap:Body');
      $sbody = $envelope->append_child($sbody);

      $root = $doc->create_element('ProcessLead');
      $root = $sbody->append_child($root);
      $root->set_attribute('xmlns','http://url that I can not post here');

      $outer = $doc->create_element('lead');
      $outer = $root->append_child($outer);

      // add a child node for each parent field
      foreach ($content as $fieldname => $fieldvalue)
      {
        $child = $doc->create_element($fieldname);
        $child = $outer->append_child($child);
        $child->set_attribute('xmlns', '');
        $value = $doc->create_text_node($fieldvalue);
        $value = $child->append_child($value);
      } // foreach
      // get completed xml document
      $xml_string = $doc->dump_mem(true);
      
      $content_length = strlen($xml_string);
      $request_body = "POST $url HTTP/1.1\r\n" .
      "Host:" . $host ."\r\n" .
      "Content-type:" . " text/xml; charset=utf-8\r\n" .
      "Content-length:" . $content_length . "\r\n" .
      "SOAPAction:" . "\"http://url that I can not post here\"" . "\r\n\r\n" .

      $xml_string;

      $sh = fsockopen("ssl://".$host,443,&$errno,&$errstr,$timeout)
            or die("Can't open socket to $host: $errno $errstr");

      fputs($sh,$request_body);
      $response = '';
      while(! feof($sh))
      {
            $response .= fread($sh,16384);
      }
      fclose($sh) or die("Can't close socket handle: $php_errormsg");

      list($response_headers,$response_body) = explode("\r\n\r\n",$response,2);
      $response_header_lines = explode("\r\n",$response_headers);

      //first line of headers is the HTTP response code
      $http_response_line = array_shift($response_header_lines);
      if (preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line,$matches))
      {
            $response_code = $matches[1];
      }

      //put the rest of the headers in an array
      $response_header_array = array();
      foreach ($response_header_lines as $header_line)
      {
            list($header,$value) = explode(': ',$header_line,2);
            $response_header_array[$header] = $value;
      }
      return array($response_code,$response_header_array,$response_body);
}
Avatar of hernst42
hernst42
Flag of Germany image

Code seems ok. I gues the server you are contacting is the slow part. att timing  around the reading of the server-request:

$start = microtime(true);
      $sh = fsockopen("ssl://".$host,443,&$errno,&$errstr,$timeout)
            or die("Can't open socket to $host: $errno $errstr");

      fputs($sh,$request_body);
      $response = '';
      while(! feof($sh))
      {
            $response .= fread($sh,16384);
      }
      fclose($sh) or die("Can't close socket handle: $php_errormsg");
$timeYouCanNotInfulence = microtime(true)-$start;

Which values do you get for $timeYouCanNotInfulence when running your script
Avatar of Ima Jedi

ASKER

I get '-0.146131' for $timeYouCanNotInfulence.  What does that mean?
ASKER CERTIFIED SOLUTION
Avatar of hernst42
hernst42
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thank you very much hernst42.  That is a great tip and I'll definitely use it to figure out where the problem is.
In case anyone needs this answer...it turns out that our server doesn't like to do calculations with the call to microtime() or time() used as one of the values (a setting maybe?).  So the number I was getting back by using $timeYouCanNotInfulence = microtime(true)-$start; was incorrect.  I changed it so that I was storing the start time and the end time in two separate variables (I used time() instead of microtime()).  Then I subtracted the start time from the end time and learned that it was actually taking 132 seconds to connect to the client's server and send the information.  So...in the end I learned that there is nothing I can do to speed it up except to ask our client to have their IT team look into it.