Zend XMLRPC сервис для выполнения / вызова класса - PullRequest
1 голос
/ 22 декабря 2010

У меня есть класс, который запускает процесс сам по себе

Псевдокласс

class MyClass {
  private $x;
  private $y

  // filename is INI file, each project have its own INI file
  public function __construct($filename) {
    // read and set value from INI file
    // set some default values here as well
  }

  /**
   * Start Process
   *
   * @param 
   * @return
   */
  public function startProcess() {
    // run process here
    $y = $this->getX(); // and so on
    echo "Process Started: ".$y."\n";
  }
  // This is the change for the XMLRPC
  /*
  public function startProcess($value) {
    // run process here
    echo "Process Started: ".$value."\n";
  }
  */

  /**
   * Set X
   *
   * @param $x
   * @return
   */
  private function setX($x) {
    $this->x = $x;
  }

  /**
   * Get X
   *
   * @param 
   * @return $x
   */
  private function getX() {
    return $this->x;
  }

  // and so on
}

Чтобы выполнить класс, я бы сделал что-то вроде этого

include('MyClass.php');

$process = new MyClass('file.ini');
$process->setX('blah');
$process->startProcess();

Теперь я хочу, чтобы это было инициализировано вызовом XMLRPC, где я просто передал бы ему переменную в вызове метода. Я следовал этому учебнику , но я не уверен, что смогу, вот что я пытаюсь. Теперь вместо установки X перед раздачей я просто передам ее функции startProcess

Сервер XMLRPC:

ini_set("include_path", "/usr/share/php/libzend-framework-php");
require_once('Zend/XmlRpc/Server.php');

/**
 * Start Process Wrapper
 * 
 * @param 
 * @return 
 */
function startProcessWrapper($value) {
    include('MyClass.php'); // I have change the startProcess() to take a variable

    $process = new MyClass('file.ini');
    $process->startProcess('passing x here');
}

$server = new Zend_XmlRpc_Server();
$server->addFunction('startProcessWrapper', 'webservice');
echo $server->handle();

Клиент XMLRPC:

ini_set("include_path", "/usr/share/php/libzend-framework-php");
require_once('Zend/XmlRpc/Client.php');

$server = new Zend_XmlRpc_Client('http://localhost/xmlrpc_server.php');
$client = $server->getProxy(); 

$request = array(
  array(
    'methodName' => 'system.listMethods', 
    'params'     => array() 
  ), 
  array( 
    'methodName' => 'system.methodHelp', 
    'params'     => array('webservice.startProcess') 
  ),  
  array( 
    'methodName' => 'webservice.startProcess', 
    'params'     => array('123456') 
  ));

  $response = $client->system->multicall($request); 
  echo print_r($response,true);

Вот ответ, который я получаю:

Array
(
    [0] => Array
        (
            [0] => system.listMethods
            [1] => system.methodHelp
            [2] => system.methodSignature
            [3] => system.multicall
            [4] => webservice.startProcess
        )

    [1] => Start Process Wrapper
    [2] => Array
        (
            [faultCode] => 623
            [faultString] => Calling parameters do not match signature
        )

)

Почему это не работает? Просто пытаетесь найти способ для XMLRPC запустить мой учебный процесс, предложения?

1 Ответ

2 голосов
/ 22 декабря 2010

Хорошо, поэтому после большой отладки моего кода я обнаружил, что мое объявление docblock было неправильным.

Для каждой общедоступной функции в классе вам необходимо иметь докблок, который определяет параметры и возвращает типы данных.

Пример того, что у меня было:

  /**
   * Set X
   *
   * @param $x
   * @return
   */
  public function setX($x) {
    $this->x = $x;
  }

Пример того, что должно быть:

  /**
   * Set X, you can give more description here for help functionality
   *
   * @param string
   * @return
   */
  public function setX($x) {
    $this->x = $x;
  }

Надеюсь, это кому-нибудь поможет

...