Material: Integrando PHP5 y AS3 a través de AMF

Dejo aquí todo el material de la charla que ofrecí en la PHPConfrence el viernes:

Slides

Integrando ActionScript3 y PHP5 a través de AMF

Ejemplo 1: Chat AMF

Flex + WebOrb Chat
AMF File Chat: Chat realizado con WebOrb para PHP + Flex.
Se puede ver en acción la implementación de mensajería de WebOrb para PHP y un sistema de transferencia de archivos a través del canal del Chat.

Ejemplo 2: Gestor Contactos

Gestor Contactos multi AMF implementation
Gestor de Contactos realizado con PHP + Flex. Se puede ver cómo con una misma base de código, solo cambiando las rutas de los gateways AMF se puede atacar a un mismo servicio a través de las diferentes implementaciones presentadas: Weborb, AMFPHP y Zend_AMF.
Nota 1: Zend framework debe estar instalado en el include_path de PHP para que funcione con Zend_AMF. Las demás implementaciones funcionan out of the box.
Nota 2: Se debe crear la base de datos MySQL gestor_contactos y ejecutar el script SQL contra ésta para crear la tabla contacto.

Enjoy!

19 Responses to “ “Material: Integrando PHP5 y AS3 a través de AMF”

  1. Alexdw dice:

    Yo he probado todas las implementaciones php y aunque weborb tiene una potencia brutal, Zend AMF me parece más liviano y facil de implementar

    ¿con que implementación te quedas?

  2. elviajeropolar dice:

    muy bueno Joan!
    vaya diferencia entre ajax y amf en tiempo de repuesta, no? jeje
    un saludo crack,

    d

  3. Genial porque me daba mucha pena no haber podido asistir :D
    Gracias por compartirlo.

  4. Joan Garnet dice:

    @alexdw: Weborb es una solución redonda, como bien dices tiene una potencial considerable. La verdad es que me gusta mucho y creo que supera a todas las demás en varios aspectos. Pero si me preguntas por mi preferencia, si tuviera que hacer un proyecto ahora mismo escogería AMFPHP. A día de hoy es la implementacion menos intrusiva y de hecho la que más más tiempo lleva utilizándose en entornos de producción de forma satisfactoría. Eso es siempre un plus con mayúsculas. Zend_AMF, aunque reconozco que no tengo datos suficientes para juzgarla todavía, pues es la que menos me gusta de momento… Es la que más dolores de cabeza me ha dado a la hora de hacer el ejemplo que presento en el post.

    @elviajeropolar: Ei Dani! ya ves que los benchmarks hablan por si solos. Y los puedes probar en directo en el site de Mr.Ward! Es increíble la diferencia que hay con cualquier otro protocolo de transporte…. un abrazo! ;)

    @alberto: El evento fue una pasada. Si te gusta PHP te aconsejo que empieces a reservar para el año que viene.

  5. Vaya Joan, sumamente valiosa tu aportacion, porque en nuestro idioma realmente pocos lugares he encontrado informacion de tan buen nivel y aunque no tengo el gusto de conocerte ya que estoy en Mexico te mando mis mejores felicitaciones.

  6. Oscar Alconada dice:

    Joan,
    a ver si tengo oportunidad un año de ir a la conferencia, hablan maravillas !!

    Felicitarte por el trabajo, tema muy interesante.

    La verdad es que en mi caso , esperaba y espero mucho mas de Zend, dicen que es el que mas promete, no sé.
    De momento, por mi parte seguiremos utilizando amfphp, me parece mas limpio y trasparente, tambien como dices es verdad que con diferencia es que mas tiempo se lleva utilizando.
    Toca estar pendientes !!

    ;-)

  7. kei dice:

    Holas, exelente aporte para los que estamos aprendiendo de estas tecnologias….

    una pregunta…. puedes darme tu correo para hacerte unas consultas. mi correo es kei [punto] seele [a] gmail [punto] com y soy de nicaragua.

  8. Clases de java dice:

    La verdad que AMF no lo tenia. Parece muy potente todo lo que permite hacer. Gracias por compartirlo

    Saludos

  9. manfred torrez dice:

    Gracias por tu aporte,

    Desearia me envies tu correo y quizas sugerencias sobre el uso de nuevas tecnologias

    Gracias

  10. Korku dice:

    Hola,

    He probado el ejemplo de Gestor Contactos Multi AMF implementation y no me funciona a la hora de arrancar la aplicación usando los tres controladores. ¿Qué le falta para que funcione correctamente?

  11. Joan Garnet dice:

    Si me das un poco más de info acerca del problema que te da igual te puedo guiar.

    Saludos

  12. Korku dice:

    Hola Joan:

    He encontrado el problema, es el Debbuger:

    Warning: fsockopen(): unable to connect to localhost:4444 (Se produjo un error durante el intento de conexión ya que la parte conectada no respondió adecuadamente tras un periodo de tiempo, o bien se produjo un error en la conexión establecida ya que el host conectado no ha podido responder. ) in C:\Webs\GestorContactos\amfServers\Debugger.php on line 54 Warning: fwrite(): supplied argument is not a valid stream resource in C:\Webs\GestorContactos\amfServers\Debugger.php on line 75 Warning: fwrite(): supplied argument is not a valid stream resource in C:\AppServ\www\GestorContactos\amfServers\Debugger.php on line 89

    Lo he solucionado comentando las líneas:

    En el gateway.php de AmfPHP:

    //require_once(“../Debugger.php”);
    //Debugger::getInstance()->trace( “amfphp” );

    En el weborb.php de WebORB:

    //require_once(“../Debugger.php”);

    //Debugger::getInstance()->trace( “weborb” );

    En el gateway de Zend:

    //require_once “../Debugger.php”;

    //Debugger::getInstance()->trace( “zend” );

    Todo correcto… pero he encontrado otro fallito: Cuando cargo la aplicación, se carga los datos del DataGrid y por defecto el controlador WebORB pero cuando lo cambio a AmfPHP me sale un error del debug del flash:

    TypeError: Error #1034: Error de conversión forzada: no se puede convertir Object@9e7e221 en com.codeoscopic.gestorContactos.vo.Contacto.
    at com.codeoscopic.gestorContactos.view.renderer::GeneroContactoRenderer/set data()[C:\Infozone\Proyectos\GestorContactos\src\com\codeoscopic\gestorContactos\view\renderer\GeneroContactoRenderer.mxml:19]
    at mx.controls::DataGrid/http://www.adobe.com/2006/flex/mx/internal::setupRendererFromData()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\controls\DataGrid.as:1662]
    at mx.controls::DataGrid/commitProperties()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\controls\DataGrid.as:1622]
    at mx.core::UIComponent/validateProperties()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\core\UIComponent.as:5818]
    at mx.managers::LayoutManager/validateProperties()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:539]
    at mx.managers::LayoutManager/doPhasedInstantiation()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:689]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at mx.core::UIComponent/callLaterDispatcher2()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8744]
    at mx.core::UIComponent/callLaterDispatcher()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8684]

    Con WebORB y Zend no falla (todo correcto) pero con AmfPHP no.

    ¿Tiene solución?

    Saludos

  13. Korku dice:

    Viendo el problema de los tipos, he quitado el itemRenderer para seguir probando pero he encontrado otro fallito a la hora de crear un nuevo contacto usando el AmfPHP:

    (mx.rpc.events::FaultEvent)#0
    bubbles = false
    cancelable = true
    currentTarget = (null)
    eventPhase = 2
    fault = (mx.rpc::Fault)#1
    content = (Object)#2
    errorID = 0
    faultCode = “AMFPHP_RUNTIME_ERROR”
    faultDetail = “C:\Webs\GestorContactos\amfServers\amfphp\services\com\codeoscopic\gestorContactos\ContactosService.php on line 9″
    faultString = “Argument 1 passed to ContactosService::crearContacto() must be an instance of Contacto, array given”
    message = “faultCode:AMFPHP_RUNTIME_ERROR faultString:’Argument 1 passed to ContactosService::crearContacto() must be an instance of Contacto, array given’ faultDetail:’C:\AppServ\www\GestorContactos\amfServers\amfphp\services\com\codeoscopic\gestorContactos\ContactosService.php on line 9′”
    name = “Error”
    rootCause = (null)
    headers = (null)
    message = (mx.messaging.messages::ErrorMessage)#3
    body = (Object)#2
    clientId = (null)
    correlationId = “44A247E2-E8E8-63A0-FA8A-87419ADF7364″
    destination = “”
    extendedData = (null)
    faultCode = “AMFPHP_RUNTIME_ERROR”
    faultDetail = “C:\Webs\GestorContactos\amfServers\amfphp\services\com\codeoscopic\gestorContactos\ContactosService.php on line 9″
    faultString = “Argument 1 passed to ContactosService::crearContacto() must be an instance of Contacto, array given”
    headers = (Object)#4
    messageId = “2E69BDB3-2408-DBF5-36F4-87419B4DC89E”
    rootCause = (null)
    timestamp = 0
    timeToLive = 0
    messageId = “2E69BDB3-2408-DBF5-36F4-87419B4DC89E”
    statusCode = 0
    target = (null)
    token = (mx.rpc::AsyncToken)#5
    message = (mx.messaging.messages::RemotingMessage)#6
    body = (Array)#7
    [0] (com.codeoscopic.gestorContactos.vo::Contacto)#8
    apellido1 = “”
    apellido2 = “”
    direccion = “”
    email = “”
    foto = “/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz
    ODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj
    Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAGQAZAMBEQACEQED
    EQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAE
    EQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH
    SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1
    tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAA
    AAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGh
    scEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq
    c3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV
    1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APP6ACgAoAKACgAoAKACgAoAKACg
    AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC
    gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA
    CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK
    ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA
    KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP8A/9k=”
    id = 0
    nombre = “Prueba de contacto”
    sexo = (null)
    telefono = “”
    clientId = “71D3744B-8E58-2889-4BF0-00004C63E931″
    destination = “amfphp”
    headers = (Object)#9
    DSEndpoint = “amfphpId”
    DSId = “C727F8DF-5889-3F5D-7F7A-A7290261EEB0″
    messageId = “44A247E2-E8E8-63A0-FA8A-87419ADF7364″
    operation = “crearContacto”
    source = “com.codeoscopic.gestorContactos.ContactosService”
    timestamp = 0
    timeToLive = 0
    responders = (Array)#10
    [0] (mx.rpc::Responder)#11
    result = (null)
    type = “fault”

  14. Korku dice:

    También pasa al modificar y eliminar un contacto, el mismo mensaje de error.

  15. Korku dice:

    Solucionado.

    Hay que añadir una línea después de la declaración de variables en el archivo Contacto.php que está en la carpeta vo:

    var $_explicitType = “com.codeoscopic.gestorContactos.vo.Contacto”;

    Funciona todo a la perfección ;)

  16. XemaX dice:

    Gracias Joan por comapartir tu esfuerzo.
    Y muchas gracias a Korku por esos toques mágicos.
    Funcionó

  17. Korku dice:

    Intento poner el gestorContactos en SSL pero no va, ¿Hay que editar algo en los AMF’s?

    Saludos.

  18. Enrique dice:

    Hola, como hago para ejecutar el Chat?
    Gracias!

Trackbacks/Pingbacks

  1. Tweets that mention Material: Integrando PHP5 y AS3 a través de AMF : Joan Garnet :: Arquitectura y desarrollo RIA -- Topsy.com - [...] This post was mentioned on Twitter by joangarnet, Marcelo Perretta and mawape, Xavier Coronado. Xavier Coronado said: Material: Integrando …