SOAP PHP fault parsing WSDL: failed to load external entity?
php, soap, wamp, wsdl, xml
Solution
Security issue: This answer disables security features and should not be used in production!
After migrating to PHP 5.6.5, the soap 1.2 did not work anymore. So I solved the problem by adding optional SSL parameters.
My error:
failed to load external entity
How to solve:
// options for ssl in php 5.6.5
$opts = array(
'ssl' => array(
'ciphers' => 'RC4-SHA',
'verify_peer' => false,
'verify_peer_name' => false
)
);
// SOAP 1.2 client
$params = array(
'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => false,
'soap_version' => SOAP_1_2,
'trace' => 1,
'exceptions' => 1,
'connection_timeout' => 180,
'stream_context' => stream_context_create($opts)
);
$wsdlUrl = $url . '?WSDL';
$oSoapClient = new SoapClient($wsdlUrl, $params);
Problem
I'm trying to run a web service using PHP & SOAP, but all I'm getting so far is this: (SoapFault)[2] message which states: 'SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://localhost/MyRegistration/login.xml' : failed to load external entity "http://localhost/MyRegistration/login.xml" I've tried changing localhost to 127.0.0.1, but that makes no difference. login is actually a wsdl file, but if I put login.wsdl in the SOAPClient constructor, it says "'looks like we got no XML document'" instead. Here is my code for the SOAP Client (register_client.php): ``` <?php try { $sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl'); $param1 = $_POST["regname"]; $param2 = $_POST["regpass1"]; $response = $sClient->loginVerify($param1, $param2); var_dump($response); } catch(SoapFault $e) { var_dump($e); } ?> ``` And here is the login.wsdl file: ``` <?xml version="1.0"?> <definitions name="LoginVal" targetNamespace="urn:LoginVal" xmlns:tns="urn:LoginVal" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Login"> <xsd:element name="getName" type="xsd:string" /> <xsd:element name="getPass" type="xsd:string" /> <xsd:element name="LoginResponse" type="xsd:string" /> </xsd:schema> </types> <message name="loginVerify"> <part name="username" type="tns:getName" /> <part name="password" type="tns:getPass" /> </message> <message name="doLoginResponse"> <part name="return" type="tns:LoginResponse" /> </message> <portType name="LoginPort"> <operation name="loginVerify"> <input message="tns:loginVerify" /> <output message="tns:doLoginResponse" /> </operation> </portType> <binding name="LoginBinding" type="tns:LoginPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="loginVerify"> <soap:operation soapAction="urn:LoginAction" /> <input> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> <service name="LoginService"> <port name="LoginPort" binding="tns:LoginBinding"> <soap:address location="http://localhost/MyRegistration/register.php" /> </port> </service> </definitions> ``` And I'm not sure if this is involved, so I'm providing the code for the SOAP Server register.php: ``` <?php if(!extension_loaded("soap")) { dl("php_soap.dll"); } ini_set("soap.wsdl_cache_enabled", "0"); $server = new SoapServer("login.wsdl", array('uri'=>'http://127.0.0.1/MyRegistration')) public function loginVerify($username, $password) { if($_POST["regname"] && $_POST["regemail"] && $_POST["regpass1"] && $_POST["regpass2"] ) { if($_POST["regpass1"] == $_POST["regpass2"]) { $servername = "localhost"; $username = "root"; $password = "Hellfire"; $conn = mysql_connect($servername,$username,"Hellfire")or die(mysql_error()); mysql_select_db("soap",$conn); $sql = "insert into users (name,email,password)values('$_POST[regname]','$_POST[regemail]','$_POST[regpass1]')"; $result = mysql_query($sql,$conn) or die(mysql_error()); return "You have registered sucessfully"; //print "<a href='index.php'>go to login page</a>"; } else return "passwords dont match"; } else return "invalid data"; } $server->AddFunction("loginVerify"); $server->handle(); ?> ``` I'm sorry if I'm giving unnecessary information, but I'm a complete novice at this - and I'd really appreciate it if someone could point out why exactly this SOAP Fault is being generated, and what I can do to rectify it. I am using WAMP Server version 2.2, with mySQL 5.5.24 and PHP 5.3.13