Server Side

Tecnologías web

by Gerardo Jiménez

Servidor web

Un servidor web está preparado para enviar archivos al cliente (navegador web) a través del protocolo HTTP

Servidores típicos

Apache

  • Nació en 1995
  • Código libre
  • Lidera el mercado
  • Es multiplataforma
  • Multitud de módulos disponibles
  • Es pesado y requiere mucha memoria
  • La última versión estable es 2.2
  • Soporta Virtual Hosts


La versión 2.4 mejora notablemente el uso de memoria para competir con NginX

NginX

  • Nació en 2002
  • Su primer objetivo no fue un servidor web, sino un proxy HTTP para balancear carga.
  • Es código libre
  • Wikipedia lo usa como proxy SSL
  • Uso de memoria muy bajo

Apache vs NginX

En sistemas con muchísimas peticiones, más rendimiento y menos consumo significa menos servidores, es decir menos dinero.

PHP

Php Hypertext Pre-processor

Aunque en sus inicios se llamó:

Personal Home Pages

PHP: Inicios

  • Es software libre
  • Nació en 1995 (Coincide con el nacimiento de Apache)
  • El culpable: Rasmus Lerdorf
  • Al principio sólo era un conjunto de scripts para facilitar la creación de páginas web personales.
  • 1997 PHP 3: Dos programadores israelíes Zeev Suraski y Andi Gutmans, reescribieron el analizador sintáctico
  • 2000 PHP 4: Vuelven a reescribirlo todo, lo llaman Zend Engine 1.0
  • 2004 PHP 5: Zend Engine 2.0 - Añade OO
  • Desde entonces, han ido añadiendo mejoras progresivamente en versiones 5.1, 5.2, 5.3, 5.4 y 5.5

Documentación PHP

Existe una comunidad muy activa y muchísima documentación, gran parte en español: http://php.net/

Todas las funciones y métodos de la documentación tienen la misma estructura:

  • Signatura de la función
  • Descripción de los parámetros
  • Descripción de los valores devueltos
  • Ejemplos
  • Notas
  • Funciones relacionadas
  • Comentarios de los usuarios muuuuchos comentarios

PHP bajo el capó

  • Las funciones y clases nativas de PHP están implementadas en C++, se ejecutan increíblemente rápido.
  • PHP se puede extender con otros módulos escritos en C++
  • Hay gran cantidad de módulos: conectores para bases de datos, cachés, exportadores de PDFs, etc.
  • El resto del código es interpretado

Cómo se ejecuta PHP

  1. Un usuario pide una página desde su navegador
  2. Apache recibe la petición crea un proceso independiente y al ver que es un PHP la reenvía al intérprete de PHP
  3. PHP recoge la petición y empieza a analizar el archivo .php correspondiente
  4. El parser entra en acción en los fragmentos de código entre <php y ?>
  5. Para cada archivo PHP que se incluye se genera un código intermedio (bytecode)
  6. Se ejecuta todo el bytecode y se le envía la respuesta a Apache
  7. Apache la vuelve a reenviar al navegador del usuario

Observación: PHP por sí mismo no almacena información de una petición a otra, ya que en cada petición del navegador, el proceso (y la memoria asignada) se crea y se destruye.

Consideraciones de rendimiento

  1. Como Apache debe cargar el módulo PHP, Apache se vuelve más lento y consume más memoria
  2. Cada archivo PHP que se carga supone un acceso a disco (los accesos a disco son muy muy lentos) hay que procurar evitar muchos accesos.

Cómo mejorar el rendimiento

  • APC - Alternative PHP Cache
  • MemCached
  • Escribir código eficiente
  • HipHop PHP

APC

Incrementa el rendimiento de dos formas:

  • Sólo con tenerlo activado, se guarda los bytecodes de cada archivo en memoria, con esto ahorra tiempo de procesamiento, y se evita muchos accesos de disco. El aumento de rendimiento es notable.
  • Permite guardar información directamente en memoria, por ejemplo valores de configuración, listas pequeñas o el resultado de cómputos que se realizan con mucha frecuencia.

Memcached

Se desarrolló en 2003 para el sitio web LiveJournal

Está basado en una tabla hash en memoria distribuida de varios servidores.

El tiempo de acceso a un valor de la tabla es algo inferior a un acceso a disco, pero nos garantiza que la información está sincronizada entre todos los servidores.

Escribir código eficiente

Reducir el número de archivos es muy importante. Por ejemplo, tener toda la configuración en un único archivo en vez de varios ahorrará tiempo de acceso a disco.

Distribución inteligente de código en nuestros ficheros, de tal forma que no se cargue código innecesario.

Utilizar funciones nativas siempre que sea posible, ya que al estar implementadas en C++ se ejecutan hasta 100 veces más rápido que en PHP.

Optimizar el uso de recursos: memoria, archivos abiertos, etc.

HipHop PHP

Facebook empezó utilizando PHP en sus servidores, para ahorrar costes inventó HipHop PHP

  • Compila código PHP a C++
  • Puede reducir el tiempo de ejecución más de un 70%
  • Tiene algunas limitaciones en cuanto al uso de introspección en PHP

Notas de rendimiento de facebook

Empezando con PHP

Para que el servidor ejecute php necesitaremos:

  • Un archivo con extensión .php
  • Un fragmento de PHP:

<!-- código HTML-->

<?php
/* Código PHP */
for ($i = 0; $i < 10; $i++) {
    echo $i.' ';
}
?>

<!-- más código HTML-->
					

Punto y coma

El punto y coma para separar sentencias es obligatorio.

Sintaxis: Variables

  • Las variables siempre se preceden por $
  • No hay que especificar el tipo

$mi_bool = false;
$mi_cadena = 'mi cadena de texto';
$mi_objeto = new stdClass();
$mi_numero = 1234;
						

Sintaxis: Arrays

  • La sintaxis de arrays es muy flexible
  • Los valores pueden ser de distintos tipos dentro del mismo array

$mi_array = Array(
    'edad'=>25,
    'nombre'=>'Mengano',
    'colores'=> array(
        'rojo',
        'verde',
        'azul'
    )
);
$mi_array['colores'][2]; // 'azul'
						

Enviar info

Para enviar información por pantalla contamos con:

  • echo expresión - Muestra el contenido de una variable string
  • print_r($objeto) - Muestra una representación de cualquier cosa que le pasemos: una variable, array, objeto, etc.

echo "hola";
echo "<h1>Mi título</h1>"
echo $mi_variable;

$mi_array = array('nombre'=>'Fulano');
print_r($mi_array);

$mi_objeto = new stdClass();
print_r($mi_objeto);
						

Comillas dobles y simples

Se pueden utilizar comillas dobles y simples, sin embargo, las comillas dobles tienen un procesamiento extra:


// Mejora la legibilidad del código añadiendo variables
$edad = 75;
echo "Fulanito tiene $edad años";  // Fulanito tiene 75 años


// Para expresiones complejas hay que utilizar llaves { }
$persona = new Persona();
echo "Fulanito tiene {$persona->getEdad()} años";
						

Para mejorar el rendimiento, es preferible usar las simples si no vamos a utilizar características especiales.

Incluir archivos externos

Hay varias formas de incluir archivos externos:


include('mi_archivo.php'); // Se incluye en el punto en el que se llama

include_once('mi_archivo.php'); // Se incluye en el punto en el que se
                                // llama y no se incluirá en llamadas
                                // posteriores esto es útil para incluir
                                // librerías


require('mi_archivo.php'); // igual que include pero PETA si el archivo
                           // no existe

require_once('mi_archivo'); // igual que incluide_once pero peta si el
                            // archivo no existe
						

Clases

  • Las clases se definen en tiempo de compilación.
  • Soportan herencia simple, polimorfismo, clases abstractas, métodos y atributos estáticos y final, ámbitos private, public y protected.
  • Existen métodos especiales llamados 'métodos mágicos' que permiten añadir funcionalidad extra: http://www.php.net/manual/es/language.oop5.magic.php
  • Documentación: http://php.net/manual/es/language.oop5.php

Ejemplo de clase


class MiClase extends MiOtraClasepadre {

    const MI_CONSTANTE = 'constante de clase';

	private $atributo_privado = 'valor';
	public $atributo_publico = 'valor';

	public function metodo_publico($parametro) {
		return 'Mi parámetro: '.$parametro;
	}
	
}

$mi_clase = new MiClase();
echo $mi_clase->metodo_publico();
						

Interfaces

PHP soporta interfaces. Una clase puede implementar múltiples interfaces. Documentación: http://www.php.net/manual/es/language.oop5.interfaces.php


interface iTemplate {
    public function setVariable($name, $var);
    public function getHtml($template);
}

// Implementar la interfaz
// Ésto funcionará 
class Template implements iTemplate {
	
}
						

Traits

Los traits son un mecanismo muy potente de herencia que soluciona el problema típico de la herencia múltiple.

Básicamente un trait permite definir una clase a partir de varias clases padre simultáneamente eligiendo los métodos y atributos deseados.


trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
						

Operaciones con arrays

El manejo de estructuras de datos complejas es extremadamente sencillo con la versatilidad de los arrays. Documentación: http://php.net/manual/en/function.array.php

Es posible utilizar arrays como:

  • Pilas
  • Colas
  • Mapas
  • Árboles
  • ...

PHP y JSON

Serializar y deserializar objetos y arrays a JSON es trivial con las funciones:


$array = array('nombre' => 'Fulano');
$json = json_encode($array);
$array = json_decode($json);
					

ORM

Object-Relational Mapping

ORM ya, pero ¿Qué hace?

Abstrae la implementación de la base de datos. Es decir, si utilizo el ORM en vez de llamar directamente a la base de datos, puedo cambiarla sin tener que cambiar mi código. Sería posible cambiar entre MySQL, PostgreSQL, Oracle, SQL Server, ... de forma transparente.

PDO (PHP Data Objects)

PDO tiene conectores para:

  • CUBRID
  • MS SQL Server
  • Firebird
  • IBM
  • Informix
  • MySQL
  • Microsoft SQL Server
  • Oracle
  • ODBC and DB2
  • PostgreSQL
  • SQLite
  • 4D

PDO Ejemplo

Documentación: http://es.php.net/pdo


function getFruit($conn) {
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach ($conn->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
}
						

Otros ORMs

MySQL

Documentación: http://es1.php.net/manual/es/book.mysql.php

- Ver rama Step2 del proyecto BlogPHP -
https://github.com/GerardoOscarJT/BlogPHP/tree/step2

PhpMyAdmin

Es un cliente web escrito en PHP, para gestionar y administrar bases de datos MySQL.

Sitio web: http://www.phpmyadmin.net/home_page/index.php

MySQL Workbench

Es un cliente web de escritorio, para gestionar y administrar bases de datos MySQL.

Sitio web: http://www.mysql.com/products/workbench/

Frameworks y CMS

  • Symfony -- Framework
  • Drupal -- CMS + Framework
  • PrestaShop -- CMS
  • Joomla -- CMS
  • Wordpress -- CMS

Sistemas de plantillas

  • Smarty - http://www.smarty.net/
  • Twig - http://twig.sensiolabs.org/

NodeJS

Con la popularidad cada vez más creciente de JavaScript y el alto rendimiento de la máquina virtual de Google, la V8, no tardó en aparecer un lunático en escribir un servidor en JavaScript.

Documentación: http://nodejs.org/api/

Puntos fuertes de NodeJS

  • Muy muy poco consumo de recursos (menos que NginX)
  • Alta asincronía
  • Permite mantener muchísimas conexiones abiertas de forma simultánea
  • Perfecto para hacer Servicios Web, Chats, y servicios en tiempo real.

V8, el corazón de NodeJS

V8 es la máquina virtual de JavaScript utilizada en Google Chrome. Es código libre. V8 tiene un rendimiento excepcional ya que compila JavaScript al código máquina de la arquitectura del procesador en el que se ejecuta.

Ejemplo básico de un servidor en NodeJS


var http = require('http');
 
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);
 
console.log('Server running at http://127.0.0.1:8000/');
					

Persistencia

  • Para garantizar la durabilidad de la información se suelen utilizar bases de datos.
  • Muchísimos tipos de bases de datos y para multitud de propósitos.
  • En el ámbito web y empresarial se suelen utilizar bases de datos relacionales.

Bases de datos relacionales

  • Se basan en la abstracción de tabla para organizar los datos
  • Son muy buenas para tratar colecciones de datos muy ortogonales
  • Hay que evitar a toda costa redundancia lógica de datos, es por ello que existen las 'Formas Normales'
  • Para interactuar con este tipo de bases de datos se utiliza el lenguaje SQL

MySQL

  • Es código libre
  • Es una base de datos relacional de código libre
  • Es una de las más extendidas en el mundo web
  • Desde que fue absorbida por Oracle ha surgido un Fork del propio creador llamado 'MariaDB'
  • Tiene un rendimiento especialmente bueno en lectura
  • Es escalable, soporta el modelo maestro-esclavo y particionado de tablas
  • Soporta varios motores de almacenamiento, los más populares son MyISAM e InnoDB

MemSQL

Sitio web: http://www.memsql.com/

  • Almacena toda la información en memoria (y la replica en disco)
  • Es muy rápido (unas 60 más rápido que MySQL) ya que compila las consultas SQL a código nativo.
  • Se utiliza para hacer minería de datos y análisis en tiempo real.
  • No es software libre

Tendencias

Hay situaciones en las que:

  • Los datos no son tan ortogonales
  • Las relaciones entre 'registros' no son tan fuertes
  • Las estructuras de datos son muy complejas

La solución

Para solucionar estos nuevos problemas, se han diseñado las bases de datos basadas en documentos, también conocidas como noSQL

  • El lenguaje para interactuar con ellas NO es SQL
  • Las tablas ahora se llaman colecciones
  • Los registros (o filas) ahora se llaman objetos (o documentos)
  • El concepto de columnas ya no existe
  • Básicamente cada objeto almacena un JSON

MongoDB

MongoDB es la solución más extendida para bases de datos noSQL. Documentación http://www.mongodb.org/

Algunos de los sitios que usan MongoDB:

  • Craigslist stores over 2 billion records in MongoDB.
  • SAP uses MongoDB in the SAP PaaS.
  • Forbes stores articles and companies data in MongoDB.
  • The New York Times
  • Sourceforge uses MongoDB for its back-end storage pages.
  • Codecademy
  • Shutterfly for its photo platform. 18 billion photos.
  • The Guardian uses MongoDB for its identity system.
  • CERN uses MongoDB for the Large Hadron Collider.
  • Foursquare store venues and user check-ins.
  • eBay uses MongoDB in the search suggestion.

Apache Cassandra

  • Se desarrolló en Facebook
  • Es de tipo noSQL
  • Se basa en la abstracción clave-valor
  • Es distribuido
  • Código libre

Redis

  • Se basa en la abstracción clave-valor
  • Es distribuido
  • Los datos se almacenan en memoria
  • Se utiliza para sincronizar servidores entre sí, uso de sesiones, etc
  • Licencia BSD