Anni fa era pratica comune far comunicare Flash ed i nostri script lato server utilizzando dei normali file di testo generati dinamicamente che venivano caricati tramite l'istruzione loadVars
ed interpretati dalle nostre applicazioni. Da quel periodo è fortunatamente passato molto tempo e gli sviluppatori di Flash hanno integrato all'interno delle librerie un set di funzionalità che permettono la comunicazione con un server attraverso una serie di protocolli binari molto veloci e potenti. Tra i protocolli implementati troviamo l'RMTP che, tra le altre cose, permette lo scambio di oggetti e le chiamate a metodi remoti utilizzando un formato di dati proprietario chiamato Action Message Format (AMF).
L'idea alla base è sicuramente corretta; purtroppo però il protocollo ed il formato dei messaggi è chiuso e si può interfacciare solamente con soluzioni proprietarie fornite da Adobe che normalmente si basano su Java, Coldfusion oppure Server Side Actionscript. Fortunatamente il mondo dell'open source ha pensato bene di lavorare in modo da permettere anche agli sviluppatori che normalmente utilizzano altri linguaggi di poter sfruttare questo interessante sistema e tra i vari progetti è nato AMFPHP. Come ben possiamo comprendere dal nome, AMFPHP è una libreria per PHP che permette lo scambio di messaggi AMF con qualunque sistema utilizzi questo formato di dati per lo scambio di informazioni (quindi Flash, Flex ed Apollo).
AMFPHP è nato con l'obiettivo di fornire una libreria il più trasparente possibile, che faciliti la comunicazione con gli SWF senza la necessità di doversi appoggiare a strutture dato particolari che si occupino della serializzazione; ogni tipo di dato PHP viene automaticamente rimappato nel corrispettivo ActionScript, rendendo così la comunicazione molto semplice e pulita. La libreria implementa anche una serie di funzionalità che permettono di elaborare automaticamente i risultati di selezioni effettuate su un database fornendo automaticamente implementazioni che facilitino la paginazione dei risultati. In aggiunta alla libreria, lo sviluppatore ha creato anche un browser che ci permette di navigare all'interno dei servizi implementati e di interrogarli manualmente in modo da poter controllare il corretto funzionamento senza dover obbligatoriamente passare per test case scritti in ActionScript.
Attualmente lo sviluppo della libreria è in un periodo un po' turbolento: lo sviluppatore principale, dopo aver iniziato lo sviluppo della versione 1.9 aggiungendo una vasta gamma di caratteristiche interessanti (come un browser molto potente scritto in Flex, ed il supporto per AMFEXT, un'estensione nativa per PHP che velocizza moltissimo la codifica e la decodifica dei messaggi) ha deciso di abbandonare il progetto, che probabilmente passerà ad un nuovo sviluppatore e verrà spostato su OSFlash.
Installazione e configurazione
Per questa serie di articoli ho deciso di adottare la versione 1.9 di AMFPHP, che è possibile recuperare direttamente dal blog dell'autore. In aggiunta è consigliabile recuperare i sorgenti o i file compilati dell'estensione AMFEXT che può essere utilizzata internamente da AMFPHP per rendere molto più veloce la codifica e la decodifica dei messaggi AMF. L'estensione può essere recuperata sempre sul Web.
Per evitare che i file scompaiano di nuovo abbiamo incluso le versioni citate aggiornate alla data di pubblicazione di questo articolo, assieme al XXX, nel file zip che potete scaricare dal link download in alto nella pagina.
Per procedere con l'installazione dobbiamo per prima cosa istruire PHP in modo che carichi correttamente AMFEXT. AMFEXT è una normalissima estensione per PHP, che va installata seguendo la procedura standard: su Windows possiamo scaricare la DLL precompilata e posizionarla nella cartella in cui sono contenute le nostre estensioni, mentre in Linux è necessario seguire le istruzioni di compilazione che è possibile trovare nel file INSTALL
allegato con i sorgenti. Se l'estensione è stata compilata come dinamica, è anche necessario modificare il file php.ini in modo da assicurarsi che sia correttamente caricata all'avvio del server apache, aggiungendo la seguente direttiva al file:
extension=php_amf.dll // Windows extension=php_amf.so // Linux, Shared Object
Dopo aver eventualmente compilato, installato e configurato l'estensione è necessario riavviare il webserver affinché tutte le modifiche risultino attivate correttamente.
Ora possiamo procedere con l'installazione di AMFPHP; come precedentemente specificato AMFPHP è un set di file PHP (corredato da qualche file di supporto per il browser e per la documentazione) e quindi l'installazione per effettuare i test può essere fatta semplicemente decomprimendo i sorgenti in una cartella accessibile dai nostri script di test.
Se invece si desidera installare AMFPHP in un ambiente di produzione, è consigliabile decomprimere il file all'interno di una locazione accessibile attraverso l'include_path
, rimuovere o spostare la sottocartella browser in un luogo più appropriato (che potrebbe essere una cartella protetta del proprio sito) ed infine spostare la cartella services in un luogo pubblico che risulti accessibile e facilmente modificabile da chi di dovere. Una volta installati i file è necessario procedere con la configurazione.
La configurazione di AMFPHP è un processo molto semplice e prevede fondamentalmente la modifica di due file: globals.php e gateway.php.
Nel primo caso possiamo agire sul file aggiungendo tutte le variabili globali ed i file che desideriamo risultino accessibili da tutti i servizi implementati; nel secondo caso invece possiamo occuparci di modificare manualmente alcune opzioni interessanti per poter ottimizzare ed adattare il comportamento della libreria. Tra queste opzioni risulta sicuramente interessante quella che permette di mappare i set di caratteri in modo che vengano correttamente gestiti da AMFPHP: in base alle esigenze è possibile utilizzare diversi sistemi di codifica/decodifica agendo sulla chiamata al metodo setCharsetHandler:
$gateway->setCharsetHandler( "utf8_decode", "UTF-8", "UTF-8" );
Nella riga precedente per esempio abbiamo istruito AMFPHP in modo che utilizzi le funzioni integrate di codifica/decodifica UTF8, specificando come charset dei sorgenti e come charset di destinazione UTF8. Le opzioni di configurazione sono comunque ben documentate all'interno del file sorgente.
Primo utilizzo
Come primo esempio di utilizzo possiamo prendere in considerazione la stesura di un servizio che si occupa di eseguire delle operazioni su una coppia di operandi, e di restituire il risultato. Questo servizio verrà utilizzato da una semplicissima calcolatrice sviluppata in Flex per eseguire le operazioni.
Un servizio in AMFPHP non è altro che una classe PHP che espone una serie di metodi pubblici utilizzabili attraverso il gateway. Sarà la libreria stessa ad occuparsi della codifica/decodifica dei messaggi basandosi sulle opzioni di configurazione e sulla Reflection API fornita da PHP. Il nostro servizio sarà quindi semplicissimo e formato da un unico metodo:
<?php class Calculator { public function execute_operation($operation, $a, $b) { switch($operation) { case '+': return $a + $b; case '-': return $a - $b; case '*': return $a * $b; case '/': return $a / $b; } return 0; } } ?>
Ora quello che ci rimane è implementare la calcolatrice in Flex. Il progetto di Flex Builder che ho realizzato è presente nel file allegato; anche se questa non è la sede per discutere di Flex, è importante ricordare alcuni passi fondamentali che permettono di utilizzare gli oggetti remoti attraverso il protocollo AMF:
Per prima cosa è necessario definire un file (che normalmente viene chiamato service-config.xml) che contenga la definizione dei servizi che utilizzeremo nella nostra applicazione; questo file va posizionato nella root del progetto e bisogna ricordarsi di aggiungere alle direttive di compilazione (che potete modificare nelle proprietà del progetto): -services "services-config.xml"
Il file XML che utilizzeremo è il seguente (modificate in modo opportuno l'URL al gateway AMFPHP):
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="amfphp"> <channels> <channel ref="calculator"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="calculator" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://localhost/articoli/html.it/amfphp/09052007/amfphp/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
In secondo luogo è necessari utilizzare il RemoteObject
all'interno del nostro file MXML come segue:
<mx:RemoteObject showBusyCursor="true" destination="amfphp" fault="onFault(event)" source="it.html.Calculator" id="ro"> <mx:method name="execute_operation" result="onResult(event)"/> </mx:RemoteObject>
Ricordandosi di definire in modo opportuno gli handler per gli eventi, come effettuato all'interno del file MXML che trovate allegato all'articolo dal link Download in alto nella pagina. Compilando ed eseguendo il progetto potremo utilizzare la calcolatrice basata su AMFPHP.
Conclusioni
Abbiamo terminato una veloce introduzione ad AMFPHP; più avanti scenderemo in dettaglio con altre funzionalità più interessanti, come la gestione dei recordset e la paginazione automatica che aggiungeranno a tutte le nostre applicazioni funzionalità molto interessanti con il minimo sforzo.