我只是想在PHP中创建我的第一个基于SOAP / WSDL的Web服务。我决定使用PEAR的Services_Webservice包。这就是我为了执行某些测试而编码的(文件ws.php):
<?php
ini_set("include_path", '/home/maciek/php:' . ini_get("include_path") );
ini_set("soap.wsdl_cache_enabled", "0");
require_once 'Services/Webservice.php';
class Box
{
/**
* @var int
*/
public $length = 1;
/**
* @var int
*/
public $width = 2;
/**
* @var int
*/
public $height = 3;
}
class NamedBox extends Box
{
/**
* @var string
*/
public $name = "ABC";
}
$Boxes[1] = new Box();
$Boxes[2] = new Box();
class ws extends Services_Webservice
{
/**
* Some data
*/
private $someData = array (
'A' => array('B', 'C'),
'X' => array('Y', 'Z')
);
/**
* Getting some data
* @param string
* @return string[]
*/
public function getsomeData($key)
{
$result = array();
if (isset($this->someData[$key]))
{
$result = $this->someData[$key];
}
return $result;
}
/**
* Getting Boxes
* @return Box[]
*/
public function getBoxes()
{
return $Boxes;
}
/**
* Getting NamedBox
* @return NamedBox
*/
public function getNamedBox()
{
return new NamedBox();
}
}
$options = array('uri' => 'ws', 'encoding' => SOAP_ENCODED);
$service = new ws('ws', 'description', $options);
$service->handle();
?>
我要做的下一件事是获取WSDL文件。根据PEAR的文档,我需要在文件的URL中添加?wsdl字符串。问题很奇怪 - 我的服务只工作一次!在第一次服务调用之后一切正常,我在浏览器中看到了WSDL文件。但是接下来(在网页浏览器中刷新页面,甚至在其他网络浏览器中)调用失败...我收到两条错误消息:
1) 警告:strpos()[function.strpos]:偏移量未包含在第518行的/home/maciek/php/Services/Webservice.php中的字符串中
2) 致命错误:/home/maciek/php/Services/Webservice.php:542中未捕获的异常'ReflectionException',消息'类不存在'堆栈跟踪:#0 /home/maciek/php/Services/Webservice.php(542 ):ReflectionClass-&gt; __ construct('')#1 /home/maciek/php/Services/Webservice.php(420):Services_Webservice-&gt; classMethodsIntoStruct()#2 /home/maciek/php/Services/Webservice.php (212):Services_Webservice-&gt; intoStruct()#3 /home/maciek/public_html/noticeboard/boxes/ws.php(82):Services_Webservice-&gt; handle()#main {main}抛出/ home / maciek /第542行的php / Services / Webservice.php
试图找到我注意到的第二个问题的目的是什么,在PEAR的代码(Webservice.php文件)中,一个空字符串被放到ReflectionClass的构造函数中(但不是在第一个服务调用中!)。
我真的不知道为什么会这样。我试图把一些回应指令打印出有用的消息,但我没有找到解决方案。最奇怪的是,在第一次成功通话后的几个小时内,我的服务再次开始工作 - 而且只有一次通话。此外,在localhost我没有问题......你能帮助我吗?
有用的数据: Apache 2.2.17, PHP 5.2.12, PEAR Services_Webservice 0.5.1(代码约542行以下):
for ($i = 0; $i < count($params); ++$i) {
$_class = $params[$i]->getClass();
$_type = ($_class) ? $_class->getName() : $param[1][$i];
$_cleanType = str_replace('[]', '', $_type, $_length);
$_typens = str_repeat('ArrayOf', $_length);
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['name'] =
$params[$i]->getName();
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['wsdltype'] =
$_typens . $_cleanType;
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['type'] =
$_cleanType;
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['length'] =
$_length;
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['array'] =
($_length > 0 && in_array($_cleanType, $this->simpleTypes))
? true : false;
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['class'] =
(!in_array($_cleanType, $this->simpleTypes) && new ReflectionClass($_cleanType))
? true : false; //THAT WAS 542 line
$this->wsdlStruct[$this->classname]['method'][$method->getName()]['var'][$i]['param'] = true;
}
那是518行
$docComments_Description = trim(substr($_docComments_Description, strpos($_docComments_Description, '*') + 1, strpos($_docComments_Description, '*', 1) - 1));
答案 0 :(得分:0)
请在梨包网站上打开错误报告。