RE: [SOAP] soap problems revisited
| From: | Tristan Ludowyk | Date: | Thu, 28 Aug 2003 09:02:20 +0000 |
| Subject: | RE: [SOAP] soap problems revisited | ||
| References: | 1 | Groups: | php.soap |
| Request: | Send a blank email to php-soap+get-1006@lists.php.net to get a copy of this message | ||
My server has both display_errors and log_errors set to on, but the
problem only manifests itself when the error parse error occurs within a
method invoked through SOAP. If I try the same code but invoke the
method in the SOAP object directly and navigate to the page in a
browser, the correct error is reported.
I can get the errors to appear if I remove the '@' operator on the
call_user_func() parts of SOAP_Server::callMethod():
function &callMethod($methodname, &$args) {
[snip]
if ($args) {
// call method with parameters
if (isset($this->soapobject) &&
is_object($this->soapobject)) {
$ret = call_user_func_array(array(&$this->soapobject,
$methodname),$args);
} else {
$ret = call_user_func_array($methodname,$args);
}
} else {
// call method w/ no parameters
if (is_object($this->soapobject)) {
$ret = call_user_func(array(&$this->soapobject,
$methodname));
} else {
$ret = call_user_func($methodname);
}
}
What are the implications of not suppressing errors here? Obviously
these 'parser' errors originate from call_user_func rather than from the
code inside the actual function (as a run-time error would) and so get
suppressed by the '@'. The SOAP_ServerErrorHandler still does not pick
up the error, but at least it gets spat out as html and I can debug my
code.
Tristan.
> -----Original Message-----
> From: LIMBOURG Arnaud [mailto:arnaud.limbourg.prestataire@cegetel.fr]
> Sent: Thursday, 28 August 2003 5:12 PM
> To: soap@lists.php.net
> Subject: RE: [SOAP] soap problems revisited
>
>
> Ah, i got it.
>
> SOAP_Client -> asks server
>
> SOAP_Server has a parse error and crashes. If display_errors
> is set to on on the server you should see the message.
>
> I tried it, having display_errors set to on on the server,
> SOAP is not installed on the server and i get
>
> Notice: Undefined variable: options in
> C:\TEMP\test_soap_client.php on line 14
>
> Call Stack:
> 0.0000 0 1. {main}() C:\TEMP\test_soap_client.php:0
> Failed: <br />
> <b>Warning</b>: main(SOAP/Server.php) [<a
>
> href='http://www.php.net/function.main'>function.main</a>]:
>
> failed to create
> stream: No such file or direct
> ory in <b>C:\websites\caladan\web\test_soap.php</b> on line
> <b>2</b><br /> <br /> <b>Fatal error</b>: main() [<a
>
> href='http://www.php.net/function.main'>function.main</a>]:
>
> Failed opening required 'SOAP/Server.php' (include_path='.
> ;c:\php\pear;xxx') in <b>C:\xxxtest_soap.php</b> on line
> <b>2</b><br />
>
> I had similar problems doing XML_RPC calls, always ending up
> in a conf problem.
>
> hth,
>
> Arnaud.
>
> > Actually, no only for the server. The following server
> > script will halt
> > without any output or php error. The client receives no
> > response data,
> > when the expected error would be something like:
> >
> > Fatal error: Cannot instantiate non-existent class: b in
> > .../public_html/server.php on line 12
> >
> > Try:
> >
> > ****** [server.php]
> >
> > <?php
> > require_once 'SOAP/Server.php';
> >
> > error_reporting(E_ALL);
> >
> > class A
> > {
> > function methodA(){ return 0; }
> > }
> >
> > class SOAP_Example_Server {
> > function echoString($inputString)
> > {
> > // Script will die without error here
> > $a = new B;
> >
> > // // Calling a non-existant method on a valid object also
> > // // causes the script to die without an error
> > // $a = new A;
> > // $a->methodA();
> >
> > return $inputString;
> > }
> > }
> >
> > $server =& new SOAP_Server;
> > $soapclass =& new SOAP_Example_Server();
> > $server->addObjectMap($soapclass,'urn:SOAP_Example_Server');
> >
> > $server->service($HTTP_RAW_POST_DATA);
> > ?>
> >
> > ****** [client.php]
> >
> > <?php
> > include("SOAP/Client.php");
> >
> > $soapclient =& new
> > SOAP_Client("http://localhost/server.php");
> >
> > // this namespace is the same as declared in server.php $options =
> > array('namespace' => 'urn:SOAP_Example_Server',
> > 'trace' => 1);
> >
> >
> > $ret = $soapclient->call("echoString",
> > $params = array("inputString"=>
> > "this is a test"),
> > $options);
> >
> > if (PEAR::isError($ret))
> > {
> > echo "Failed: " . $ret->getMessage();
> > echo "\n" . $soapclient->__get_wire();
> > }
> > else
> > {
> > echo $ret;
> > }
> > ?>
> >
> >
> > > -----Original Message-----
> > > From: Arnaud Limbourg [mailto:arnaud.limbourg@club-internet.fr]
> > > Sent: Thursday, 28 August 2003 3:26 PM
> > > To: soap@lists.php.net
> > > Subject: Re: [SOAP] soap problems revisited
> > >
> > >
> > > You mean,
> > >
> > > $client = new SOAP_Client;
> > >
> > > require_once 'SOAP/CLient.php';
> > >
> > > ?
> > >
> > > php soap_cli.php
> > >
> > > Fatal error: Cannot instantiate non-existent class:
> soap_client in
> > > soap_cli.php on line 3
> > >
> > > With the code above. Please check your php.ini display_errors
> > > setting and/or error_reporting (php.ini too)
> > >
> > > Arnaud.
> > >
> >
> > --
> > PHP Soap Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
>