Archive for the ‘PHP’ Category

Excepcions personalitzades en PHP

dimecres, juliol 18th, 2012

L’altre dia la meva amiga Laura em demanava quin objectiu més enllà de capturar errors tenen les Exception.

Li vaig comentar que a més d’atrapar errors no esperats (com que el servidor de la base de dades no respongui) també permet que l’aplicació s’enviï missatges.

Així que ara ho vaig a desenvolupar una mica.

Laura, et dedico aquest article. ;)

Agafem un exemple pràctic.

Tenim una classe que treballa amb moneda.

class Moneda
{
}

Al constructor li passem el codi de moneda:

$o_moneda_gbp = new Moneda('GBP');

Al constructor de la classe Moneda es comprova que existeixi dins l’array de monedes:

class Moneda
{

    public $st_monedes_suportades = array('EUR' => array ('activa'         => true,
                                                          'nom_ca'         => 'Euro',
                                                          'canvi_a_euros'  => 1),
                                          'USD' => array ('activa'         => true,
                                                          'nom_ca'         => 'Dòlars',
                                                          'canvi_a_euros'  => 0.82671)
                                              );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]) || 
            $this->st_monedes_suportades[$s_id_moneda]['activa'] != true) 
        {
            // Aquí hem de notificar que no hem pogut localitzar la moneda
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

És en aquest moment que volem notificar a qui crida la classe Moneda que no podem procedir amb la operació que ens demanaven.
És en aquest moment en que intervenen i tenen sentit les Exceptions, i encara més les Custom Exceptions, que són Exceptions personalitzades.

Primer de tot definirem dues exepcions personalitzades:

class MonedaNoSuportadaException extends Exception {}
class MonedaNoActivaException extends Exception {}

class Moneda
{

    public $st_monedes_suportades = array('EUR' => array ('activa'         => true,
                                                          'nom_ca'         => 'Euro',
                                                          'canvi_a_euros' => 1),
                                          'USD' => array ('activa'         => true,
                                                          'nom_ca'         => 'Dòlars',
                                                          'canvi_a_euros'  => 0.82671)
                                          );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]))
        {
            throw new MonedaNoSuportadaException('La moneda '.$s_id_moneda.' no se suporta');
        }

        if ($this->st_monedes_suportades[$s_id_moneda]['activa'] != true)
	{
            throw new MonedaNoActivaException('La moneda '.$s_id_moneda.' es troba inactiva');
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

Llavors només manca instanciar la classe amb un try catch

try {
	$o_moneda_eur = new Moneda('EUR');
} catch (MonedaNoSuportadaException $e) {
	die($e->getMessage);
} catch (MonedaNoActivaException $e) {
	die($e->getMessage);
} catch (Exception $e) {
	// Excepció no esperada
	die($e->getMessage);
}

El codi final:

<?php
/**
 * Created by Carles de http://www.codic.cat
 * User: carles
 * Date: 17/07/12
 * Time: 23:16
 */

class MonedaNoSuportadaException extends Exception {}
class MonedaNoActivaException extends Exception {}

class Moneda
{

    public $st_monedes_suportades = array(  'EUR' => array ('activa'         => true,
                                                            'nom_ca'         => 'Euro',
                                                            'canvi_en_euros' => 1),
                                            'USD' => array ('activa'         => true,
                                                            'nom_ca'         => 'Dòlars',
                                                            'canvi_en_euros' => 0.82671)
                                            );

    protected $s_id_moneda = '';

    public function __construct($s_id_moneda = 'EUR')
    {
        if (!isset($this->st_monedes_suportades[$s_id_moneda]))
        {
            throw new MonedaNoSuportadaException('La moneda '.$s_id_moneda.' no se suporta');
        }

        if ($this->st_monedes_suportades[$s_id_moneda]['activa'] != true)
        {
            throw new MonedaNoActivaException('La moneda '.$s_id_moneda.' es troba inactiva');
        }

        $this->s_id_moneda = $s_id_moneda;

    }

}

try {
        $o_moneda_eur = new Moneda('EUR');
} catch (MonedaNoSuportadaException $e) {
        die($e->getMessage());
} catch (MonedaNoActivaException $e) {
        die($e->getMessage());
} catch (Exception $e) {
        // Excepció no esperada
        die($e->getMessage());
}

Alliberat PHPStorm

dijous, juliol 5th, 2012

Avui s’ha alliberat la versió 4.0.3 (release 117.694) d’aquest genial programari IDE (Entorn de Desenvolupament Integrat).

Alliberat Sublime 2

dimecres, juny 27th, 2012

Ahir va ser alliberat el magnífic editor Sublime Text 2.

Sublime 2 és un editor molt lleuger, escrit en Python, i que va molt bé per a programar en PHP especialment en projectes tan grans que l’Eclipse rebenta.

No té tantes funcionalitats, però és un gran editor i sobretot molt ràpid.

Està disponible per a Linux, mac, i windows.

Smarty Debug

divendres, maig 11th, 2012

Si programeu plantilles (templates) d’Smarty hi ha una comanda que us anirà molt bé:

{debug}

Si poseu aquesta comanda al principi de la plana, obre una finestra nova amb les variables declarades i els seus valors.

Alliberat PHP 5.4.3 i 5.3.13

dimecres, maig 9th, 2012

Tal i com ens informa la web oficial de PHP s’han alliberat dues versions noves de PHP per a solucionar un forat de seguretat relacionat amb la configuració del producte en mode CGI.

És recomanable actualitzar tant aviat com us sigui possible.

http://www.php.net/archive/2012.php#id2012-05-08-1

Compilar PHP 5.4 a Ubuntu Linux 12.04

divendres, maig 4th, 2012

PHP 5.4 no està disponible encara compilat per a Ubuntu Linux 12.04 Precise Pangolin.

Per tant, si volem instal·lar-lo al nostre sistema, n’haurem de baixar els codis font des de php.net i compilar-los.

Per a fer-ho anirem a www.php.net i baixarem els codis fonts de PHP 5.4.

Descomprimim l’arxiu i des de terminal li diem:

./configure

Si obtenim l’error:

configure: error: xml2-config not found. Please check your libxml2 installation

Vol dir que no tenim l’arxiu xml2-config, que per canvis a Ubuntu 12.4 no s’instal·la.

L’instal·larem amb:

sudo apt-get install libxml2-dev

Llavors tornarem a fer:

./configure

Un cop fet correctament farem

./make

I això ens haurà generat dins de la carpeta sapi/cli l’arxiu php binari.

Si volem també podem fer:

./make test

Que verifica la nostra instal·lació i si detecta problemes ens demana d’enviar-ho als creadors, per a localitzar el problema.

 

Excerpt in English: How to install PHP 5.4 in Ubuntu 12.04 Precise Pangolin by compiling it.

Inserir un text a la segona línia d’un arxiu (Shell Script)

dilluns, març 26th, 2012

Avui estava automatitzant un procès per tal que en canviar de branca del SVN, a l’entorn de desenvolupant, m’afegís una línea extra al bootstrap del projecte PHP en que treballo.

Bàsicament l’arxiu original fa:

<?php
/**************
  Comentaris
 **************/

I jo volia que fes:

<?php
require_once "classes_prova/TestUtilitats.php";
/**************
  Comentaris
 **************/

Com ho he realitzat ha estat emprant aquestes línies de Shell Scripting:

awk 'NR==1{print; print "require_once \"/www/projectes/classes_prova/TestUtilitats.php\";"} NR!=1' /www/projectes/projecte_x/app/index.php > /www/projectes/projecte_x/app/index.php.2
mv /www/projectes/projecte_x/app/index.php /www/projectes/projecte_x/app/index.php-default
mv /www/projectes/projecte_x/app/index.php.2 /www/projectes/projecte_x/app/index.php
chown apache /www/projectes/projecte_x/app/index.php

Avançament de les característiques de xdebug 2.2 (PHP)

dijous, març 22nd, 2012

Al bloc de Derick Rethans ens avancen algunes de les novetats de la funcionalitat xdebug_var_dump() , que per cert sobrecarrega la nadiva var_dump, de xdebug 2.2, actualment en desenvolupament.

M’agrada especialment la funcionalitat de mostrar colors d’un dump (volcat de dades) a un terminal.

Aquesta funcionalitat és suportada només a consoles unix, executant des de línia de comandes.

Curs de formació PHP

divendres, març 2nd, 2012

Estic a punt de començar a impartir un curs nocturn per a ser Programador Junior en PHP.

El curs que començo a donar el 12 de Març, és molt pràctic i està orientat a persones que treballen o estiguin en situació d’atur i que vulguin fer-se una carrera en el món de la informàtica, encara que també se’n poden beneficiar emprenedors que vulguin programar els projectes per la seva banda.

Es tracta d’una formació presencial, a Barcelona, de 20:00 a 22:00 hores de dilluns a dijous, i té una durada d’un mes.

Ofereixo facilitats de pagament.

Si esteu interessats/des o voleu rebre més informació contacteu-me.

Alliberat Sublime Text 2 (beta) build 2181

dijous, febrer 23rd, 2012

S’ha alliberat la versió 2181 de Sublime Text Editor 2.

Aquesta versió està disponible en beta (encara no és versió final).

L’editor Sublime és un entorn de programació (IDE) per a programar en diferents llenguatges.

És molt lleuger, ja que està escrit en Python i no pas en Java com es fa habitualment, i és multiplataforma.

Es troba disponible per a:

Linux 32 bit

Linux 64 bit

Mac Os X

windows 32

windows 64 bit

Aquest programa no és Programari Lliure si no que demanen que si s’utilitza es registri. Nogensmenys té un preu baix.

Bàsicament aquesta versió presenta millores, encara que segueix sense poder-se imprimir i la súper útil funcionalitat Ctrl + el nom del mètode o la variable, tampoc no està implementat.

El podeu descarregar des de la seva web:

http://www.sublimetext.com/download

sshfs muntar una carpeta a través de ssh

divendres, febrer 3rd, 2012

En Linux muntar una carpeta de servidor per Samba i treballar-hi amb projectes de PHP, suposa alguns problemes.

En primer lloc és molt lent i nombrosos programes perden molta estona, minuts, en recuperar els arxius d’un directori.

Després no està gens recomanat per a Subversion.

A part hi ha problemes de permisos entre usuaris de Linux, i sovint problemes amb la data i hora dels arxius al repositori Samba.

I suposa greus problemes si unim Samba + SVN + PhpStorm.

Aquests problemes desapareixen si enlloc de Samba utilitzem sshfs, que és una utilitat que ens permet muntar carpetes al nostre sistema d’arxius, tenint simplement un usuari ssh.

Jo tinc m’he fet un petit script o guió, que em munta una carpeta cada cop que el crido:

#!/bin/sh
usuari_devel=carles
sshfs $usuari_devel@devel.servidor.codic.cat:/home/OFICINES/$usuari_devel /home/$usuari_devel/devel

Per a instal·lar-lo:

sudo apt-get install sshfs

Gràcies Xavier Vidal.

Li vaig trobar un problema, que és quan poses l’ordinador en modus de suspensió (sleep/suspend), ja que després no pots accedir a la carpeta, ni desmuntar, ni tornar a muntar-la amb sshfs.

L’he pogut solucionar fent:

fusermount -u $mountpoint_devel

tot just abans de suspendre l’ordinador.
En tornar-lo a iniciar després, caldrà obrir una connexió ssh cap al servidor manualment (ssh elmeuservidor), i després podem tornar a llençar sshfs per a muntar la carpeta.

PHP: Afegir arrays

dijous, gener 19th, 2012

Suposem que tenim un array amb codis postals.

Pe:

$st_codis_postals = array('08021' => 'Barcelona',

25520 => 'El Point de Suert (Lleida)',

17452 => 'Massanes (Girona)',

// I així successivament

);

Llavors volem afegir una entrada en la primera posició, ja que una plantilla d’Smarty utilitzarà l’array per a mostrar un combo.

Si afegim la clau 0, el que tindríem és:

‘08021’ => ‘Barcelona’,

25520 => ‘El Pont de Suert (Lleida)’,

17452 => ‘Massanes (Girona)’,

0 => ‘Triï la població’

Però les funcions que podem utilitzar per a fer un merge entre arrays o fer a afegir a la primera posició provoquen una reordenació de les claus numèriques.

Per tant no les podem fer servir, i fer servir un bucle per a això és exagerat i ineficient.

La solució, bastant simple, és fer:

$st_array_definitiva = array(0 => ‘Triï la població’) + $st_codis_postals;

Això farà la feina.

Només heu de vigilar de no tenir claus repetides ja que + afegeix les claus que no estan repetides.

Emprar JQuery i Smarty

dimecres, gener 11th, 2012

JQuery és empradísism a Internet per a desenvolupar la part visual, coneguda com Front-End, i Smarty és un sistema de plantilles que s’empra molt en programació en PHP.

JQuery empra una nomenclatura tipus:

<script> 
    $('metode_pagament').click(
        function() { 
            $('capa_tarjeta').appendTo('#capa_tipus_pagament'); 
        }
      ); 
</script>

Aquest codi dins una plantilla d’Smarty, coneguda com tpl, provocarà un error ja que els corxets { } són emprats per Smarty per a indicar on comença codi que executa Smarty, i com JQuery o Javascript empren els corxets { } això confondrà a l’intèrpret, retornant un error.

Això se soluciona facilment obrint una etiqueta d’Smarty {literal}:

{literal}
<script> 
    $('metode_pagament').click(
        function() { 
            $('capa_tarjeta').appendTo('#capa_tipus_pagament'); 
        }
      ); 
</script>
{/literal}

Amb això funcionarà el vostre codi.

Debuguejar codi PHP de servidor

dijous, desembre 29th, 2011

A partir de PHP 5.3 tenim una funció molt pràctica que ens permet debuguejar, especialment al costat servidor.

Es tracta de register_tick_function.

Aquesta funcionalitat ens permetrà fer una crida a tick_handler, cada interval especificat per el número de ticks, i d’aquesta manera podrem tracejar en quin moment peten els programes més difícils de debuguejar o que casquen perquè falla nginx, un altre component o llibreria o perquè s’omple la memòria.

declare(ticks=1);

// Una funció que es crida a cada esdeveniment tick
function tick_handler()
{
    $st_traces_de_debug = debug_backtrace();

    // FileUtils és una classe meva per a treballar en arxius
    // En aquest cas enregistrarem l'arxiu i el número de línia que s'ha executat correctament
    FileUtils::setMessageLog($st_traces_de_debug[1]['file'] . ' ' .$st_traces_de_debug[1]['line']);
}

register_tick_function('tick_handler');

Si us va millor enlloc d’usar un mètode com al meu exemple_ setMessageLog de la classe FileUtils, podeu fer servir una funció disponible al mateix codi com en aquest exemple:

function escriu_a_arxiu_log($s_cadena = '/* res a escriure */', $s_file = '/tmp/carles-debug.log')
{
    $s_datahora = date("Y-m-d h:i:s");

    $o_fh = fopen($s_file, 'a') or die("no puc obrir l'arxiu");
    fwrite($o_fh, $s_datahora.' '.$s_cadena."\n");
    fclose($o_fh);
}

// Per a invocar la funció
escriu_a_arxiu_log('Test');

D’aquesta manera anem enregistrant totes les comandes que s’executen correctament.

Agraïments: Edu.

Facebook allibera Hip Hop PHP Virtual Machine per a duplicar el rendiment de PHP

dimecres, desembre 14th, 2011

Facebook ha desenvolupat un producte anomenat Hip Hop PHP Virtual Machine, que permet duplicar el rendiment del seu codi PHP.

D’aquesta manera els mateixos servidors han pogut doblar en rendiment dels servidors.

Si tens milers de servidors, això comporta un estalvi milionari en servidors i electricitat.

A més a més han alliberat el seu producte com a Programari Lliure (Open Source)

Nota de Facebook.

Vist a Ars Technica.