Depuis lundi matin maintenant, j’essaie de mettre en place un simple Hello World! en Flex/PHP et je galère….
Je pense pourtant avoir suivi à la lettre la documentation du Zend Framework mais impossible de parvenir à faire fonctionner mon application.
Voici la source des mes fichiers :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php /** * server.php * Ce fichier est le point de chute du serveur AMF */ // Inclusion du serveur require_once 'Zend/Amf/Server.php'; // Inclusion d'une classe qui intéragira avec le serveur AMF require_once 'services/Test_Amf.php'; // Instanciation du serveur $server = new Zend_Amf_Server(); // Assignation de l'objet Test_Amf au serveur $server->setClass('Test_Amf'); // Affiche toutes les erreurs $server->setProduction(false); echo $server->handle(); ?> |
Maintenant ma class Test_Amf.php :
1 2 3 4 5 6 7 8 9 10 11 | <?php class Test_Amf { public $foo = "bar"; /** * @return string */ public function helloWorld() { return 'Hello World!'; } ?> |
Mon fichier test_amf.mxml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> <mx:RemoteObject id="myservice" fault="faultHandler(event)" source="Test_Amf" showBusyCursor="true" destination="zend"> <mx:method name="helloWorld" result="resultHandler(event)"/> </mx:RemoteObject> <mx:Script> <![CDATA[ import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.utils.ObjectUtil; import mx.controls.Text; import mx.controls.Alert; public function resultHandler(e:ResultEvent):void { Alert.show(e.result.message, 'Succeed'); } public function faultHandler(e:FaultEvent):void { Alert.show(e.fault.message, 'Error'); } private function loadPictures():void { var child:Text = new Text; child.text = ObjectUtil.toString(myservice.helloWorld()); content.removeAllChildren(); content.addChild(child); } ]]> </mx:Script> <mx:Panel id="main" width="100%" height="100%" title="Test Zend_Amf" paddingBottom="20" paddingLeft="20" paddingRight="20" paddingTop="20"> <mx:Button id="btn_loader" label="Charger les images" click="loadPictures()"/> <mx:Canvas id="content" width="100%" height="100%"/> </mx:Panel> </mx:Application> |
Et enfin mon fichier services-config.xml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="zend-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="zend"> <channels> <channel ref="zend-endpoint"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="zend-endpoint" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://192.168.40.128/server.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config> |
Alors lorsque je clique sur mon bouton, j’ai cette alerte :
faultCode:Client.Error.MessageSend faultString:'Send failed' faultDetail:'Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: 'http://192.168.40.128/server.php'
Et le contenu de mon object RPC :
(mx.rpc::AsyncToken)#0
message = (mx.messaging.messages::RemotingMessage)#1
body = (Array)#2
clientId = (null)
destination = ""
headers = (Object)#3
messageId = "E630A048-73CA-7EB7-9217-828A2F2032F0"
operation = "helloWorld"
source = "Test_Amf"
timestamp = 0
timeToLive = 0
responders = (null)
result = (null)En regardant dans Firebug, j’ai bien un échange avec la page server.php mais on dirait que Flex ne parvient pas à récupérer le packet.
Une idée pour me sauver la vie ?
Edit, je rajoute les données récupérées par Firebug, onglet en-têtes :
// Réponse
Date Thu, 28 May 2009 15:09:13 GMT
Server Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By PHP/5.2.6-2ubuntu4.2
Vary Accept-Encoding
Content-Encoding gzip
Content-Length 265
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type text/html// Requête
Host 192.168.40.128
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3
.5.30729)
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Onglet post :
Referer: http://192.168.40.128/flex/bin-debug/test_amf.swf Content-type: application/x-amf Content-length: 244 �����null�/1���à ��� Mflex.messaging.messages.CommandMessageoperationcorrelationId bodyclientIdheaderstimeToLivetimestamp destinationmessageId %DSMessagingVersion DSIdnil��I96F86D2F-2C9C-4F39-B323-87C3C907BBE0
Onglet réponse :
�����/1/onResult��ÿÿÿÿ Uflex.messaging.messages.AcknowledgeMessagecorrelationIdclientIddestinationmessageIdtimestamp timeToLiveheaders bodyI96F86D2F-2C9C-4F39-B323-87C3C907BBE0I79DB8585-0AE9-D8C8-D301-000018F60FFB I234D70D2-A3C4-1829-F202-000079C849EC124352335400�

Bonjour a tu essayer avec ca ?
$server = new Zend_Amf_Server();
Salut Benjamin,
Oui, il y est mais c’est juste que j’ai dû le virer sans faire exprès lors de la rédaction avec plein d’autres lignes de test qui étaient au milieu. Biensur qu’il y est puisque quand j’accède à server.php via mon navigateur, j’ai bien le « Zend Amf Endpoint »
Merci quand même xD !
Bonjour
as tu résolu ton pb ? si oui quel était le souci ?
merci
Après de nombreux tests, j’en ai conclu que cela dépendait pas mal des différentes versions du module Zend_Amf. Après peut-être que mes tests n’étaient pas assez rigoureusement méthodiques.
Je n’ai pas essayé avec les toutes dernières versions mais la version 1.7.7 et 1.8.3 (il me semble) ont l’air de bien fonctionner.
j’ai fait un test analogue avec la version 1.9.4, y a pas de souci ça fonctionne.
sinon pourquoi ne pas remplacer
child.text = ObjectUtil.toString(myservice.helloWorld());
par
child.text = myservice.helloWorld();
Ok, merci pour l’information.
La méthode ObjectUtils.toString() est un équivalent à var_dump() en PHP
J’ai eu le même problème, j’ai la version 1.9.6 du ZEND FRAMEWORK et j’isoler une bog liée la la version de l’environnement PHP. En version php 5.3, tout va bien, mais en version 5.2.XX, j’ai le même problème.