Solved

help make SOAP-encapsulated Web Service https post faster

Posted on 2007-03-28
5
292 Views
Last Modified: 2013-12-25
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);
}
0
Comment
Question by:Ima Jedi
  • 3
  • 2
5 Comments
 
LVL 48

Expert Comment

by:hernst42
ID: 18808854
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
0
 

Author Comment

by:Ima Jedi
ID: 18809213
I get '-0.146131' for $timeYouCanNotInfulence.  What does that mean?
0
 
LVL 48

Accepted Solution

by:
hernst42 earned 500 total points
ID: 18809684
It means it took 0.14 Seconds to connect and process your request on the foreing server. Fast enough i would say. Its negative because I substracted the end from the start-time. Should be vice versa
$timeYouCanNotInfulence = $start - microtime(true);
to ge a positive value.

So I guess there must be another bottle neck. Maybe you can add such time measure points to the part before and after the connection to get a better view where the bottleneck in your code is.
0
 

Author Comment

by:Ima Jedi
ID: 18810349
Thank you very much hernst42.  That is a great tip and I'll definitely use it to figure out where the problem is.
0
 

Author Comment

by:Ima Jedi
ID: 18811235
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.
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
XML response optional elements 12 37
mysql update statement 3 22
tutorial for ebay api 3 32
Display images from mysql blob type (Not working) 9 26
Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
Learn the basics of strings in Python: declaration, operations, indices, and slicing. Strings are declared with quotations; for example: s = "string": Strings are immutable.: Strings may be concatenated or multiplied using the addition and multiplic…
The viewer will learn how to dynamically set the form action using jQuery.

786 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question