PEAR SOAP + PHP 5.3

Ho installato PEAR SOAP per utilizzare delle API di un prodotto server via web service... Sarebbe la prima volta che faccio qualcosa del genere, ma l'ho fatto in altri contesti e non sarebbero cose dell'altro mondo.

Sul mio pc di sviluppo ho al momento l'ultimo easyphp con PHP 5.3 e utilizzo Eclipse PDT.

Lancio lo script che al momento importa il package delle API e provo a connettermi al server via web service - premetto che in Java la connessione funziona e il package API php non è altro la conversione del package Java rilasciato dalla community che gestisce il prodotto server.

Il problema non è del prodotto e del relativo package API (almeno al momento), bensì della mia configurazione locale di PHP con il PEAR SOAP.

Appena lancio lo script e controllo i risultati, la console mi dà una serie di warning che qui riporto:

Deprecated: Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 736

Strict Standards: Non-static method PEAR::getStaticProperty() should not be called statically, assuming $this from incompatible context in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 724

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\SOAP\WSDL.php on line 214

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\SOAP\WSDL.php on line 791

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\SOAP\WSDL.php on line 1159

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\SOAP\WSDL.php on line 1685

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 412

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 736

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 749

PHP Deprecated:  Assigning the return value of new by reference is deprecated in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 794

PHP Strict Standards:  Redefining already defined constructor for class Net_URL in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\Net\URL.php on line 124

PHP Strict Standards:  Non-static method PEAR::getStaticProperty() should not be called statically, assuming $this from incompatible context in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 724

PHP Strict Standards:  Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 739

PHP Strict Standards:  Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 741

PHP Strict Standards:  Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\Programmi\EasyPHP-5.3.3.1\php\PEAR\HTTP\Request.php on line 771

In che modo posso risolvere?

Io avevo pensato ad installare una versione più vecchia di PHP ma, a prescindere da easyPHP, volevo capire come posso installare diverse versioni di PHP e farle lavorare insieme, in base al progetto che sto tentando di far girare. Non mi serve che tutte siano configurate con Apache - la console mi è più che sufficiente - anche se la cosa è interessante.

Oppure cos'altro potrei fare? Vorrei evitare di smantellare il pc che ho al momento :D anche perché devo solamente testare, sviluppare qualche prototipo e scrivere due righe in proposito...

Grazie.

inviato 5 anni fa
larchitetto
X 0 X

Il problema è che molte classi PEAR non sono più aggiornate e quindi generano alcuni errori su versioni recenti di php. La soluziono non può essere un downgrade di php, ma casomai l'adattamento delle classi PEAR.

Puoi farlo anche da solo, si tratta di aggiungere qualche dichiarazione static alle funzioni statiche, eventualmente cambiare i nomi dei costruttori in __construct ed eliminare eventuali passaggi per riferimento.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Anche se ho a disposizione il sorgente, la modifica dello stesso è l'ultima soluzione che adotto che non si sa mai riesca a correggere qualcosa e a romperne un'altra...

Il downgrade forse è possibile alla 5.2 poiché la maggior parte degli host che uso utilizzano questa versione, finché non passeranno alla 5.3. Ma non so se è compatibile con la 5.2 o serva un ulteriore downgrade.

Tuttavia se mi dici che è lecito modificare questo sorgente, allora provo e vedo un po' che ne esce.

Se dovesse funzionare, potrei avvisare chi di dovere di quest'aggiornamento così da renderlo disponibile per tutti?

risposto 5 anni fa
larchitetto
X 0 X

Tuttavia se mi dici che è lecito modificare questo sorgente, allora provo e vedo un po' che ne esce.

Se dovesse funzionare, potrei avvisare chi di dovere di quest'aggiornamento così da renderlo disponibile per tutti?

In realta, se io fossi in te, cercherei una libreria aggiornata e mi terrei PEAR come ultima spiaggia.

Temo purtroppo che gran parte degli sviluppatori di PEAR siano migrati verso lidi migliori.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Mi puoi suggerire i "lidi" migliori?  :D

risposto 5 anni fa
larchitetto
X 0 X

Zend_Soap?

http://framework.zend.com/manual/en/zend.soap.html

Garak avrà sicuramente anche qualcosa d'altro da suggerire :)

risposto 5 anni fa
Mario Santagiuliana
X 0 X

C'è anche questa libreria:

http://sourceforge.net/projects/nusoap/

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

Grazie, le provo una ad una e vi dirò :P

risposto 5 anni fa
larchitetto
X 0 X

Riapro il topic poiché ho qualche altro problema e quindi necessito di qualche consiglio.

Con prodotto, intendo il software server che espone i web service; per maggiori informazioni sul prodotto, cliccare qui.

Il pacchetto php che dovrei utilizzare non è altro che la versione PHP di un jar java costantemente aggiornato. Chi lo ha creato, ha convertito le classi java in php.

La prima domanda che farei è la seguente: esiste qualche tool che mi permetta di convertire le classi java in php5.x?

Il pacchetto php è composto quindi da due blocchi logici:

  • il primo, fornisce un modello ad oggetti, ad esempio UserWS definisce un utente,
  • il secondo, fornisce gli strumenti utili per poter effettuare le chiamate via web service al prodotto invocando dei metodi sul modello stesso, ad esempio
    createUser(new UserWS())
    .

Secondo l'autore, i requirements sono: PHP 5.0+ e PHP 5 Soap extension (http://www.php.net/soap), sebbene abbia riscontrato un mucchio di errori e avvisi Deprecated.

Alla luce di quanto scritto, per utilizzare una nuova libreria web service, dovrei aggiornare il secondo blocco. Il problema è che non so ancora come fare - ho qualche idea però.

L'applicazione client utilizza una classe Factory il cui compito è di creare un'istanza della classe WSDLAPI.

Tale classe esegue dal costruttore la connessione via SOAP così:

<?php
      public function WSDLAPI( $url, $username, $password ) {

              $this->url      = $url;
              $this->username = $username;
              $this->password = $password;

             try {
                 // Establish a connection to the jbilling WSDL provider.
                $authParams        = array( 'user' =>  $username, 'pass' => $password );
                $this->wsdl        = new SOAP_WSDL( $url, $authParams );
                $this->soapClient  = $this->wsdl->getProxy();

                if( !$this->soapClient )
                    throw new JbillingAPIException( "An error occurred attempting to retrieve WSDL from JBilling API server." );
                
                if( $this->soapClient instanceof SOAP_Fault )
                    throw new JbillingAPIException( $this->soapClient->message );
             }
             catch( Exception $e ) {

                    throw new JbillingAPIException( 
"An error occurred attempting to instantiate the JBilling WSDL connection. " . $e->getMessage() );
             }
      }
?>

Ha una serie di attributi molto significativi:

<?php
      var $url;
      var $username;
      var $password;
      var $wsdl;
      var $soapClient;
?>

Questa classe inoltre implementa un'interfaccia che definisce le firme dei metodi che manipoleranno il modello OOP (primo blocco) ed esegue le relative chiamate ai web service per rendere effettive le modifiche.

Presumo si debba aggiornare la classe WSDLAPI, importando gli script della nuova libreria da utilizzare ed eseguire di conseguenza le modifiche necessarie...

Un esempio di un'ipotetica applicazione client che utilizza i web service esposti dal prodotto:

<?php
try {
  $api = jBillingAPIFactory::getAPI("http://localhost:8080/cxf/soap.service?wsdl", "operatoreWS", "123qwe");
  $api->createUser(new UserWS());
} catch(Exception $e) {
  var_dump($e);
}
?>

Se volete copio & incollo per intero gli script citati; ho omesso di farlo adesso per non creare un post eccessivamente lungo e mi son limitato a postare solamente quelle che ho ritenuto essere le parti salienti.

Infine, un'ultima domanda. Premettendo che non sono molto efferato in materia di web service soprattutto in php, se io ho installato l'estensione PHP per SOAP (http://www.php.net/soap), perché dovrei anche installare PEAR SOAP o chi per lei??

Se qualcosa di quanto scritto risultasse poco chiaro, basta chiedere.

Grazie.

risposto 5 anni fa
larchitetto
modificato 5 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda