Instalación de PHP en servidor Ubuntu

Hay dos opciones para instalar Apache en nuestro servidor Ubuntu, por módulo de apache (la forma normal) o por cgi. La forma preferible es a través de módulo, pero no todos los servidores lo permiten (como me ha pasado a mi hoy debido a que no tenía acceso a los repositorios del apt).

Importante aclarar que la forma ideal es hacerlo a través de apache puesto que por CGI parece ser que el rendimiento es mucho peor.

Pasos para la instalación por módulo de Apache

1º Actualizamos la lista de paquetes.

sudo apt-get update

2º Actualizamos los paquetes.

sudo apt-get upgrade

3º En caso de que ejecutando el comando anterior no se haya actualizado el php es porque posiblemente no hemos añadido el paquete de PHP. Lo haremos de la siguiente forma:

sudo apt-add-repository ppa:ondrej/php

4º Volvemos a ejecutar “sudo apt-get update” y posteriormente instalamos la versión de php que queramos

  • Para PHP 5.5 sudo apt-get install php5.5
  • Para PHP 5.6 sudo apt-get install php5.6
  • Para PHP 7 sudo apt-get install php7.0

Paso para la instalación por CGI de PHP

Descargamos la versión que queramos de PHP (en nuestro caso la 7.06)

2º A través de ftp subimos los archivos a una ruta. En nuestro caso será /usr/local/php706/.

Modificamos el archivo /etc/apache2/sites-available/default

En nuestro caso nos quedó de la siguiente manera:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName blablabla.yises.com
  DocumentRoot /var/www

  <Directory /usr/local/php706/bin>
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>

  ScriptAlias /php706-cgi /usr/local/php706/bin

  <Directory /var/www>
    Action php706-cgi /php706-cgi/php-cgi
    AddHandler php706-cgi .php
    <FilesMatch "\.php$">
      SetHandler php706-cgi
    </FilesMatch>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/access.log combined

  Alias /doc/ "/usr/share/doc/"
  <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>
</VirtualHost>

4º Reiniciamos el servicio de apache

sudo service apache2 restart

Notas importantes:

  • Puede que sea necesario añadir algunos módulos para que funcione correctamente. Por ejemplo:
sudo a2enmod rewrite
  • Se puede ver los mods disponibles en la ruta /etc/apache2/mods-available y los habilitados en /etc/apache2/mods-enabled
  • Normalmente los errores que nos vayan apareciendo se encontrarán en /var/log/apache2/error.log

WordPress – Cómo mostrar el número de visitas a un post sin utilizar un plugin

Hoy mostraremos una forma de realizar el conteo de las visitas en los diferentes posts que tengamos en un blog de wordpress usando el “post meta” que proporciona wordpress

Paso 1 – Incluir en el functions.php el siguientes código.

function getPostViews($postID){
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0";
    }
    return $count;
}
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
// Remove issues with prefetching adding extra views
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

Paso 2 – Incluir en la página single.php el siguiente código (permitirá almacenar una visita al post, hará uso del código que hemos incluido en el paso 1).

<?php setPostViews(get_the_ID()); ?>

Paso 3 – Incluir en la página single.php dentro del bucle del fichero el siguiente código (permite visualizar dicho número de visitas.

<?php echo getPostViews(get_the_ID());?>

En mi caso por ejemplo el código que he introducido dentro del single.php es el siguiente (el tema incluye font-awesome)

<li><i class="fa fa-eye"></i><span><?php echo getPostViews(get_the_ID()).' visitas'; ?><span></li>

Tomada esta información de este link y ligeramente modificada para su correcta visualización

Yii2 – Como desarrollar una aplicación multilenguaje

Hace ya tiempo hablamos de cómo desarrollar una aplicación multilenguaje para yii versión 1, y hoy os traemos los pasos para realizarlo con la versión yii2:

Básicamente hay que seguir los siguientes pasos:

1 – Abrir una línea de comandos (cmd) y acceder a la raíz de nuestro proyecto. Y una vez ahí incluir la siguiente orden. Esto generará un archivo dentro de la ruta config/ llamado i18n.php, que será el que contenga los valores globales de la internacionalización.

yii message/config @app/config/i18n.php

2 – Tendremos que modificar la línea languages indicando los idiomas que queramos:

'languages' => ['es_ES','en_US'],

3 – También será necesario modificar el sourcePath y el messagePath con los siguiente valores:

'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',

4 – Será necesario crear la carpeta messages en el directorio raíz de la aplicación.
5 – Incluir dentro del congif/web.php la siguientes líneas dentro de components (en caso de que no se haga sólo se podrán introducir traducciones en el fichero app)

'i18n' => [
        'translations' => [
            '*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en',
                'fileMap' => [
                    //'main' => 'main.php',
                ],
            ],
        ],
    ],

6 – Una vez tengamos eso, tendremos que generar los ficheros de dichos idiomas (o cuando queramos actualizarlos). Para ello es necesario ejecutar:

yii message/extract @app/config/i18n.php

Recomendación:
En config/i18n.php si queréis que el extract de todos los mensajes vaya más rápido podéis introducir un except de los vender.

Yii2 – Redirecciones y Htaccess

Hoy toca incluir cómo hacer las redirecciones y htaccess en yii2 para que fácilmente se puedan hacer urls amigables. Lo saqué de está página (aunque hay unas modificaciones mías en el archivo web.php).

Básicamente es necesario hacer 3 pasos (recordar que {root} es el lugar donde hemos creado la plantilla básica:

Paso 1: Crear fichero {root}/.htaccess (para redireccionarlo todo a la carpeta web menos aquellos ficheros o directorios que existan)

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
 RewriteCond %{REQUEST_URI} ^/.*
 RewriteRule ^(.*)$ web/$1 [L]
 RewriteCond %{REQUEST_URI} !^/web/
 RewriteCond %{REQUEST_FILENAME} !-f [OR]
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^.*$ web/index.php
</IfModule>

Paso 2: Crear fichero {root}/web/.htaccess (para que pase todo por el index.php, menos como en el caso anterior aquellos ficheros o directorios que existan)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Paso 3: Actualizar fichero {root}/config/web.php (indicar a yii2 que se van a mostrar urls amigables y definir las primeras reglas). Estas reglas te permitirán también pasar un parámetro por get.

'request' => [
    'baseUrl' => '',
],
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '' => 'site/index',
        //'<action>'=>'site/<action>',
        '<controller:\w+>/<id:\d+>'=>'<controller>/view',
        '<controller:\w+><action:\w+>/<id:\d+>'=>'<controller>/<action>',
        '<controller:\w+><action:\w+>'=>'<controller>/<action>',
    ],
],

Yii2 vs Laravel 5

La eterna lucha entre diferentes frameworks… hoy la llevaremos al terreno de yii vs Laravel. Dejar claro que simplemente expondremos los puntos fuertes y débiles de cada uno, para ciertos aspectos de la programación puede que no sea importante o puede que sea vital que uno permita ciertas cosas y el otro no, pero eso ya es cosa de cada uno 😉

yii2-vs-laravel5

Laravel 5

Ventajas

  • Tiene un core muy sencillo, con componentes muy intuitivos.
  • Mucha gente escribe acerca ello (tiene una comunidad mayor a Yii2).
  • Utiliza componentes de frameworks muy tradicionales, como Symphony
  • Las últimas prácticas de programación en PHP son incorporadas en nuevas versiones.
  • Muy buena velocidad de procesamiento sin necesidad de instalar extensiones externas

Debilidades

  • No hay continuidad entre versiones. Si tenéis algo en Laravel 4 y lo queréis pasar al 5 todo cascará y tendréis que reprogramar (para mi esto es un handicap muy MUY grande).
  • Los generadores automáticos de código son demasiado básicos. Es más rápido el copia pega de otros sitios.
  • No hay generación estandar de vistas. Puedes dedicar horas de crear código antes de poder probarlo.
  • El sistema de autenticación está un poco incompleto (faltan roles, hay que definir cosas manualmente)
  • Al no utilizar las extensiones componentes nativos de Laravel eso significará que habrá redundancia de código.

Yii 2

Fortalezas

  • Se puede instalar descargándote un zip. Ni composer ni otros gestores de paquetes.
  • Tiene una generación CRUD con vistas, controladores, funciones de búsqueda, modelos,…
  • Tiene una autenticación montada con roles y permisos.
  • Permite crear widgets específicos y propios para PHP/HTML snippets.
  • Widgets internos que permiten hacer renders de tablas con HTML plano o usando vistas dinámicas en AJAX
  • Barra de debug donde te dice estadísticas e información a lo largo de la ejecución de código.
  • Tiene una gran documentación oficial.
  • En su web están centralizados muchos recursos.

Debilidades

  • Hay menos contribuciones de usuarios que en laravel (y también menos extensiones a la venta).
  • La versión 2 es todavía bastante nueva y le faltan para mi gusto bastantes manuales.
  • Yii2 es más o menos similar a Yii1 pero aun así hay que modificar varias cosas para que una aplicación de la primera versión de Yii funcione en la segunda.
  • El código de PHP parecerá más contaminado por el uso siempre de arrays en vez de objetos con sus propiedades.

Y eso es todo amigos, ¿cuál de los dos prefieres?

require vs include vs require_once vs include_once

Es muy normal el ir separando código PHP en varios ficheros y, dependiendo de qué necesites ir llamándolos a unos o a otros. Y esto, ¿cómo se hace? Pues muy fácil, puedes utilizar las siguientes funciones

require(“ruta_al_archivo/archivo.php”)
include(“ruta_al_archivo/archivo.php”)
require_once(“ruta_al_archivo/archivo.php”)
include_once(“ruta_al_archivo/archivo.php”)

Todas nos importarán el código de ese archivo PHP, pero ¿qué diferencia hay entre ellas?

require() vs include()

php include vs require

Las dos funciones insertan el contenido, pero require() establece que el código del archivo invocado es requerido, es decir, es totalmente obligatorio para que funcione. Si no se encuentra dicho fichero nos mostrará un “PHP Fatal error” y parará de funcionar. Por el contrario, lo que pasará con include() si no se encuentra dicho código es que saltará un error tipo “Warning” y el programa seguirá ejecutándose.

Lo normal es utilizar require(), puesto que si introducimos algo es porque queremos usarlo.

require_once()/include_once() vs require()/include()

require_once() e include_once() funcionan de la misma forma que sus respectivos (sin el _once). La diferencia está en que sólo te permite la carga del mismo archivo una única vez.

Este código cargará dos veces archivo1.php

require(archivo1.php);
require(archivo1.php);

Mientras que este otro carga una única vez el archivo1.php

require_once(archivo1.php);
require_once(archivo1.php);

Es conveniente usar las funciones con _once para evitar redeclarar variables, funciones o clases, aunque consumen más recursos.

Día de hackaton (Edición 1, Marzo 2015)

Hoy tengo día libre, y ¿qué significa eso? Pues que lo voy a dedicar a realizar una idea que me lleva rondando la cabeza y que me hará la vida más fácil.

La idea en cuestión es simple, necesito una herramienta que, después de seleccionar varias recetas con el número de personas para los cuales quiero hacerlo, que me diga qué tengo que comprar en el supermercado juntando todos los ingredientes.

Esta idea tiene dos objetivos:

  • Sacar dicha idea y facilitarme la vida cada vez que voy al supermercado, en donde no se qué comprar y tardo muchísimo.
  • Aprender tecnologías que no utilizo, como pueden ser backbone.js, foundation,…

¿Qué pasos he de seguir para llevar a cabo mi idea?

  1. Primero necesito saber las pantallas principales que tendrá mi aplicación. En mi caso son fundamentalmente 2: La de la lista de recetas y la del listado de ingredientes a comprar. Como podéis ver deliberadamente me he dejado tanto la parte de gestión de usuarios como de introducción de recetas,… Al final lo que buscamos es el producto mínimo viable, y a partir de ahí ya iremos añadiendo funcionalidades si realmente tenemos tiempo. (9:00-9:15)
  2. Base de datos: Utilizaré mysql. Escribo en una hoja de papel o mediante el MySQL Workbench (gratuito) un esquema simple de cómo irá y de las relaciones de cada una de las tablas. Escribir un registro en cada tabla para hacer pruebas. (9:15-9:45)
  3. Instalar el framework MVC que utilizaré. He intentado utilizar symfony, pero no tengo una versión 5.4 o posterior de php, como lo cual me decantaré por yii (ya lo utilizo diariamente, con lo cual no me pillará de nuevas). Primeramente habrá que instalarlo, después pasarle el generador automático de modelos. (9:45-10:15)
  4. Empezar a crear la pantallas básica, sin nada gráfico (10:15-11:15)
  5. Hacer el API en sí. En principio tendré 4 funciones(que después por supuesto aumentarán): Función de tomar recetas y de buscar por un texto recetas (GET), recibiendo las recetas que queremos llevar a cabo juntar todos sus ingredientes y guardar el listado de elementos (POST), tomar el listado de ingredientes totales (GET). Aquí es en donde me encuentro con el primer desafío, entender qué es backbone js, ver cómo hacer peticiones get mediante este framework y ver como almacenar igualmente datos (11:15-14:15).

Resultado

Al final he conseguido tener las páginas y el funcionamiento hecho, aunque sin diseño alguno y todo de forma muy muy básica. Es una aplicación que tendré que mejorar muchísimo y que tendrá dos partes principales en una primera etapa, una de ellas es la de introducir más recetas y otra de ellas es la de darle un mínimo diseño.

Conforme pasen los días y lo mejore un poco pondré capturas de pantalla (ahora mismo me daría vergüenza hacerlo.

Problemas que me he encontrado

Backbone js: Me lo imaginaba más sencillo e intuitivo. Es cierto que se pueden hacer cosas interesantes, pero en el momento en que te sales un poco del standar (lo único que intentaba hacer era una vista de una colección) se complica un poco.

Como habilitar peticiones ajax en el yii2

Este es el estado: desde un js estoy realizando una petición post a un servidor yii2 (del modelo avanzado, el que tiene backend y frontend). Y el problema que me encontraba era que siempre me daba un CSRF (). En la versión 1 de yii no había ese problema puesto que por defecto no estaba habilitado, pero ahora así.

¿Cómo se deshabilita entonces el CSRF en el yii2?
Es algo muy simple, y se puede hacer de dos formas diferentes:

Forma 1: Sólo un controlador.
Es necesario entrar en el controlador en cuestión, y en la función beforeAction simplemente pegaremos este trozo de código:

public function beforeAction($event){
    $this->enableCsrfValidation = false;
    return true;
}

 

Forma 2: Toda la aplicación
Accediendo al main.php de la aplicación añadiremos dentro de components las líneas:

'request' => [
    'enableCsrfValidation' => false,
],

Una vez realizado ya funcionará todo correctamente y el javascript en cuestión recibirá los datos que le enviemos

Yii2 vs Yii

Como sabéis hace menos de un mes ha aparecido el nuevo framework yii2 en versión beta (hasta ahora estaba en versión alfa), y me han pedido que investigue más acerca de él. Hasta ahora había trabajado muy bien con yii, y la verdad, es que temblaba al pensar en los cambios que podían haberse sucedido. Como no he encontrado ningún post referente a yii2 en español (tampoco he encontrado ninguno en inglés con las diferencias entre la anterior versión y la nueva) pues me he aventurado a crear el post.

¿Donde puedo descargarme el yii2?
Muy fácil, en la web http://www.yiiframework.com/download/, veréis primeramente la versión estable 1.1.XX y más abajo la versión 2. Se puede descargar vía Composer o bien descargarse un archivo y deszipearlo donde deseeis.

¿Qué diferencias hay entre el yii y el yii2?

  • PHP: Yii 2.0 requiere PHP 5.4.0 o superior, y es que hace uso de las últimas características de PHP como los namespaces (forma de encapsular objetos), traits (sirve para reutilizar series de métodos en diferentes clases sin necesidad de extender o implementar, ver este artículo)
  • Yii 2.0 ha sido reescrito totalmente por lo cual se necesitará un proceso de migrado de las aplicaciones que estén en Yii 1.
  • La carpeta protected….. ha desaparecido, pero se encuentran gran parte de las carpetas que utilizabamos hasta ahora.
  • Actualmente hay dos modelos de yii2 que pueden descargarse, el básico (imaginaos algo más o menos similar al yii1) y el avanzado (imaginaos que tenéis 3 tipos de MVC, los del frontend, los del backend y los que se utilizan tanto en el front como en el back).
  • La forma de instalación hasta ahora es vía Composer, con lo cual toca instalarlo… si puedes (digo si puedes porque es muy fácil en linux, pero en Windows podéis temblar bien). Otra opción vía rápida es coger la aplicación básica o la avanzada y utilizarla para vuestros propósitos.

Entrando más en detalle de diferencias entre yii y yii2.

  • CcComponent: Yii 2.0 divide el CComponent en dos clases yii\base\Object(Permite definir propiedades de clase por medio de getters y setters) y yii\base\Component (extiende de Object y contiene los eventos y behavior)
  • Eventos: Ya no es necesario definir para los eventos un método on. Puedes utilizar cualquier nombre de evento. Eso sí, para adjuntar un handler a ese evento, si debes usar ese on method.
  • Alias para paths: En yii2 se ha dado más uso de los alias path
  • Render: Antes para mostrar una vista teníamos que simplemente llamar a render() o a renderPartial() pero ahora tenemos que hacer un echo de esto.
  • Console Applications: Las aplicaciones de consola están compuestas por controladoras.
  • Las extensiones de yii 1.1 no son compatibles con la versión 2.0
  • Y muchas más que podréis ver en la página oficial.

Para cualquier dato este es el link para la “Guía Definitiva del Yii 2.0”.

Cómo hacer notificaciones iOS y su script PHP

Aquí os traigo un script en PHP para el envío de notificaciones a un dispositivo iOS.  Tendréis que previamente:

  1. Permitir que la aplicación pueda tener notificaciones. Para el caso de phonegap utilicé este plugin
  2. Generar el archivo ck.pem (Ese archivo ck.pem se generará con una $passphrase determinada). Este paso es el infierno de todos, aquí podéis obtener más información de como realizarlo.
  3. Instalar la aplicación en vuestro dispositivo, os aparecerá un cuadro que preguntará si queréis recibir notificaciones de la aplicación o no.
  4. De alguna forma enviar el ID de vuestro iphone o de vuestro ipad ($deviceToken) a vuestro servidor.
  5. Sustituir las variables $deviceToken y $passphrase así como incluir en vuestro servidor vuestro propio ck.pem

 

 

// Put your device token here (without spaces):
$deviceToken = 'XXXXXXXXXXXXXX';

// Put your private key's passphrase here:
$passphrase = 'XXXXXXXXXXXXXXX';

// Put your alert message here:
$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
	'ssl://gateway.sandbox.push.apple.com:2195', $err,
	$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
	exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
	'alert' => $message,
	'sound' => 'default'
	);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
	echo 'Message not delivered' . PHP_EOL;
else
	echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

Nota: Como veréis se comunica con el sandbox de apple, con el entorno de pruebas. Al pasar a producción será necesario poner el entorno correspondiente.