问题
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
回答1:
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);
回答2:
Put this code above any Soap call:
libxml_disable_entity_loader(false);
回答3:
On register_client.php make sure that the URL that has been passed to SoapClient is accessible from the machine you're executing the code.
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
If 127.0.0.0 does not work you can try using some network IP address and see.
Let me know if it still does not fix it for you, I did try with your example and changing path (making it proper in my dev. environment) has fixed same error for me.
I would be interested to know if it does not fix it for you.
回答4:
try this. works for me
$options = array(
'cache_wsdl' => 0,
'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
))
$client = new SoapClient(url, $options);
回答5:
I had the same problem.
This php setting solved my problem:
allow_url_fopen -> 1
回答6:
Got a similar response with https WSDL URL using php soapClient
SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from ...
After server has been updated from PHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23 something went wrong for my client machine osx 10.12.6 / PHP 5.6.30, but MS Web Services Clients connections could be made without issues.
Apache2's server_access.log showed no entry when i tried to load WSDL so i added 'cache_wsdl' => WSDL_CACHE_NONE
to prevent client-side wsdl caching, but still got no entries. Finally i tried to load wsdl per CURL -i
checked HEADERS but all seemed to be ok..
Only libxml_get_last_error()
provided some insight > SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
So I added some ssl options to my call:
$contextOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
));
$sslContext = stream_context_create($contextOptions);
$params = array(
'trace' => 1,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'stream_context' => $sslContext
);
try {
$proxy = new SoapClient( $wsdl_url, $params );
} catch (SoapFault $proxy) {
var_dump(libxml_get_last_error());
var_dump($proxy);
}
In my case 'allow_self_signed' => true
did the trick!
回答7:
I am using selinux and with the following shell command (as root) I was able to allow PHP to make SOAP calls:
sudo setsebool -P httpd_can_network_connect on
回答8:
If anyone has the same problem, one possible solution is to set the bindto
stream context configuration parameter (assuming you're connecting from 11.22.33.44 to 55.66.77.88):
$context = [
'socket' => [
'bindto' => '55.66.77.88'
]
];
$options = [
'soapVersion' => SOAP_1_1,
'stream_context' => stream_context_create($context)
];
$client = new Client('11.22.33.44', $options);
回答9:
Just had a similar problem trying to use SoapClient. Everything was working fine but in production, sometimes on page refresh, I would get the "SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from .." error.
I was using the params:
new \SoapClient($WSDL, array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true, "exception" => 0));
Removing all the params worked for me:
new \SoapClient($WSDL);
回答10:
The problem may lie in you don't have enabled openssl extention in your php.ini file
go to your php.ini file end remove ;
in line where extension=openssl
is
Of course in question code there is a part of code responsible for checking whether extension is loaded or not but maybe some uncautious forget about it
来源:https://stackoverflow.com/questions/12875409/soap-php-fault-parsing-wsdl-failed-to-load-external-entity