Проблема с созданием веб-сервиса (ошибка отражения) - PullRequest
1 голос
/ 20 марта 2011

Я просто пытаюсь создать свой первый веб-сервис на основе SOAP / WSDL в PHP. Я решил использовать пакет 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, мне нужно добавить строку? Wsdl в URL моего файла. Проблема очень странная - мой сервис работает только один раз! После первого вызова службы все работает нормально, и я получаю WSDL-файл, видимый в моем браузере. Но все последующие (после обновления страницы в веб-браузере и даже в другом веб-браузере) вызовы не выполняются ... Я получаю два сообщения об ошибке:

1) Предупреждение: strpos () [function.strpos]: смещение не содержится в строке в /home/maciek/php/Services/Webservice.php в строке 518

2) Неустранимая ошибка: необработанное исключение «ReflectionException» с сообщением «Класс не существует» в /home/maciek/php/Services/Webservice.php:542 трассировки стека: # 0 /home/maciek/php/Services/Webservice.php(542 ): ReflectionClass -> __ construct ('') # 1 /home/maciek/php/Services/Webservice.php(420): Services_Webservice-> classMethodsIntoStruct () # 2 /home/maciek/php/Services/Webservice.php(212 ): Services_Webservice-> intoStruct () # 3 /home/maciek/public_html/noticeboard/boxes/ws.php(82): Services_Webservice-> handle () # 4 {main}, брошенный в / home / maciek / php / Services / Webservice.php на линии 542

Пытаясь выяснить, какова цель 2-й проблемы, я заметил, что в коде 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));

1 Ответ

0 голосов
/ 06 апреля 2011

Пожалуйста, откройте отчет об ошибке на веб-сайте пакета груши.

...