Zend_Amf, je n’y arrive pas !

by Joris on mai 27, 2009

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�


9 comments

Bonjour a tu essayer avec ca ?

$server = new Zend_Amf_Server();

by Benjamin on 27/05/2009 at 19:56. #

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 !

by Joris on 27/05/2009 at 21:41. #

[...] passé toute la semaine dernière à essayer de comprendre pourquoi est-ce que mon application Flex ne communiquait pas avec mon serveur AMF fourni par le module Zend_Amf, je pense avoir mis le doigt [...]

by Série de tests du Zend_Amf sur plusieurs versions — blog.eexit.net, le blog de Joris on 03/06/2009 at 11:51. #

Bonjour
as tu résolu ton pb ? si oui quel était le souci ?
merci

by olivtt on 08/11/2009 at 10:38. #

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.

by Joris on 08/11/2009 at 15:13. #

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();

by olivtt on 08/11/2009 at 20:28. #

Ok, merci pour l’information.
La méthode ObjectUtils.toString() est un équivalent à var_dump() en PHP :)

by Joris on 08/11/2009 at 21:07. #

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.

by Smith on 09/07/2010 at 10:09. #

Bonjour,
Remarque peut être idiote et induite du fait d’un copier coller rapide pour ton blog mais dans ton fichier « Test_Amf.php » ne manquerait-il pas une accolade entre la ligne 10 et 11, histoire de fermer ta classe ?

Ciao.

by Zeb on 15/10/2010 at 20:40. #

Leave your comment

Not published