Los frameworks de php más rápidos, benchmark 2017

Read More
Gráfica del benchmark de frameworks php

¿Qué es un benchmark ? Según Wikipedia, técnica utilizada para medir el rendimiento de un sistema o componente del mismo …

Anteriormente ya publicamos benchmarks con diferentes frameworks php en el blog y wiki, pero ya son antiguos. Esta vez usaremos los datos de una comparativa independiente, que emplea versiones actualizadas de los frameworks.

Estos datos de rendimiento son resultado de un trabajo serio y bien hecho de Kenjis en Github, podéis ver todo el código. En el link pueden encontrar todo el código, ejecutarlo en sus propios ordenadores y ver las gráficas interactivas con mucha información. Además encontrarán los datos del equipo que se usó, incluyendo notas. Finalmente pueden aportar pasando un pull request o indicando un error.

Resultados del benchmark de Kenjis, realizado el 14 de febrero de 2017.

Comparativa de velocidad de los frameworks php

framework respuestas por sEGUNDO relativo Uso de Memoria relativo
siler-0.6 2,069.69 20.3 0.25 1.0
kumbia-1.0-dev 1,753.60 17.2 0.29 1.2
staticphp-0.9 1,665.28 16.3 0.27 1.1
phalcon-2.0 1,618.39 15.9 0.26 1.1
tipsy-0.10 1,376.97 13.5 0.32 1.3
fatfree-3.5 965.16 9.5 0.41 1.7
ci-3.0 753.09 7.4 0.42 1.7
nofuss-1.2 667.24 6.5 0.40 1.6
slim-3.0 550.43 5.4 0.61 2.5
bear-1.0 502.52 4.9 0.73 3.0
lumen-5.1 415.57 4.1 0.85 3.5
yii-2.0 410.08 4.0 1.32 5.4
ze-1.0 403.34 4.0 0.75 3.1
cygnite-1.3 369.12 3.6 0.71 2.9
fuel-1.8 344.26 3.4 0.63 2.6
silex-2.0 342.81 3.4 0.78 3.2
phpixie-3.2 267.24 2.6 1.25 5.1
aura-2.0 233.54 2.3 0.88 3.6
cake-3.2 174.91 1.7 1.95 7.9
zf-3.0 133.87 1.3 2.24 9.1
symfony-3.0 131.50 1.3 2.18 8.9
laravel-5.3 101.94 1.0 2.83 11.5

Continue reading “Los frameworks de php más rápidos, benchmark 2017”

Webs hechas con KumbiaPHP desde Argentina

Les presento dos sitios webs argentinos hechos con KumbiaPHP framework.

Simetra Service SRL

Home page del sitio web de Simetra Service SRL hecho con KumbiaPHP
Home page del sitio web de Simetra Service SRL hecho con KumbiaPHP

Simetra Service SRL es una empresa de construcción y obras civiles en Neuquén, Argentina.

Al momento de realizar este trabajo, la empresa tenia hecho el sitio con uno de esos CMS mundialmente conocidos. Cada semana, había que andar buscando y borrando código ofuscado. Para quitar el aviso que indicaba, que era un sitio que había sufrido un ataque de phishing, cada vez que se ingresaba.

Tratando de sanear este problema, rearmado el sitio web también tenían en mente un rediseño global de la imagen de marca.

Teniendo en cuenta que la frecuencia de cambios de contenidos es muy baja, se optó por realizar un sitio completamente estático. Que tuviese un formulario de contacto. Y otro formulario para poder adjuntar el curriculum vitae mediante el upload de un archivo, y enviarlo por email hacia el departamento de RRHH. Si bien a día de hoy no está activo, el sitio contempla la posibilidad de poder leerlo en inglés, utilizando la internacionalización i18n mediate gettext.

La implementación del diseño responsive fue hecho con el framework css Bootstrap

MIRA SB

Home page del sitio web de MIRASB hecho con KumbiaPHP
Home page del sitio web de MIRASB hecho con KumbiaPHP

Es un proyecto personal que tenemos de hobby con dos amigos camarógrafos más. El eje central es el skateboarding en Neuquén, Argentina. Pero también generamos contenidos de eventos y actividades relacionadas a él.

Con la idea de poder cargar fácilmente los contenidos, se armó un CMS a medida, poniendo el mayor hincapié en la funcionalidad de las galerías. Cada galería se carga aparte de los posts, y puede volver a utilizarse en caso de ser necesaria.

Al momento de visualizar una galería, se puede mostrar una imagen o un listado de imágenes a abrir mediante un lightbox. Para poder hacer esta carga se armó un script de shortcodes, que se agrega como un plugin al editor WYSIWYG.

Los posts se categorizan usando la simple funcionalidad de tags. Para poder realizar búsquedas, se aprovecharon las bondades del motor de base de datos creando índices FULL TEXT.

Reproducimos los vídeos utilizando Vimeo, aunque en algún momento quizás los alojemos en nuestro servidor.

Por último, para el armado del sitio se utilizó una versión simplificada de Bootstrap.

Scaffolding con KumbiaPHP – Modificando comportamientos y contenidos según nuestra necesidad

Read More
Vista index con categoría relacionada como texto

La entrega anterior hablamos acerca del uso de la técnica de Scaffolding para CRUD con KumbiaPHP. Espero que muchos se hayan sorprendido gratamente con la funcionalidad que ciertamente ahorra mucho trabajo rutinario, ya que es altamente flexible.

Para que se entusiasmen, dentro de las posibilidades  tenemos: reescribir métodos y modificar comportamientos en controladores, modificar los archivos de vista, e incluso puedes crear tus propios scaffoldings.
Pero bueno, vamos paso a paso.

Manos a la obra

Vamos a trabajar en base a supuestos. Supongamos que queremos mostrar el nombre de la categoría padre para aquellas categorías que estén anidadas.

Como se ve en la lista, las categorías relacionadas sólo se ven con su identificador.
Por lo tanto, vamos a modificar la fuente de datos que pasamos a la vista Index para que ésta pueda presentar los contenidos respectivos.

En el modelo

Lo que vamos a hacer es crear un método que cumpla con lo que queremos lograr: mostrar el contenido de la tabla de categorías incluyendo el nombre de la categoría padre en aquellas categorías que heredan de otra. De este modo tendremos una modificación como la siguiente:

Archivo: models/categorias.php

<?php

class Categorias extends ActiveRecord 
{

    function getCategorias($page = 1) 
    {
        return $this->paginate(
            'columns: categorias.id, categorias.nombre, cat.nombre as categorias_id, categorias.creada_at, categorias.actualizada_in', 
            'join: left outer join categorias cat on categorias.categorias_id = cat.id',
            "page: $page", 'order: categorias.id desc');
    }

}

En el controlador

El segundo cambio lo haremos desde el controlador, para cargar los cambios que hemos hecho en el modelo. Lo que reemplazaremos (porque es una sobre escritura de index en ScaffoldController) será la función index tal como se muestra a continuación.

Archivo: controllers/categorias_controller.php

<?php
class CategoriasController extends ScaffoldController
{
    public $model = 'categorias';

    public function index($page=1)
    {
        $this->data = (new Categorias)->getCategorias($page);
    }
 
}

Continue reading “Scaffolding con KumbiaPHP – Modificando comportamientos y contenidos según nuestra necesidad”

Scaffolding para CRUD (ABM) sencillos (y no tanto) – primera parte

Read More
Scaffold

Los inicios

Cuando comenzó el fenómeno de los frameworks de desarrollo web, una de sus banderas de lucha estuvo de la mano de los scaffoldings (andamios).

Un scaffold es en sí una técnica que proveen muchos frameworks, con la que podrás tener un gestor de datos para una tabla particular escribiendo una cantidad mínima de código (en KumbiaPHP bastan 7 líneas de código – excluyendo 2 líneas de encabezado php – ).

En mis primeros años de kumbiero comencé creando un controlador para las acciones clásicas de CRUD (Create, Read, Update y Delete), un modelo para apuntar la tabla de la base de datos y al menos 3 archivos de vista (index, agregar y editar).

Para hacer el CRUD de otra tabla copiaba el controlador inicial en el nuevo, luego editaba todo lo que correspondía, y lo mismo hacía para el modelo y las vistas.

Como verán es un trabajo arduo, pero no es tanto trabajo… a menos que tengas más de 10 tablas.

Si pueden hacer el ejercicio de mirar el bosque desde lejos, casi todos los CRUDs creados tienen las mismas acciones, y usan las mismas vistas (con sus leves diferencias).

La iluminación

Fue entonces que un día de IRC (el chat que usábamos antes), los colegas del core de KumbiaPHP me presentaron a ScaffoldController.

Es un amigo silencioso, puesto que está alojado en default/app/libs, pero además es un amigo confiable, pues hereda de AdminController (eso quiere decir que si damos cierta habilidad de autenticación al AdminController, los controllers que hagamos usando ScaffoldController también estarán asegurados).

De la teoría a la acción

Bueno, mucho texto y poca acción (o como versa el dicho “mucho ruido y pocas nueces”).

En nuestro primer ejemplo usaremos la clásica tabla de categorías, con la siguiente estructura:


CREATE TABLE categorias (
 id int(11) NOT NULL AUTO_INCREMENT,
 nombre varchar(200) NOT NULL UNIQUE,
 categorias_id int(11),
 creada_at timestamp,
 actualizada_in timestamp,
 PRIMARY KEY (`id`)
);

Ahora crearemos un modelo llamado Categorias.

Archivo: models/categorias.php


<?php
class Categorias extends ActiveRecord
{
}

Y finalmente (sí, finalmente) añadiremos el controlador CategoriasController.

Archivo: controllers/categoria_controller.php


<?php
class CategoriasController extends ScaffoldController
{
 public $model = 'categorias';
}

Continue reading “Scaffolding para CRUD (ABM) sencillos (y no tanto) – primera parte”

Subir imágenes y datos con el mismo formulario html

Read More
Actualizar foto de perfil
Actualizar foto de perfil

¡Hola Kumbieros! Hoy les traigo un tutorial básico para quienes deseen conocer como subir imágenes y datos con el mismo formulario. Es una pregunta recurrente que hemos tenido en nuestro chat de Slack y no es sencilla de responder por ese medio, por eso les presentaré un ejemplo práctico de la creación y actualización de usuario con foto de perfil.

Crearemos un modelo, un controlador y tres vistas, usaremos la librería Upload incluida en KumbiaPHP para gestionar la subida del archivo. Al final dejo el enlace con el código fuente en un repositorio en Github para que puedan ver el ejemplo completo, incluso descargarlo y ponerlo a funcionar.

Base de datos

Lo primero es la tabla en la base de datos:


CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL DEFAULT '0',
  `email` varchar(255) NOT NULL,
  `photo` varchar(255) DEFAULT 'default.png',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Modelo

Ahora el modelo que hereda de ActiveRecord para que nos de la capacidad de operaciones con la tabla de la base de datos:

Archivo: app/models/user.php


<?php

/**
* Clase para manejar los datos del usuario, tabla 'user'
*/
class User extends ActiveRecord 
{

}

Controlador

Ahora el controlador que nos permitirá pasar y recibir datos de las vistas. Arrancaremos con el listado de usuarios y para esto creamos la función index.

Archivo: app/controllers/user_controller.php


<?php
/**
 * Controlador para las acciones y vistas con el usuario
 */
class UserController extends AppController
{

    public function index()
    {
        $this->data = (new User)->find();
    }
}

Vistas

Y su respectiva vista.

Archivo: app/views/user/index.phtml


<h1>Lista de usuarios</h1>
<?= Html::linkAction('create', 'Crear', 'class="button"') ?>
<?php View::content() ?>
<?php if (count($data)) { ?>
    <table class="u-full-width">
        <thead>
            <tr>            
                <th>Nombre</th>
                <th>Edad</th>
                <th>Correo</th>
                <th>Foto</th>
                <th>Acciones</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($data as $item) { ?>
                <tr>
                    <td><?= $item->name ?></td>
                    <td><?= $item->age ?></td>
                    <td><?= $item->email ?></td>
                    <td><?= $item->photo ?></td>
                    <td><?= Html::linkAction("edit/$item->id", 'Editar') ?> | <?= Html::linkAction("update_photo/$item->id", 'Actualizar foto') ?></td>
                </tr> 
            <?php } ?>        
        </tbody>
    </table>
<?php } else { ?>
    <h2>No hay ningún registro</h2>
<?php } ?>

Continue reading “Subir imágenes y datos con el mismo formulario html”