Entradas etiquetadas con PHP

Cassandra 2.x y PHP para desarrolladores SQL: Instalación
0La base de datos No-SQL Cassandra fue creada por Facebook a causa de la necesidad de disponer de una base de datos distribuida de alto rendimiento, flexible, tolerante a fallos, escalable y que fuese capaz de procesar grandes cantidades de datos. Más tarde fue liberada bajo licencia Apache y actualmente es utilizada principalmente por empresas de internet con proyectos con un alto uso de base de datos como Twitter.
En esta serie de artículos iré desgranando la instalación, funcionamiento y desarrollo de aplicaciones en PHP con Cassandra, comparando las sentencias utilizadas para insertar, actualizar, etc de SQL con los métodos a utilizar en Cassandra. Por desgracia al ser algo completamente distinto a cualquier base de datos SQL tendré que añadir algo de teoría, pero intentaré que os resulte lo más ameno posible.
Al toro.
REQUISITOS
Para la realización de esta guía se utilizará Debian 8 Jessie como sistema operativo.
Doy por hecho que ya se dispone de un servidor web Apache con PHP instalado en la máquina de testeo que se esté usando. Las aplicaciones que se van a instalar han sido probadas en una máquina virtual Debian 8 Jessie utilizando como aplicación de virtualización VirtualBox, instalado en un host Debian 8 Jessie.
En un servidor de producción recomiendo que tenga bastante RAM (por encima de 1GB, ya veremos más adelante el porqué. En la máquina virtual que uso de testeo dispone de 700 MB y funciona bien, pero en producción no es lo recomendable).
Instalaremos la base de datos Cassandra y PHP-Driver que nos dará la extensión para PHP y una abstracción de la base de datos donde tenemos los métodos básicos para trabajar con Cassandra: insertar, actualizar, borrar, crear, etc.
PREPARANDO EL SISTEMA
Antes de empezar a instalar debemos actualizar el sistema operativo de la forma habitual:
apt-get update apt-get upgrade
Una vez actualizado el sistema empezamos a instalar.
INSTALANDO CASSANDRA
Lo primero que necesitamos hacer para instalar Cassandra es editar los repositorios de Debian:
nano /etc/apt/sources.list
Una vez que se abra el editor añadimos las siguientes lineas:
deb http://www.apache.org/dist/cassandra/debian/ 21x main deb-src http://www.apache.org/dist/cassandra/debian/ 21x main
Como podrás observar después de la ruta del repositorio se ha añadido «21x» esto indica el número de versión a obtener, en este caso es la versión actual de cassandra al crear este post. No se indica el número de parche, es decir, actualmente se puede descargar Cassandra 2.1.
Si dentro de unos meses sale la versión «2.2» solo tendrás que cambiar el uno por el dos.
Volvemos a consola y actualizamos los repositorios.
apt-get update
Nos dará un error en las claves gpg. Procedemos a actualizarlas con las siguientes instrucciones:
gpg --keyserver pgp.mit.edu --recv-keys F758CE318D77295D gpg --export --armor F758CE318D77295D | sudo apt-key add -
Ojo con el guión del final, hay que añadirlo, sino dará error.
Con el paquete 0.7.5 nos da otro error de clave gpg así que también instalamos esta de la misma manera:
gpg --keyserver pgp.mit.edu --recv-keys 2B5C1B00 gpg --export --armor 2B5C1B00 | sudo apt-key add -
También necesitarás añadir la siguiente clave:
gpg --keyserver pgp.mit.edu --recv-keys 0353B12C gpg --export --armor 0353B12C | sudo apt-key add -
Verificamos que tenemos el sistema actualizado.
apt-get update apt-get upgrade
Actualizamos todos los paquetes que aparezcan.
Procedemos a instalar el paquete de la base de datos NoSQL Cassandra:
apt-get install cassandra
Cassandra necesita Java para funcionar. Debian 8 ya dispone de OpenJDK en su versión 7, y aunque desde los desarrolladores de Cassandra no recomiendan su uso, para los ejemplos que vamos a desarrollar nos sirve.
En producción, o si vas a desarrollar un proyecto con Cassandra tendrás que instalar la última versión de Java de Oracle.
Por último, ejecutamos el siguiente comando para construir las dependencias:
dpkg-buildpackage -uc -us
Si el sistema no te reconoce el comando es porque te falta el paquete dpkg-dev. Instálalo de la forma habitual, y vuelve a intentarlo:
apt-get install dpkg-dev
INSTALANDO DATASTAX PHP-DRIVER PARA CASSANDRA
Datastax PHP driver, es el controlador y abstracción de base de datos que utilizaremos para conectar con Cassandra desde PHP. Este controlador nos da la posibilidad de trabajar tanto con CQL (Cassandra Query Language. Parecido a SQL) y/o el protocolo binario de Cassandra.
Aunque en la página del repositorio nos indican varias formas de instalar el controlador (https://github.com/datastax/php-driver/blob/master/ext/README.md), el único que me ha funcionado correctamente ha sido el de descargar las fuentes y compilarlo. Tú puedes probar los otros métodos, pero el que te voy a indicar funciona en Debian 8.
Las siguientes instrucciones deberías ejecutarlas en el ordenador de desarrollo y no en el servidor o máquina virtual donde tengas instalada la base de datos. (A no ser que la hayas instalado en el ordenador de desarrollo).
Instalamos algunos paquetes necesarios para realizar la compilación:
apt-get install g++ make cmake libuv-dev libssl-dev libgmp-dev php5 php5-dev openssl libpcre3-dev git
Primero necesitamos descargar las fuentes desde GitHub, utiliza el directorio que prefieras:
git clone https://github.com/datastax/php-driver.git cd php-driver git submodule update --init cd ext ./install.sh
Estos comandos nos ha creado un archivo llamado cassandra.so en /usr/lib/php5/20131226/ (el número del directorio puede variar en tu instalación. Revísalo).
Ahora creamos un archivo .ini para la extensión de PHP:
nano /etc/php5/mods-available/cassandra.ini
Dentro de ese archivo añadimos las siguientes líneas:
; configuration for PHP driver Cassandra extension=cassandra.so
Guardamos.
Le indicamos a PHP que nos active la extensión
php5enmod cassandra
Y reiniciamos Apache:
/etc/init.d/apache2 restart
Ahora si ejecutamos el siguiente comando para mostrar los módulos de PHP debería aparecernos Cassandra, si no es así es que algo a fallado:
php -m
INICIANDO CASSANDRA POR PRIMERA VEZ
Ahora que ya tenemos todo instalado es el momento de arrancar Cassandra. Esto es algo muy sencillo, solo tienes que ejecutar el siguiente comando:
cassandra -f
También tienes otras maneras de iniciar Cassandra. Por ejemplo como servicio:
service cassandra start
Si al iniciar Cassandra te da un error de memoria, haz lo siguiente:
Accede a /etc/cassandra y edita el archivo cassandra-env.sh:
cd /etc/cassandra nano cassandra-env.sh
Busca las siguientes dos líneas:
#MAX_HEAP_SIZE="4G" #HEAP_NEWSIZE="800M"
Descomenta las dos líneas, y sustituye los valores por unos más bajos. En mi caso he bajado MAX_HEAP_SIZE a 2G y HEAP_NEWSIZE lo he dejado como está.
Estas dos líneas permiten configurar la cantidad de memoria RAM que Cassandra utilizará.
Ahora vamos a utilizar el código de ejemplo que hay en el repositorio de PHP-Driver para probar que todo funciona correctamente.
Crea un archivo PHP con el siguiente contenido:
- <?php
- $cluster = Cassandra::cluster() // connects to localhost by default
- ->build();
- $keyspace = 'system';
- $session = $cluster->connect($keyspace); // create session, optionally scoped to a keyspace
- $statement = new Cassandra\SimpleStatement( // also supports prepared and batch statements
- 'SELECT keyspace_name, columnfamily_name FROM schema_columnfamilies'
- );
- $future = $session->executeAsync($statement); // fully asynchronous and easy parallel execution
- $result = $future->get(); // wait for the result, with an optional timeout
-
- foreach ($result as $row) { // results and rows implement Iterator, Countable and ArrayAccess
- printf("The keyspace %s has a table called %s\n", $row['keyspace_name'], $row['columnfamily_name']);
- }
Este código devuelve las tablas que contiene el Keyspace «system» (Más adelante explicaré que es eso). Si te da error como este: «No hosts available for the control connection», puede ser por dos razones, o bien no está funcionando Cassandra, con lo que tendrás que iniciarla con uno de los comandos anteriores, o bien no la tienes en localhost sino en un servidor externo o máquina virtual.
Para resolverlo tendrás que sustituir las siguientes líneas:
- <?php
- $cluster = Cassandra::cluster() // connects to localhost by default
- ->build();
Por estas otras:
- <?php
- $cluster = Cassandra::cluster()
- ->withContactPoints('127.0.0.1')
- ->build();
Sí, solo añadimos «->withContactPoints(‘127.0.0.1’)», con este método le estamos indicando la ip de nuestro servidor. En tu caso es posible que tengas que sustituir «127.0.0.1» por la ip de tu servidor o máquina virtual. Más adelante explicaré cada método, pero para verificar que está funcionando todo correctamente es suficiente.
Con esto finalizamos la instalación de Cassandra para que pueda ser utilizada por PHP.
Integración continua: Automatizando la creación de proyectos WordPress, Drupal, Symfony, etc. (II)
0En el post anterior hemos actualizado el script que crea los repositorios, para poder añadirle unas cuantas acciones para automatizar la creación del proyecto (creación de directorios, directorios ignorados, etc.). Ahora vamos a desarrollar la segunda parte, que consistirá en la automatización de la instalación del cms o framework elegido.
Cómo crear un servidor REST en PHP
0Un servidor REST es una aplicación que nos permite crear, actualizar, eliminar y recuperar datos de forma remota siguiendo el estandar de diseño REST. Lo habitual cuando programamos, por ejemplo peticiones ajax, es nombrar las urls como «/obtenerProducto», «/crearProducto», etc. En REST los verbos «obtener» o «crear» no se usan, ya que se utiliza una única url para todas las acciones, en nuestro ejemplo «/producto». Además, REST nombra a estas urls como recursos.
Para poder diferenciar la acción que se está realizando sobre un recurso concreto se utiliza un método u otro en la petición: GET, POST, PUT o DELETE.
Integración continua: Automatizando la descarga del código fuente de WordPress, Drupal, etc. y sus plugins, módulos y temas
0Antes de mejorar la automatización de la creación de los repositorios que vimos en el post Integración continua: Automatizando la creación de repositorios con Git y Subversion para poder crear proyectos en WordPress, Drupal, Symfony, o cualquier otro cms o framework, primero necesitamos obtener el código fuente, creando en nuestro servidor una pequeña biblioteca de código fuente desde la que copiaremos lo que necesitamos para los proyectos.
En esta biblioteca guardaremos el código fuente de los cms y frameworks que usemos, además de los módulos, plugins, bundles y temas que utilicemos habitualmente.
Integración continua: Metodologías y convenciones
0Ahora que ya tenemos gran parte del software instalado, vamos a tratar algo un poco más aburrido, pero necesario: las Metodologías.
Una metodología en programación, es el conjunto de métodos que se utilizan para llevar a cabo un desarrollo. Estos métodos se acuerdan y/o definen antes de empezar un proyecto. Y van desde la organización de la estructura del proyecto, al despliegue y futuro mantenimiento, pasando por el reparto de tareas, las reuniones de producción, etc.
Muchas de estas tareas ya están integradas en metodologías ágiles como XP o Scrum, que seguro conoceréis. Si por el contrario, no conocéis estas metodologías, os recomiendo la lectura de los dos enlaces anteriores, y a partir de ahí la lectura de varios libros.
No os voy a recomendar ninguna metodología, ya que es algo personal y que cada uno debe estudiar cuál es la más conveniente para sus proyectos o empresa.
Las convenciones son un conjunto de reglas aceptadas por los desarrolladores, que, por ejemplo, permiten que el código tenga siempre la misma estructura independientemente de quién haya programado qué. Aquí entrarían los Coding Standards de los que hablamos en otro post.
Dentro de las convenciones también se acuerdan las versiones que tendrá el proyecto, las ramas del repositorio, la estructura de directorios del proyecto, etc. Infinidad de detalles que permiten que podamos trabajar en equipo sabiendo que todo sigue las mismas reglas, de esta forma ahorramos muchísimo tiempo.
Una vez que se dispone de una metodología y/o un conjunto de convenciones definidas podremos aplicarlas a todos los proyectos que vayamos desarrollando. Pero para evitar tener que hacerlo a mano, podemos automatizar todo el proceso, desde la creación del repositorio hasta la elección de los plugins o módulos del CMS que elijamos (o el framework).
Tema Mystique para WordPress provoca el error child pid XXXXX exit signal Segmentation fault (11)
0Estoy seguro que conoceréis este tema para WordPress, el cual fue uno de los más valorados hace ya algunos años, de hecho este blog lo usa actualmente, aunque por desgracia la empresa que lo desarrolló lleva varios años sin mantenerlo, y eso provoca que aparezcan errores que antes no aparecían, por culpa de los avances en otras aplicaciones de las que depende este tema, como en nuestro caso, de PHP.
Bien, voy al grano: Hace varias semanas cambié el blog de servidor y de pronto, al entrar en un post, el blog se quedaba en blanco. No se mostraba contenido. Y en Chrome aparecía el error: ERR_INCOMPLETE_CHUNKED_ENCODING. Estoy seguro, que si te ha pasado, habrás exclamado la misma frase que yo: ¿Pero que coño es eso?.
Mirando los logs del blog, encontré el error: child pid XXXXX exit signal Segmentation fault (11), a lo que exclamé la misma expresión anterior, pero añadiendo un «¡Ostia puta!» al principio.
El segundo error es el importante. Es el que nos dice que algo se ha jodido en PHP. Pero… ¿Por qué? y lo más importante ¿El qué?.
Después de muchas pruebas, vi que el error se estaba generando en el tema Mystique, y más concretamente en la plantilla single.php.
Indagando más sobre el código conseguí llegar a la fuente del problema: cuatro putos ampersand (&) de los cojones que me han jodido un fin de semana entero con la tontería. El error es debido a la versión de PHP. En el servidor anterior era la 5.2, y en el actual es la 5.4.
Solución
Os explico la solución que es bastante sencillita:
En los archivos atom-core.php y AtomObjectPost.php busca la función «separate_comments», te deben aparecer dos resultados en cada archivo. Verás que delante de la función tiene un ampersand (&), elimínalo (con voz de El Padrino: «Que parezca un accidente»). Y con el resto de resultados igual. Guarda y solucionado.
Integración continua: Instalación de Subversion y Git
0Hoy vamos con algo que supongo ya conoceréis, pero que para esta guía es imprescindible: Los repositorios.
Los repositorios, dicho de una forma sencilla: es un lugar donde guardar y mantener un histórico de los cambios que se realizan en el software o proyecto en el que estás trabajando. De momento solo me centraré en su instalación y en una pequeña configuración que será necesaria para lo que aun queda de esta guía.
Instalación de Subversion
Instalar los paquetes necesarios
apt-get install subversion libapache2-svn subversion-tools
Los repositorios los guardaremos en el siguiente directorio:
/var/repos
Se utilizará la url svn.ic.net para obtener los repositorios. Para ello hay que añadir un virtualhost con la siguiente información (etc/apache2/sites-enabled):
ServerName svn.ic.net DocumentRoot /var/www/svn.ic.net <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/repos> Options Indexes FollowSymLinks MutiViews AllowOverride None Order allow,deny allow from all </Directory>
Añadir el dominio al archivo /etc/hosts, si no el sistema devolverá un 200 OK pero no se podrá trabajar con el repositorio.
Todos los repositorios se deberán añadir a este archivo utilizando los tags <Location></Location>, ejemplo:
<Location "/mediawiki"> DAV svn SVNPath /var/repos/mediawiki </Location>
También se pueden añadir los repositorios en archivos separados en /etc/apache2/repos e incluirlos dentro del virtualhost de svn.ic.net, añadiendo la siguiente línea:
Include /etc/apache2/repos
Instalación de Git
Para instalar Git ejecuta el siguiente comando:
apt-get install git
El virtualhost que usaremos será el mismo que el de Subversion, con lo que no tenemos que hacer nada más con git.
Integración continua: PHP Depend, realizando métricas de nuestras aplicaciones
0PHP Depend es una aplicación derivada de JDepend para Java, que genera una serie de gráficos de nuestras aplicaciones para poder realizar un seguimiento sobre la calidad de nuestro software. Para que te hagas una idea, esta aplicación nos permite saber la complejidad de un método, a través de la suma de sus estamentos (if, for, etc.), este dato, comparado con el resto del código, nos permite saber si un método está optimizado o es demasiado complejo y habría que factorizarlo.
Veamos como se instala.
Para instalar PHP_depend primero es necesario que PEAR descubra el canal desde donde se descargará la aplicación.
pear channel−discover pear.pdepend.org
A continuación mostramos una lista de los paquetes disponibles:
pear remote−list −c pdepend
Instalamos:
pear install pdepend/PHP_Depend
Es necesario instalar algunos paquetes más. Primero indicamos a PEAR que descubra el siguiente canal:
pear channel−discover pear.xplib.de
A continuación instalamos el siguiente paquete:
pear install xplib/PHP_CodeSniffer_CommentParser2−0.1.5
Que es necesario para instalar el siguiente paquete:
pear install xplib/PHP_CodeSniffer_Standards_Zeta−0.2.0
Que también es necesario para instalar el siguiente paquete:
pear install pdepend/PHP_CodeSniffer_Standards_PDepend2
Por último instalamos un paquete que se comunicará con el issue tracker (o eso indica):
pear install pdepend/PHP_Depend_Log_Arbit
Para probarlo podéis ejecutar este comando desde la consola:
pdepend −−summary−xml=/tmp/summary.xml −−jdepend−chart=/tmp/jdepend.svg −−overview−pyramid=/tmp/pyramid.svg /usr/local/share/pear/PDepend
Os generará varios gráficos y un archivo xml del código de la misma herramienta, pdepend.
Integración continua: PHPMD, detectando problemas en el código
0PHPMD o PHP Mess Detector, es una herramienta que permite detectar posibles bugs, código poco optimizado, expresiones demasiado grandes, etc. Es una herramienta muy útil para controlar la calidad de nuestro software.
Esta herramienta es hija de PMD, una herramienta para la calidad del código en Java. Podéis informaros de más características de PHPMD en su web: http://phpmd.org/
La instalación es muy sencilla:
apt−get install imagemagick php5−imagick pear channel−discover pear.phpmd.org pear channel−discover pear.pdepend.org pear install −−alldeps phpmd/PHP_PMD
Para ejecutar PHPMD tu necesitas darle los archivos a parsear, un formato para la salida y las reglas a usar. Ejemplo:
phpmd . html codesize,unusedcode,naming,design −−reportfile ../messdetector.html −−exclude Tests/