Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHP: SOAP関数 - Manual
[go: Go Back, main page]

PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net

search for in the

is_soap_fault" width="11" height="7"/> <snmpwalkoid
Last updated: Wed, 01 Nov 2006
view this page in

CXLVI. SOAP関数

導入

SOAP拡張モジュールは、 SOAPサーバーおよびクライアントを書くために使用することができます。 本拡張モジュールは、SOAP 1.1SOAP 1.2 および WSDL 1.1 規約のサブセットをサポートします。

要件

本拡張モジュールは、 GNOME xml library を必要とします。 このライブラリをダウンロード/インストールしてください。 libxml-2.5.4 以上が必要です。

インストール手順

本拡張モジュールは、 --enable-soapを指定して PHPのconfigureが行われた場合のみ利用可能です。

実行時設定

php.ini の設定により動作が変化します。

表 1. SOAP 設定オプション

名前デフォルト変更の可否変更履歴
soap.wsdl_cache_enabled"1"PHP_INI_ALLPHP 5.0.0 から利用可能
soap.wsdl_cache_dir"/tmp"PHP_INI_ALLPHP 5.0.0 から利用可能
soap.wsdl_cache_ttl"86400"PHP_INI_ALLPHP 5.0.0 から利用可能
PHP_INI_* 定数の詳細および定義については 付録G を参照してください。

以下に設定ディレクティブに関する 簡単な説明を示します。

soap.wsdl_cache_enabled boolean

WSDLキャッシュ機能有効または無効にします。

soap.wsdl_cache_dir string

SOAP 拡張モジュールがキャッシュファイルを置くディレクトリの名前を 設定します。

soap.wsdl_cache_ttl int

キャッシュされたファイルが元のファイルの代わりに使用される秒数 (有効期間)を設定します。

定義済みクラス

SoapClient

コンストラクタ

メソッド

SoapFault

コンストラクタ

SoapHeader

SoapHeader は、SOAP ヘッダを渡すもしくは返すための特別な低レベルクラスです。 このクラスは単純なデータホルダーで、 コンストラクタ以外の特別なメソッドを持ちません。このクラスは SOAP ヘッダを渡すための SoapClient->__soapCall() 中、もしくは SOAP レスポンスにおけるヘッダを返すための SOAP ヘッダハンドラ中で使用されます。

コンストラクタ

SoapParam

SoapParam は、非 WSDL モードにおけるパラメータの名前付け、 もしくは値を返すための特別な低レベルクラスです。 このクラスは単純なデータホルダーで、 コンストラクタ以外の特別なメソッドを持ちません。

コンストラクタ

SoapServer

コンストラクタ

メソッド

SoapVar

SoapVar は、非 WSDL モードにおけるパラメータのエンコード、 もしくは値を返すための特別な低レベルクラスです。 このクラスは単純なデータホルダーで、 コンストラクタ以外の特別なメソッドを持ちません。 このクラスは SOAP リクエストもしくはレスポンスにおける型プロパティを 設定したい場合に有効です。

コンストラクタ

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

SOAP_1_1 (integer)

SOAP_1_2 (integer)

SOAP_PERSISTENCE_SESSION (integer)

SOAP_PERSISTENCE_REQUEST (integer)

SOAP_FUNCTIONS_ALL (integer)

SOAP_ENCODED (integer)

SOAP_LITERAL (integer)

SOAP_RPC (integer)

SOAP_DOCUMENT (integer)

SOAP_ACTOR_NEXT (integer)

SOAP_ACTOR_NONE (integer)

SOAP_ACTOR_UNLIMATERECEIVER (integer)

SOAP_COMPRESSION_ACCEPT (integer)

SOAP_COMPRESSION_GZIP (integer)

SOAP_COMPRESSION_DEFLATE (integer)

UNKNOWN_TYPE (integer)

XSD_STRING (integer)

XSD_BOOLEAN (integer)

XSD_DECIMAL (integer)

XSD_FLOAT (integer)

XSD_DOUBLE (integer)

XSD_DURATION (integer)

XSD_DATETIME (integer)

XSD_TIME (integer)

XSD_DATE (integer)

XSD_GYEARMONTH (integer)

XSD_GYEAR (integer)

XSD_GMONTHDAY (integer)

XSD_GDAY (integer)

XSD_GMONTH (integer)

XSD_HEXBINARY (integer)

XSD_BASE64BINARY (integer)

XSD_ANYURI (integer)

XSD_ANYXML (integer)

PHP 5.1.0 で追加されました。

XSD_QNAME (integer)

XSD_NOTATION (integer)

XSD_NORMALIZEDSTRING (integer)

XSD_TOKEN (integer)

XSD_LANGUAGE (integer)

XSD_NMTOKEN (integer)

XSD_NAME (integer)

XSD_NCNAME (integer)

XSD_ID (integer)

XSD_IDREF (integer)

XSD_IDREFS (integer)

XSD_ENTITY (integer)

XSD_ENTITIES (integer)

XSD_INTEGER (integer)

XSD_NONPOSITIVEINTEGER (integer)

XSD_NEGATIVEINTEGER (integer)

XSD_LONG (integer)

XSD_INT (integer)

XSD_SHORT (integer)

XSD_BYTE (integer)

XSD_NONNEGATIVEINTEGER (integer)

XSD_UNSIGNEDLONG (integer)

XSD_UNSIGNEDINT (integer)

XSD_UNSIGNEDSHORT (integer)

XSD_UNSIGNEDBYTE (integer)

XSD_POSITIVEINTEGER (integer)

XSD_NMTOKENS (integer)

XSD_ANYTYPE (integer)

SOAP_ENC_OBJECT (integer)

SOAP_ENC_ARRAY (integer)

XSD_1999_TIMEINSTANT (integer)

XSD_NAMESPACE (string)

XSD_1999_NAMESPACE (string)

目次
is_soap_fault --  SOAP コールが失敗したかどうかを調べる
SoapClient->__call() --  SOAP 関数をコールする (推奨されません)
SoapClient->__construct() --  SoapClient コンストラクタ
SoapClient->__doRequest() --  SOAP リクエストを実行する
SoapClient->__getFunctions() --  SOAP 関数の一覧を返す
SoapClient->__getLastRequest() --  直近の SOAP リクエストを返す
SoapClient->__getLastRequestHeaders() --  直近の SOAP リクエストヘッダを返す
SoapClient->__getLastResponse() --  直近の SOAP レスポンスを返す
SoapClient->__getLastResponseHeaders() --  直近の SOAP レスポンスヘッダを返す
SoapClient->__getTypes() --  SOAP 型の一覧を返す
SoapClient->__setCookie() --  SOAP リクエストと共に送信されるクッキーを設定する
SoapClient->__soapCall() --  SOAP 関数をコールする
SoapFault->__construct() --  SoapFault コンストラクタ
SoapHeader->__construct() --  SoapHeader コンストラクタ
SoapParam->__construct() --  SoapParam コンストラクタ
SoapServer->addFunction() --  SOAP リクエストによって処理される単一もしくはいくつかの関数を追加する
SoapServer->__construct() --  SoapServer コンストラクタ
SoapServer->fault() -- エラーを示す SoapServer フォールト を発行する
SoapServer->getFunctions() --  定義されている関数の一覧を返す
SoapServer->handle() --  SOAP リクエストを処理する
SoapServer->setClass() --  SOAP リクエストを処理するクラスを設定する
SoapServer->setPersistence() --  SoapServer の持続モードを設定する
SoapVar->__construct() --  SoapVar コンストラクタ
use_soap_error_handler --  SOAP エラーハンドラを使用して前の値を返すかどうかを設定する


add a note add a note User Contributed Notes
SOAP関数
brephophagist
19-Jan-2007 02:45
For those working from a wsdl full of complex types that just want a class structure to hang your code on and not worry about typing in long parameter lists (or creating a script to do so): wsdl2php is a wonderful time-saver. Gets a structure going so you can go in and add what validation and special data munging you need: http://www.urdalen.no/wsdl2php/

Big up yourself, Knut.
Olaf Krische
22-Nov-2006 06:48
If you use SSL with a cert and password authentication:

$wsdl = "https://ws.ecopatz.de/ProductInfo?wsdl";
$pass = 'a password';
$certFile = "./mycert.pem";

  $client = new SoapClient($wsdl,
   array(
     'local_cert' => $certFile,
     'passphrase' => $pass
   )
  );

If you have problems with the certfile like this:

  Warning: SoapClient::__construct(): Unable to set local cert chain file `./mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in productinfo.php on line 27

then the certFile is probably in the "wrong format" (the wrong format for php maybe). It worked for me, when i appended the content of the private key file and the certificate file to a single file "mycert.pem":

  cat mycert.key >mycert.pem # mycert.key was the private key
  cat mycert.crt >>mycert.pem # mycert.crt was the signed certificate

Thanks to an author somewhere, who pointed to "curl --cert", where this little "so unimportant" dependency has been mentioned.
Gerôme <kontakt at bmservices dot de>
17-Nov-2006 01:27
When compiling SOAP support for PHP 5.2.0 it was not sufficient to use "--with-soap" in the "./configure" statement. I also had to include "--enable-soap" to get it work.
nico
25-Aug-2006 10:20
If you want to build a Soap Server for Microsoft Office's client (like Microsoft Office Research Service) you need to rewrite SOAP's namespaces :

<?php
// (...)

$server = new SoapServer($wsdl, array('uri' => $uri, 'classmap' => $classmap));
$server->setClass($class);
function
callback($buffer)
{
  
$s = array('<ns1:RegistrationResponse>', 'ns1:', 'xmlns:ns1="urn:Microsoft.Search"');
  
$r = array('<RegistrationResponse xmlns="urn:Microsoft.Search">', '', '');
   return (
str_replace($s, $r, $buffer));
}
ob_start('callback');
$server->handle();
ob_end_flush();

// (...)
?>

There are a complete example at this URL : http://touv.ouvaton.org/article.php3?id_article=104
info at webability dot info
23-Aug-2006 04:30
If you want to use soap over https, you *must* compile php with the configure option with-openssl or you will have the error "[HTTP] SSL support not available in this build" while trying to use the web services over SSL
mini at freebsd dot org
09-Jul-2006 08:54
wokan at cox dot net is incorrect about the security of URI-passed values to HTTPS URIs.  HTTPS connections are HTTP inside SSL -- all of the HTTP traffic, including the request, are encrypted.
lists at 5etdemi dot com
14-Mar-2006 11:26
To enable SoapClient on Windows, simply add a line:

extension=php_soap.dll

in php.ini in the extensions section.
adm
02-Mar-2006 04:27
Wondering why the function you just added to your WSDL file is not available to your SOAP client? Turn off WSDL caching, which (as the documentation says) is on by default.

At the top of your script, use:

$ini = ini_set("soap.wsdl_cache_enabled","0");
Matthew Glubb
21-Jan-2006 01:05
For anyone wondering why they are getting a "DTD are not supported by SOAP" fault string. It is because you are probably being returned an HTML page due to an internal server error, 404, etc.

Refer to the documentation for SoapClient->__getLastResponse in order to see what returned by the server.
ckl at ecw dot de
17-Jan-2006 04:54
To debug a SOAP service using SoapServer(), a WSDL file and Zend Studio Client/Server, you have to append ?start_debug=1&amp;debug_port=10000 to the service location:
--- snip ---
... method / service definition ....

<service name="SOAPService">
  <port
   name="SOAPServicePort"
   binding="typens:SOAPServiceBinding">
   <soap:address
   location="$URL?start_debug=1&amp;debug_port=10000"/>
  </port>
</service>
--- snap ---
Rui Martins
19-Dec-2005 01:33
Here's an example on how to pass ArrayOfAnyType arguments
containing complex types.

Suppose your WSDL file defines "http://any.url.com/" as the default namespace and a complex type "SomeComplexType".

If you want to call a WebServices which takes an ArrayOfAnyType argument of "SomeComplexType"s you need to perform the following:

<?php
// complexTypes being an array containing several instances of SomeComplexType

myWSParameter = array();
foreach (
complexTypes as ct)
{
  
// Don't misspell the type or the namespace. Also note that php won't assume the default namespace defined in the WSDL file.
  
myWSParameter []= new SoapVar(ct, 0, "SomeComplexType", "http://any.url.com/");
}
?>

On the other hand, when a WebService returns an ArrayOfAnyType you have to do the following to access each of its elements.

<?php
// Here, we will be echoing each return item
$res = $someWS->myFunction($myArgs)

// If only one element is returned, an array won't be built
if (is_array(myFunctionResult->anyType))
{
   foreach (
myFunctionResult->anyType as $soapVar)
   {
     echo
$soapVar->enc_value;
   }
}
else
{
   echo
myFunctionResult->anyType->enc_value;
}
?>

This has all been tested using a .NET WebService.
ChrisB
24-Oct-2005 03:03
Heads up for anyone using PHP Soap + Sessions + PEAR DB classes.

Every time you make a call, via the soap client to your web service, your PEAR DB session is put to sleep and it doesnt by default wake upon the next request.

To fix this I simply called my particular database close call ifx_close() below my $soap->handle();
Bob
12-Oct-2005 05:17
If you are scratching your head why NuSOAP not working on PHP 5.x , the reason is this built-in SOAP Extenstion uses same soapclient() class name as Nusoap.

replace 'soapclient' with 'soapclient_xxx'  in nusoap.php and you are good to go...
john
30-Sep-2005 01:32
Those having to work with Paypal's api and using PHP5 SOAP:

http://www.johnjawed.com/ppo/
johnjawed at gmail dot com
23-Sep-2005 01:29
For those wondering on how to set attributes on nodes with PHP5 SOAP, it would be done as such:

<... soap env/header>
<foo bar="blah">12345</foo>

array("foo" => array("_" => 12345, "bar" => "blah"));
Darryl
21-Jul-2005 03:46
Having trouble passing complex types over SOAP using a PHP SoapServer in WSDL mode?  Not getting decoded properly?  This may be the solution you're looking for!

When using ComplexType in the schema portion of the WSDL file, You need use an additional step to tell PHP SOAP how to encode the objects.  The first method would be to explicitely encapsulate the object in a SoapVar object - telling PHP to use generalized SOAP encoding rules (which encodes all ComplexTypes as Structs).  This won't work, though, if the client is expecting the objects to be encoded according to the WSDL's schema.  So, The actual way to do this is:

* First, define a specific PHP class which is actually just a data structure holding the various properties, and the appropriate  ComplexType in the WSDL.

<?php
 
class MyComplexDataType {
    
public $myProperty1;
    
public $myProperty2;
 }
?>
<complexType name="MyWSDLStructure">
 <sequence>
   <element name="MyProperty1" type="xsd:integer"/>
   <element name="MyProperty2" type="xsd:string"/>
 </sequence>
 </complexType>

* Next, Tell the SoapServer when you initialize it to map these two structures together.

<?php
 $classmap
= array('MyWSDLStructure' => 'MyComplexDataType');
 
$server = new SoapServer("http://MyServer/MyService.wsdl", array('classmap' => $classmap))
?>

* Finally, have your method return an instance of your class directly, and let the SoapServer take care of encoding!

<?php
 public
function MySoapCall() {
    
$o = new MyComplexDataType();
 
    
$o->myProperty1 = 1;
    
$o->myProperty2 = "MyString";
 
     return
$o
 
}
?>
Jim Plush
13-Jul-2005 08:45
If you're trying to use the SOAP Extension over SSL with a custom PEM file you need to do this:

$client->_local_cert = "C:\\path\myCert.pem";
pash_ka
18-May-2005 04:52
One good tutorial on using this extension is on IBM web site:
"Using the PHP 5 SOAP extension to consume a WebSphere Web service"
http://www.ibm.com /developerworks/library/os-phpws/?ca=dgr-lnxw06PHP5soap
flobee at gmail dot com
12-May-2005 05:25
wow, actually a cool program and soap is new for me.
I found out some interessting things i can not debug because the scripts exit without any error messages or notes. :-(

you may have problems with the memory and/or especially on "shared servers" when server load is high.
sometimes the script does the job, sometimes it just stopping at any unknown point.
these are the steps my script does:
* get data from remote server ( ~ 4.5 MB)
* parsing requested object and store the data in a database.

the return with debug messages was intressting:
-> check Mem limit: 30M
-> $client = new new SoapClient($url_wsdl, $options);
-> Memory usage: 185888
-> $client->[requested_method_to_get_data]();
-> check: __getLastResponseHeaders() - after:
-> HTTP/1.1 200 OK // remote server is fine with me :-)
-> Content-Length: 4586742  // I got the data
-> check: Memory usage now: 23098872 // ups !!! this can't be true!!

so, and if now someone on the server takes the rest of RAM  the walk thought the data breaks :-(

so, i need to store the xml tree ($client->client->__last_response) and parsing it by the classical way. (if you would request more RAM, you may get in trouble with the admin if you run a script like this more often! (on shared servers)
OrionI
19-Apr-2005 12:12
If you're having problems calling a .NET web service, see the comments over on http://php.net/soap_soapclient_soapcall (the __soapCall method).
kucerar at hhmi dot org
26-Mar-2005 05:04
Here are 73 test cases that detail the kinds of schemas that PHP5 currently supports and the structures you are expected to plug into them for the return value from your services.  Much better than trying to guess!

http://cvs.php.net/co.php/pecl/soap/tests/schema

You can cycle through the listings by changing the main index in the URL below,  rather than go in and out of the pages

http://cvs.php.net/co.php/pecl/soap/tests/schema/schema052.phpt?r=1.2

I downloaded the whole thing with this,  CVS might work too.
http://www.httrack.com/

With them all downloaded I just browse them with Textpad.
Norman Clarke <norman at dontblink dot com>
22-Feb-2005 09:29
Note that if you should need to set the timeout for your soap request,  you can use ini_set to change the value for the default_socket_timeout. I previously used NuSOAP, whose soap client class has a timeout option, and it took me a while to figure out that PHP's soap uses the same socket options as everything else.
wokan at cox dot net
06-Feb-2005 10:06
It's not good security practice to pass the username and password in the URI when the point of SSL is to prevent that information from being intercepted.  Putting that information in the URI makes it interceptable.  HTTPS-Posted values are safe because values passed in the headers are sent after the SSL handshake has been completed.
martin AT kouba DOT at
26-Jan-2005 02:11
this is something i wrote to access a webservice with php4

http://kouba.at/projects/soap/
04-Dec-2004 12:06
here i found a good collection of tutorials all around soap/web services and/or rss:
http://www.dynamic-webpages.de/05.tutorials.php?kategorie=39
mikx at mikx dot de
30-Mar-2004 01:12
It took me a while to properly establish a password protected client connection via https on windows/apache1.3. Here my little guide:

1. The SOAP extension isn't activated by default (PHP5 RC1). Just add "extension=php_soap.dll" to the php.ini and don't forget to set the extension_dir properly (in most cases "c:\php\ext").

2. Add "extension=php_openssl.dll" to the php.ini. This module depends on libeay32.dll and ssleay32.dll - copy them from your php folder to your system32 folder.

3. Restart apache

4. The sourcecode

$client = new SoapClient("https://yourLogin:yourPassword@foo.com/bar.wsdl", array(
   "login"      => "yourLogin",
   "password"  => "yourPassword",
   "trace"      => 1,
   "exceptions" => 0));

$client->yourFunction();

print "<pre>\n";
print "Request: \n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response: \n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";

Currently it seems to be necessary to add your login and password both in the uri and in the options array. Not sure if this is the expected behavior.

is_soap_fault" width="11" height="7"/> <snmpwalkoid
Last updated: Wed, 01 Nov 2006
 
 
show source | credits | sitemap | contact | advertising | mirror sites