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

Ejemplo 1: Chat AMF

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 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!
Comments
17 Responses to “Material: Integrando PHP5 y AS3 a través de AMF”
Leave a Reply












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?
[...] This post was mentioned on Twitter by joangarnet, Marcelo Perretta and mawape, Xavier Coronado. Xavier Coronado said: Material: Integrando PHP5 y AS3 a través de AMF : Joan Garnet …: Copyright © 2007 Joan Garnet :: Arquitectura.. http://bit.ly/3mWDfc [...]
muy bueno Joan!
vaya diferencia entre ajax y amf en tiempo de repuesta, no? jeje
un saludo crack,
d
Genial porque me daba mucha pena no haber podido asistir :D
Gracias por compartirlo.
@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.
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.
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 !!
;-)
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.
La verdad que AMF no lo tenia. Parece muy potente todo lo que permite hacer. Gracias por compartirlo
Saludos
Gracias por tu aporte,
Desearia me envies tu correo y quizas sugerencias sobre el uso de nuevas tecnologias
Gracias
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?
Si me das un poco más de info acerca del problema que te da igual te puedo guiar.
Saludos
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
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”
También pasa al modificar y eliminar un contacto, el mismo mensaje de error.
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 ;)
Gracias Joan por comapartir tu esfuerzo.
Y muchas gracias a Korku por esos toques mágicos.
Funcionó