Ima Jedi
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($envelo pe);
$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($s body);
$root = $doc->create_element('Proc essLead');
$root = $sbody->append_child($root );
$root->set_attribute('xmln s','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($fiel dname);
$child = $outer->append_child($chil d);
$child->set_attribute('xml ns', '');
$value = $doc->create_text_node($fi eldvalue);
$value = $child->append_child($valu e);
} // 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,4 43,&$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,$re sponse_bod y) = explode("\r\n\r\n",$respon se,2);
$response_header_lines = explode("\r\n",$response_h eaders);
//first line of headers is the HTTP response code
$http_response_line = array_shift($response_head er_lines);
if (preg_match('@^HTTP/[0-9]\ .[0-9] ([0-9]{3})@',$http_respons e_line,$ma tches))
{
$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[$he ader] = $value;
}
return array($response_code,$resp onse_heade r_array,$r esponse_bo dy);
}
/* This function is used for HTTPS posts. */
function pc_post_request($host,$url
{
$timeout = 2;
// create a new XML document
$doc = domxml_new_doc('1.0');
$envelope = $doc->create_element('soap
$envelope = $doc->append_child($envelo
$envelope->set_attribute('
$envelope->set_attribute('
$envelope->set_attribute('
$sbody = $doc->create_element('soap
$sbody = $envelope->append_child($s
$root = $doc->create_element('Proc
$root = $sbody->append_child($root
$root->set_attribute('xmln
$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($fiel
$child = $outer->append_child($chil
$child->set_attribute('xml
$value = $doc->create_text_node($fi
$value = $child->append_child($valu
} // 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,4
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,$re
$response_header_lines = explode("\r\n",$response_h
//first line of headers is the HTTP response code
$http_response_line = array_shift($response_head
if (preg_match('@^HTTP/[0-9]\
{
$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[$he
}
return array($response_code,$resp
}
ASKER
I get '-0.146131' for $timeYouCanNotInfulence. What does that mean?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you very much hernst42. That is a great tip and I'll definitely use it to figure out where the problem is.
ASKER
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.
$start = microtime(true);
$sh = fsockopen("ssl://".$host,4
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