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 thoughts on “Material: Integrando PHP5 y AS3 a través de AMF

  1. 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. muy bueno Joan!
    vaya diferencia entre ajax y amf en tiempo de repuesta, no? jeje
    un saludo crack,

    d

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

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

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

    ;-)

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

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

    Saludos

  8. Gracias por tu aporte,

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

    Gracias

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

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

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

  12. 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 ;)

Comments are closed.