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!
PHP Conference 2009
Vuelve la PHP Barcelona Conference en su edición 2009 los días 30 y 31 de Octubre, este año con una apuesta mucho más fuerte e interesante. Para empezar el evento dura dos días durante los cuales habrá tres charlas/workshops paralelos continuamente.
Este año tengo el placer de participar como ponente dando la charla “Integrando PHP5 y ActionScript a través de AMF“, así que si vas a estar por ahí y te interesa ver cómo se integran PHP y Flash/Flex no puedes perderte esta charla!
La charla se centrará en el protocolo AMF, sus distintas implementaciones en PHP, casos de uso que cubran características interesantes, algunos benchmarks, etc…
Volviendo al evento, este año se volverá a celebrar en el Citilab de Cornellà de Llobregat, muy cerca de Barcelona ciudad.
El programa ya está cerrado y se puede ver en el apartado correspondiente de la web del evento.
Los ponentes: Derick Rethans, Pedro Cambra, Lorna Mitchel, Lorenzo Alberton, Joan Llenas (yo mismo), Rasmus Lerdorf, Kuassi Mensah, Chema Garrido, Erik Schultink, Lars Jankowfsky, Davide Ferrari, Stefan Koopmanschap, Lars Jankowfsky, Àlex Puig, Enrico Zimuel, Hans Zaunere, Damien Seguy, Davide Mendolia, Kuassi Mensah, Jordi Roura, Sebastian Bergmann, Kuassi Mensah, Victor Guardiola, Fabien Potencier, Fernando Palomo, Jordi Catà, David Zuelke… son un montón de ponentes!
Las charlas se darán en Inglés y Castellano dependiendo de la preferencia del ponente. En el apartado de charlas se puede diferenciar el idioma a través de un icono.
Si tienes que viajar y reservar estancia los organizadores proponen algunas opciones.
Y nada más solo queda que te registres!
Nos vemos
Barcelona PHP Conference

El Barcelona PHP user group ha organizado la PHP international conference un evento que trae ponentes de todo el mundo a la ciudad de Cornellà, muy cerca de Barcelona este 27 de Setiembre (27-09-2008) .
Pinta pero que muy bien! solo hace falta ver la programación y los ponentes.
Éstas son las charlas:
- Xdebug, por Derick Rethans
- Website releases made easy with the PEAR installer, por Helgi Þormar
- SQLite3, por Scott MacVicar
- Text indexing and search libraries for PHP, por Zoë Slattery
- Rasmus, think again! – Agile Framework == happy PHP Developer, por Arno Schneider
- How to pimp high volume PHP websites, por Jens Bierkandt
- Email in PHP, por Marcus Bointon
- Tuning the usability of online applications using web analytics techniques, por Jordi Roura
- eyeOS: Open Source Web Desktop System in PHP, por Pau Garcia-Milà
Si desarrollas con PHP no te puedes perder esta oportunidad… a ver si nos vemos por ahí :)
Enlaces:
Doctrine: ORM Open Source para PHP 5.2+
Doctrine es un potente y completo sistema ORM (object relational mapper) para PHP 5.2+ con un DBAL (database abstraction layer) incorporado.
Justo lo estoy utilizando para un proyecto y estoy empezando a ver su potencial, pero de la documentación se puede extraer que tiene todas las características necesarias para ser funcional en (casi?) cualquier proyecto.
Entre muchas otras cosas tienes la posibilidad de exportar una base de datos existente a sus clases correspondientes y también a la inversa, es decir convertir clases (convenientemente creadas siguiendo las pautas del ORM) a tablas de una base de datos.
Por otro lado, como la librería es bastante grande ésta tiene un método para ser ‘compilada’ al pasar a producción.
Dejo un índice de temas que estoy utilizando para buscar referencias durante el desarrollo:
- Relations
- Introduction
- Foreign key associations
- Join table associations
- Many-to-Many
- Self-referencing (Nest relations):
- Inheritance
- Foreign key constraints
- Dealing with relations
- Creating related records
- Retrieving related records
- Updating related records
- Deleting related records
- Many-to-Many relations
- Hierarchical data
- Transactions
- Internationalization with I18n
- Component overview
- Other
amfphp de nuevo en marcha
El proyecto amfphp tiene un nuevo equipo de desarrollo.
Desde que Patrick Mineault anunció que se retiraba del desarrollo web en general el futuro del proyecto ha sido incierto. Ahora tenemos asegurada una nueva versión gracias a Wade Arnold y su equipo de desarrollo.
Se espera una versión 2.0 próximamente tal y como indica Patrick en su último post.
Si quieres agradecer el gran trabajo que Patrick ha hecho con amfphp no dudes en hacer una donación, hay un botón “Make a donation” de Paypal en la barra lateral de su blog.
php mkdir en safe mode
Si estás en un server con php en safe mode y quieres utilizar mkdir() aquí tienes una posible solución. Se trata de emular el funcionamiento de mkdir() mediante las funciones de ftp que tiene php.
-
// @param $dir: una ruta relativa desde el chroot del usuario ftp
-
// (a veces puede ser que pida una ruta absoluta, depende del server)
-
public function mkdirSafeMode( $dir )
-
{
-
{
-
{
-
ftp_chmod( $conn_id, 0777, $dir );//permisos de lectura/escritura/ejecución
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
else
-
{
-
return false;
-
}
-
}
-
//ejemplo
-
$dir = "/httpdocs/nuevaCarpeta";
-
if( mkdirSafeMode( $dir ) )
-
{
-
echo "Carpeta creada correctamente";
-
}
-
else
-
{
-
echo "Error al crear la carpeta.";
-
}
Autentificación segura cliente/servidor
Leyendo la documentación acerca de como MySQL autentifica sus clientes he encontrado un sistema que me ha parecido extremadamente fácil de implementar y que aumenta la seguridad de manera importante con respecto a sistemas tradicional de login.
El flujo es el siguiente:
1. Lado Servidor
1.1 Se crea un string aleatorio de n caracteres que
llamaremos RAND_STR y se guarda en la sesión.
1.2 Se envía RAND_STR al cliente
2. Lado Cliente
2.1 Se recibe RAND_STR
2.2 El usuario entra su usuario USERNAME_CLIENT
y su password USER_PASS_CLIENT
2.3 Se calcula HASH_CLIENT = SHA1(USER_PASS_CLIENT)
2.4 Se calcula CLIENT_RES = SHA1(RAND_STR+HASH_CLIENT)
2.5 Se envía al servidor
3. Lado Servidor
3.1 Se recibe USERNAME_CLIENT y CLIENT_RES
3.2 se obtiene el password del usuario USERNAME_CLIENT
(por ejemplo con un select en la db)
3.2 Se calcula HASH_SERVER = SHA1(USER_PASS_SERVER)
3.3 Se calcula SERVER_RES = SHA1(RAND_STR+HASH_SERVER)
3.5 Se comprueba que son iguales SERVER_RES == CLIENT_RES
Como se puede ver, a cada autentificación para un mismo usuario lo que se envíe será diferente ya que RAND_STR se genera en el servidor aleatoriamente.
PHP Debugging fácil con powerflasher.com SOS
La consola
Éste es el caso de PHP, que dispone de la función fsockopen(), la cual abre una conexión con un puerto determinado y permite realizar operaciones de lectura y escritura.
Aprovechando todas las características que ofrece SOS se puede conseguir tener una ventana de salida para PHP con bastantes características interesantes.

Para conseguir algo así se necesita la consola SOS y esta clase (descarga con ejemplo al final)
-
<?php
-
/*
-
* @author Joan Garnet (http://www.joangarnet.com)
-
* @version 1.0
-
*/
-
-
class Level
-
{
-
const DEBUG = "DEBUG";
-
const WARN = "WARN";
-
const ERROR = "ERROR";
-
private $level;
-
private $levels = array
-
(
-
);
-
public function __construct( $level=self::DEBUG )
-
{
-
$this->level = $level;
-
}
-
public function getLevelColor()
-
{
-
$colors = $this->levels[$this->level];
-
return $colors[ self::$cont++ % 2 ];
-
}
-
}
-
-
-
-
class Debugger
-
{
-
/*
-
* Singleton implementation
-
*/
-
{
-
if( self::$instance == null )
-
{
-
self::$instance = new Debugger();
-
}
-
return self::$instance;
-
}
-
-
private $socket;
-
private $level;
-
public static $foldEnabled;
-
private function __construct()
-
{
-
$this->foldEnabled = false;
-
$this->setLevel ( new Level(Level::DEBUG) );
-
}
-
-
/*
-
* sends message(s) to the output screen
-
* the function accepts any number of arguments
-
* arguments can be of any type (string, array, object, date, etc..)
-
*/
-
public function trace ()
-
{
-
foreach( $args as $data )
-
{
-
{
-
}
-
else
-
{
-
}
-
if( $this->foldEnabled )
-
{
-
(
-
$this->socket,
-
"!SOS<showFoldMessage key='currentLevel'>
-
<message><![CDATA[". $data ."]]></message>
-
);
-
}
-
else
-
{
-
}
-
}
-
}
-
-
/*
-
* clears output screen
-
*/
-
public function cls()
-
{
-
}
-
-
/*
-
* brings SOS to front and shows if hidden
-
*/
-
public function show()
-
{
-
-
}
-
-
/*
-
* hides SOS to system tray
-
*/
-
public function hideToTray ()
-
{
-
-
}
-
-
/*
-
* sets level (background color) of messages
-
*/
-
public function setLevel( Level $level )
-
{
-
$this->level = $level;
-
}
-
}
-
?>
Enlaces relacionados: * SOS * Debugger.as con SOS
Respuesta del servidor al subir archivos: FileReference.uploadCompleteData
En la última versión de Flash Player ( 9.0.28.0 ) la API de FileReference incluye un nuevo evento: uploadCompleteData.
Se trata de un evento que se ejecuta cuando se ha subido por completo el archivo y (solo si) se devuelve un mensaje.
Digamos que el flujo sería el siguiente:
- SELECT
- OPEN
- PROGRESS
- UPLOAD_COMPLETE_DATA
En el caso que no se devuelva un mensaje (opción nada aconsejable) simplemente se ejecutaría el evento COMPLETE y el upload podría o no haberse realizado con éxito.
-
import flash.events.DataEvent;
-
import flash.net.FileReference;
-
var fr:FileReference = new FileReference();
-
fr.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, callbackFunction);
-
( ... )
-
fr.upload(new URLRequest("upload.php"));// upload.php DEBE DEVOLVER ALGÚN MENSAJE
-
function callbackFunction ( e:DataEvent ):void
-
{
-
trace( e.data );
-
}
[ via http://bcdef.org ]
Cheat sheets
Varios cheat sheets muy útiles:
* ActionScript 2.0 * MySQL * PHP * CSS * JavaScript
[ vía franto.com, Mike Chambers ]











