web-dev-qa-db-ja.com

SOAP PHP WSDLの解析エラー:外部エンティティのロードに失敗しましたか?

PHP&SOAPを使用してWebサービスを実行しようとしていますが、これまでに取得できたのはこれだけです:

(SoapFault)[2]メッセージ: 'SOAP-ERROR:Parsing WSDL:Cand't load from' http://localhost/MyRegistration/login.xml ':外部エンティティの読み込みに失敗しました " http://localhost/MyRegistration/login.xml "

Localhostを127.0.0.1に変更しようとしましたが、違いはありません。 loginは実際にはwsdlファイルですが、login.wsdlをSOAPClientコンストラクターに入れると、代わりに「 'XMLドキュメントを取得していないようです」と表示されます。

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);
}
?> 

次に、login.wsdlファイルを示します。

<?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>

そして、これが関係しているかどうかはわかりませんので、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();
?>

不要な情報を提供している場合は申し訳ありませんが、これは完全に初心者です-誰かが正確にこのSOAP Faultが発生している理由を指摘できたら本当に感謝しています生成され、それを修正するために私ができること。

MySQL 5.5.24およびPHP 5.3.13でWAMPサーバーバージョン2.2を使用しています

17
user1743679

PHP 5.6.5に移行した後、soap 1.2は機能しなくなりました。オプションのSSLパラメーターを追加することで問題を解決しました。

私のエラー:

外部エンティティの読み込みに失敗しました

の解き方:

// 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);
27

このコードをSoap呼び出しの上に配置します。

libxml_disable_entity_loader(false);
7
Thanh Nguyen

Register_client.phpで、SoapClientに渡されたURLが、コードを実行しているマシンからアクセス可能であることを確認してください。

$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');    

127.0.0.0が機能しない場合は、いくつかのネットワークIPアドレスを使用してみてください。

それでも問題が解決しない場合は教えてください。例で試してみましたが、パスを変更する(開発環境で適切にする)と同じエラーが修正されました。

私はそれがあなたのためにそれを修正しないかどうか知りたいと思う。

3
deej

これを試して。私のために働く

$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);
3
gogagubi

同じ問題がありました。

このPHP設定は私の問題を解決しました:

allow_url_fopen -> 1
2
hazard16

Php soapClientを使用してhttps WSDL URLで同様の応答を取得しました

SoapFault例外:[WSDL] SOAPエラー:WSDLの解析:からロードできませんでした...

サーバーがPHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23からクライアントマシンosxに何か問題が発生しました。 10.12.6/PHP 5.6.30、ただし、MS Webサービスクライアントの接続は問題なく作成できます。

Apache2のserver_access.logにWSDLをロードしようとしたときにエントリが表示されなかったため、_'cache_wsdl' => WSDL_CACHE_NONE_を追加してクライアント側のwsdlキャッシュを防止しましたが、エントリはまだありません。最後に、_CURL -i_チェックされたHEADERSごとにwsdlをロードしようとしましたが、すべて問題ないようです。

libxml_get_last_error()のみがいくつかの洞察を提供しました> _SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed_

だから私は私の呼び出しにいくつかのSSLオプションを追加しました:

_$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);
}
_

私の場合、_'allow_self_signed' => true_がトリックをしました!

1
c3labs

誰かが同じ問題を抱えている場合、可能な解決策の1つは、bindtoストリームコンテキスト構成パラメーターを設定することです(11.22.33.44から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);
0
Shmarkus

問題は、php.iniファイルでopenssl拡張を有効にしていないことにある可能性があります。

php.iniファイルの最後に移動;行内extension=openssl

もちろん、問題のコードには、拡張機能がロードされているかどうかを確認するコードの一部がありますが、おそらくそれについていくつかの不注意なことを忘れています

0
Dawid D

私はselinuxを使用しており、次のシェルコマンド(ルートとして)を使用して、PHPがSOAP呼び出しを行うことを許可できました。

Sudo setsebool -P httpd_can_network_connect on
0
Samo

SoapClientを使用しようとして同様の問題が発生しました。すべてが正常に機能していましたが、本番環境では、ページの更新時に、「SoapFault例外:[WSDL] SOAP-ERROR:WSDLの解析:..からロードできませんでした」というエラーが表示されます。

私はパラメータを使用していました:

new \SoapClient($WSDL, array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true, "exception" => 0)); 

すべてのパラメータを削除すると私のために働いた:

new \SoapClient($WSDL); 
0
read