Jul
28

logo_facebookEstoy seguro de que en mayor o menor medida conocerás facebook, la red social que ha revolcionado internet y hecho de Mark Zuckerberg uno de los multimillonarios más jóvenes de la historia, si no el que más.

Para los que anden una poco más apartados del tema Facebook es una red social (la primera y la que más éxito tiene en la actualidad) que nació inicialemente como un sitio exclusivo para los estudiantes de Hardvard, pero que en la acualidad admite la creación de cuentas de todo aquel que disponga de una cuenta de correo electrónico, es decir todo el mundo, ya que éstas son gratuitas.

Pues bien, vamos a ver como algo que nació para un grupo reducido de personas ha ido creciendo poco a poco gracias a los ingenieros que trabajan día a día en la misma.

Antes de nada comentar que los datos que voy a utilizar en este artículo los he sacado de una presentación (que he encontrado en Pensamientos Ágiles) de Aditya Agarwal, el director de ingeniería de facebook.

Facebook está programado principalmente en PHP, MySQL y Memcache (LAMP), esto es así lógicamente porque es el conjunto de herramientas con las que comenzó la aplicación (por aquello de que iba a ser una aplicación y tal, supongo), y aunque hoy en día para grandes aplicaciones suele utilizarse lenguajes como .NET (que es un lenguaje que permite una mayor interacción con los procesos del equipo), los del equipo de desarrollo han sabido ingeniárslas para poder sacar adelante el proyecto, aunque para ello hayan tenido que hechar mano de varios tipos de lenguajes (C++, Java, erlang)…

Estadísticas de facebook:

  • Más de 120 millones de usuarios activos.
  • Más de 5 billones de páginas vistas (50 billones del sistema ingles).
  • Más de 1 billón de fotos subidas a sus servidores (10 billones en el sistema inglés).
  • Más de 1.000 millones de conexiones.
  • Más de 50.000 aplicaciones hechas para Facebook.
  • Cuenta con el apoyo de más de 400.000 desarrolladores.

PHP (impresiones varias, antes y después):php

  • Definen inicialmente PHP como un lenguaje rápido, bueno y que cuenta con una gran comunidad de desarrolladores y de librerías.
  • Es un lenguaje no tipado lo que dificulta el entendimiento del código y de la pila de ejecución.
  • Es un lenguaje con malas opciones de escalabilidad y optimización.
  • Cada archivo incluido aumenta la complejidad de manera lineal.

MySQL:mysql_logo

  • Una de sus mayores impresiones con el sistema es que es “realmente rápido”.
  • Utilizan pares <key, value> (clave, valor) para almacenar los datos en las bases de datos.
  • No realizan ningún join en producción, ya que al tratarse de una base de datos distribuida, consume recursos innecesariamente.
  • Los datos más antiguos se archivan, ya que éstos son los que menos probabilidades tienen de ser accedidos.
  • A pesar de que la mayor parte de d los datos tienen consistencia, éste no es un hecho que les preocupe mucho, ya que no hace falta ningún tipo de inconsistencia para la maoyoría de los datos.
  • Hay una base de datos que contiene un grafo de los usuarios del sitio, para así poder acceder fácilmente a los datos de cada usuario.
  • Las modificaciones que han hecho en MySQL son prácticamente nulos.

Memcache:

  • Este sistema dota a Facebook de la velocidad que lo caracteriza.
  • Dota a facebook con una latencia < 200 ms.
  • Cuentan con 25TB (1TB = 1024GB) de memoria.
  • Hacen uso de multi-gets.
  • Han cambiado el protocolo de comunicación, que pasa de ser TCP a UDP para reducir al máximo el cosumo de memoria por los buffers.
  • Han modificado el núcleo de Linux (sistema operativo sobre el que corre facebook) para permitir que Memcache trabaje con equipos de más de un núcleo.

Inconvenientes de PHP y otras cuestiones:

PHP no es precisamente el lenguaje más rápido que existe, ya que se trata de un lenguaje interpretado y si a eso le sumamos que hay ciertas tareas que no se pueden llevar a cabo sólo con el uso de PHP, llegamos a la conclusión de que quizá no haya sido una buena elección para este tipo de aplicación, lo que les ha llevado a intentar migrar el núcleo de facebook a python vaias veces, pero ninguna de ellas llegó a tener el resultado esperado.

Por este motivo, el equipo de facebook creó Thrift, un sistema que permite (de forma más eficiente que otros similares) hacer que PHP interactue con otros lenguajes de programación, como Java, C++,…

Otra característica importante es que si ya existe una librería en Java y no en PHP no se preocupan en migrarla, directamente hacen uso de ella, como por ejemplo la librería para realizar el envío de SMS.

Todo este rollo ha venido inspirado por una serie de conversaciones que tengo con gente de mi entorno en las que discutimos si PHP merece o no la pena, lo que me ha hecho investigar un poco, y si bien no he cambiado de opinión tras averiguar algo más sobre Facebook, he de reconocer que puede llegar a ser un fastidio tener que recurrir a otros lenguajes de programación en determinadas ocasiones, así como que se trata de un lenguaje interpretado y no es el más rápido ni mucho menos o que simplemente se trata de un lenguaje no tipado, lo que puede dificultar un poco la interpretación de código, de manera que a la hora de enfrentarnos con proyectos con un prebisible importante crecimiento, tengamos que plantearnos otras tecnologías, como son .NET y Java.

Tags: , , ,
Categoría Web | 16 Comentarios »
Dec
20

cpl-10

Como algunos sabrán, soy el diseñador de algunas aplicaciones web, entre las cuales se encuentra OGStats, escrita en PHP entre otros lenguajes web, y desde que alguien me preguntó cuantas lineas de código conformaban dicha aplicación (respuesta a la cual no supe responder) tras lo cual me entró la curiosidad, así que hoy me he puesto manos a la obra, y he hecho una mini aplicación (si es que se le puede llamar así) cuyo objetivo es obtener el número total de lineas de un proyecto web.

Esta aplicación es de funcionamiento muy sencillo, basta con descomprimir el fichero y colocar el archivo countProjectLines.php y la carpeta  con el mismo nombre en el directorio raiz de la aplicación. Una vez se ha hecho esto, solamente hay cargar con cualquier navegador web el archivo countProjectLines.php.

Este contador es 100% personalizable, ya que si no se desea contar las lineas de los archivos de un tipo determinado, un archivo en concreto, o simplemente pasar por alto una carpeta del proyecto con sólo cambiar 3 líneas de código.

Casos:

a) Queremos excluir una carpeta de ser analizada:

Basta con abrir el archivo countProjectLines/classes/folder.php ir a la linea 41

$this->skippingFolders = array('_vti_bin', '_vti_cnf', '_vti_log', '_vti_pvt', '_vti_txt', '_private', 'countProjectLines');

y añadir la carpeta deseada en la lista.
b) Queremos excluir un tipo de archivos:

Basta con abrir el archivo countProjectLines/classes/file.php ir a la linea 33

$this->skippingExtensions = array('swf', 'png', 'jpg', 'gif', 'bmp', 'jpeg');

y añadir la extensión deseada en la lista.
c) Queremos excluir un archivo en concreto:

Basta con abrir el archivo countProjectLines/classes/file.php ir a la linea 32

$this->skippingFiles = array('Thumbs.db', 'countProjectLines.php');

y añadir el nombre de archivo deseado en la lista.

Como se ha podido observar es bastante sencillo editar lo que se quiere y no tener en cuenta a la hora de hacer un conteo de las lineas de los archivos que conformen nuestro proyecto.

Requisitos:

  • Para poder ejecutar la aplicación es necesario que tengamos instalado un servidor web con php instalado (como por ejemplo appserv) en el ordenador en el que están almacenados los archivos.

*Nota: Como es posible que ya lo hayas pensado, pero esta aplicación no vale únicamente para contar lineas de proyectos web, sino que contará las lineas de todos aquellos archivos que se encuentre en el directorio actual y sus subdirectorios, tanto si son *.php, *.cpp o *.pdf.

**Nota: Para terminar me gustaría recordar que mi andadura con PHP comenzó hace unos 5 meses (de los cuales 3 han sido poco productivos porque he tenido clases), por lo que es posible que si alguien experimentado analiza el código encuentre múltiples fallos y funciones que se podían optimizar, y me agradecería que si es así lo comentase, ya que para eso estamos, para aprender ¿no?.

Descargar | Coun Porject Lines

Tags:
Categoría Web | Sé el primero en comentar!
Sep
3

¿Cómo solucionar este error?

Warning: Cannot modify header information – headers already sent by…

Antes de nada hemos de saber que este error aparece cuando intentamos modificar el “header” de una página web después de que éste haya sido ya enviado, razón por la cual hemos de hacer todos los cambios en la cabecera antes incluso de enviar cualquier etiqueta HTML, ya que esto provocaría el envío del “header”.
Algunas etiquetas HTML típicas:

<html>
<head>
</head>
<body>
</body>

</html>

Pues bien, para solucionar este problema, he encontrado una función de php que habilita el uso del búfer de salida, lo cual quiere decir que mientras no se haya cerrado dicho buffer, el servidor no “escribirá” el código HTML resultante de interpretar el código php. para usar esta función, deberíamos dejar todo el código entre dos funciones, ob_start() y ob_end_flush(), de tal modo que se guarda toda la información el el búfer de desde la primera hasta la segunda función.

Un ejemplo:

<?php
	session_start();
?>

Mientras el código anterior daría un error como el del título, los dos siguientes presentan las posibles soluciones:

<?php
	session_start();
?>
<html>
<head>
</head>
<body>
</body>
</html>
<?php
	ob_start();
?>
<html>
<head>
<?php
	session_start();
?>
</head>
<body>
</body>
<?php
	ob_end_flush();
?>
</html>

La primera solución es sin duda la más sencilla, modificar los headers antes de que se imprima ninguna etiqueta, pero no siempre es tan fácil aplicar dicha solución, ya que, sobre todo cuando se trabaja mucho con cookies, no es factible en ocasiones (al menos sin complicarse mucho la vida) modificarlo al inicio del archivo, por lo que se puede optar por la segunda solución en estas ocasiones.

Tags:
Categoría Manuales, Programación | 2 Comentarios »