Zend_Amf, je n’y arrive pas !

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�


Top

Posted Mercredi, mai 27th, 2009 under Development, PHP, Zend.

8 comments

  1. Benjamin dit :

    Bonjour a tu essayer avec ca ?

    $server = new Zend_Amf_Server();

  2. 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 !

  3. olivtt dit :

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

  4. 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.

  5. olivtt dit :

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

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

  7. 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.

Top | Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>