Posts Tagged ‘PHP’

Solució: Linux problema composer not enough memory

dilluns, juliol 21st, 2014

Si el composer us peta dient que PHP no té prou memòria, la solució és senzilla.

Actualitzeu la quantitat de memòria que pot usar PHP (CLI – des de línia de comandes) a 1GB o sense límit:

vi /etc/php5/cli/php.ini

Sense límit és:

memory_limit = -1

php-ini-memory-limit-limitless

Si no has fet servir abans vi:

Per a esborrar prem: x

Per a inserir prem: i

Per a sortir prem:

<Esc>:wq<Enter>

wq vol dir guardar (write) i sortir (quit)

 

O pots fer servir l’editor: nano

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Smarty: reemplaçar diversos textes en una cadena de text

divendres, octubre 4th, 2013

Si des de Smarty volem fer vàries substitucions en una cadena abans demostrar-la podem encadenar modificadors:

{$variable|replace: 'cadena a cercar':'el que hi posarem'}

Per exemple, partint d’aquesta constant definida des de PHP:

define("INDEX_GIMCAMA","La gimcama comença des de ###ORIGEN_CIUTAT_NOM### (###ORIGEN_PAIS###) - ###ORIGEN_CIUTAT_CODI### a ###DESTINACIO_CIUTAT_NOM### (###DESTINACIO_PAIS###) - (###DESTINACIO_CIUTAT_CODI###) i costa ###PREU### ###SIMBOL_MONEDA###");

Aquest és un petit truc per a pàgines multi-llengua, en que les cadenes es defineixen en diferents idiomes, i s’inclou l’arxiu pertinent (require_once).

I tenim present que hem passat a la plantilla de Smarty les variables pertinents des de PHP:

$smarty->assign('s_origen_ciutat_nom', 'Barcelona');
$smarty->assign('s_origen_pais', 'Catalunya');
$s_codi_moneda = 'CAT';  // Aquí hi aniria EUR, USD... en aquests moments polítics en que Europa no s'ha decantat clarament del costat de la Democràcia, perquè no pensar a fer un nou Estat amb moneda pròpia? ;)
$smarty->assign('s_codi_moneda', $s_codi_moneda);
$smarty->assign('i_decimals', 2);
// etc...

Llavors a la TPL (plantilla) faríem:

{$smarty.const.INDEX_GIMCAMA|replace: '###ORIGEN_CIUTAT_NOM###':$s_origen_ciutat_nom|replace: '###ORIGEN_PAIS###':$s_origen_pais|replace: '###ORIGEN_CIUTAT_CODI###':$s_origen_ciutat_codi|replace: '###DESTINACIO_CIUTAT_NOM###':$s_destinacio_ciutat_nom|replace: '###DESTINACIO_PAIS###':$s_destinacio_pais|replace: '###DESTINACIO_CIUTAT_CODI###':$s_destinacion_ciutat_codi|replace: '###SIMBOL_MONEDA###':$s_simbol_moneda|replace: '###PREU###':{$s_preu|money_format:$s_codi_moneda:$i_decimals}}"

Fixeu-vos com al final reemplaço ###PREU### pel preu amb el modificador (modifier) money_format, passant-li |money_format per a que em doni format amb decimals i separadors de milers, i així acabar-ho de brodar.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberat PHP 5.5.2

dissabte, agost 17th, 2013

Fa unes hores s’ha alliberat PHP 5.5.2.

Aquesta versió soluciona uns 20 errors, inclós un error de seguretat en el mòdul OpenSSL.

Aquí podeu veure tots els canvis a la 5.5.2 (Changelog).

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberat PHP 5.4.18

divendres, agost 16th, 2013

S’ha alliberat la versió 5.4.18 de PHP. Aquesta versió esmena més de 30 bugs.

Si voleu descarregar els binaris per a windows seguiu l’enllaç.

Us recordo que PHP 5.3 va arribar a la fi de la seva vida “end of life” amb la versió 5.3.27 el proppassat 11 de Juliol.

Tanmateix el 18 de Juliol s’alliberà la versió 5.5.1

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberats PHP 5.4.12 i PHP 5.3.22

dilluns, febrer 25th, 2013

php_elephant-4ee7b23-intro-thumb-640xauto-28554El proppassat dia 21 de Febrer van ser alliberades les versions 5.4.12 de PHP i la 5.3.22.

Aquestes noves versions adrecen més de 10 bugs i es recomana totalment actualitzar.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Manquejades del PHP in_array

Dimarts, gener 22nd, 2013

Sempre dic que PHP és un llenguatge que m’agrada molt, i que em diverteixo molt treballant-hi i que un projecte Internet es pot fer diverses vegades més ràpid que en Java.

Ara bé, de la mateixa manera també dic que és ple de problemes, problemes de disseny i errors estúpids.

Avui explicaré quelcom prou poc intuitiu i que us pot portar a greus problemes al vostre codi.

L’ús d’ in_array

Observeu aquest codi:

<?php
$st_array = array(      'nom1' => 0,
                        'nom2' => 1,
                        'nom3' => '2',
                        'nom4' => 'Catalunya Lliure');

echo 'Cas 0:'.in_array('0', $st_array)."\n";
echo 'Cas 1:'.in_array('1', $st_array)."\n";
echo 'Cas 2:'.in_array('2', $st_array)."\n";
echo 'Cas n:'.in_array('n', $st_array)."\n";
echo 'Cas z:'.in_array('z', $st_array)."\n";
echo 'Cas Catalunya:'.in_array('Catalunya', $st_array)."\n";
echo 'Cas num no:'.in_array(3, $st_array)."\n";
echo 'Cas num sí:'.in_array(1, $st_array)."\n";

$st_array2 = array(2,'a','Catalunya Lliure');

echo 'Cas 1a:'.in_array(3, $st_array2)."\n";
echo 'cas 2a:'.in_array(2, $st_array2)."\n";
echo 'cas 3a:'.in_array('2', $st_array2)."\n";
echo 'Cas 4a:'.in_array('Catalunya', $st_array2)."\n";
echo 'Cas 5a:'.in_array('Catalunya Lliure', $st_array2)."\n";

Qualsevol desenvolupador de PHP diria que el resultat que espera és diferent del que rebrà.

Veiem el resultat:

PHP codi problemàtic resultat

Els resultats que he obtingut són els mateixos en sistemes Debian amb 5.3.3:

PHP 5.3.3-7+squeeze14 with Suhosin-Patch (cli) (built: Aug  6 2012 14:18:06)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

En Ubuntu amb 5.3.10:

PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli) (built: Sep 12 2012 18:59:41)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

I en PHP 5.4.10 i en 5.5.0.a.2 executats en aquesta sandbox: http://sandbox.onlinephpfunctions.com/

El resultat és l’esperat* en els casos en que el valor de l’array és numèric, però sembla totalment buggy en el cas de string (el que coneixem com Map a Java o hash a Python).
Veient els exemples hom pensaria que el problema es produeix si els valors assignats a barregen valors numèrics i string, però també si l’array té claus alfanumèriques (‘nom1′ => ‘0’). Aquest últim cas es veu clarament amb l’exemple de cercar ‘Catalunya’ al primer i al segon cas.

Però si tingués un bon amic com el meu amic Edu, us faria adonar que no es tracta de si la clau és alfanumèrica o automàtica, si no que el fet que hi hagi un 0 (zero) com a valor integer, és el que provoca aquest comportament esbojarrat i imprevisible del PHP.

Mirant la documentació del mètode loose de comparació de PHP observem on és el problema.

Encara que sigui contra intuitiu, en el mètode loose qualsevol cadena de text és == a 0 (zero integer).

* Nota: Dic que és l’esperat donat que la documentació de PHP per a in_array ja indica que “Searches haystack for needle using loose comparison unless strict is set.”, és a dir, que fa servir el mètode de comparació loose, en que es considera igual 1 i “1” per exemple.

I aquest és un dels grans problemes de PHP, que degut al sevu comportament intern, a les conversions entre tipus que fa automàticament, viola els principis de programació de fiabilitat**, i porta a situacions en que és altament probable que els programadors generin bugs o es generin bugs que només passen en situacions molt específiques.

** Quan dic que viola el principis de programació de fiabilitat de resultats, em refereixo a coses com:

Expressió Resultat
“Catalunya” == 0 TRUE
“0” == 0 TRUE
“Catalunya” == “0” FALSE

O sigui “Catalunya” == 0 i 0 == “0” però “Catalunya” és diferent de “0”. Epic fail.

Haurem d’utilitzar === que fa la comprovació de tipus també.

La solució universal que farà que els dos casos d’in_array funcionin correctament és emprar el mètode estricte.

Codi que funciona segons s’espera:

<?php 
define('METODE_STRICTE', true); 

$st_array = array(	'nom1' => 0, 
			'nom2' => 1, 
			'nom3' => '2', 
			'nom4' => 'Catalunya Lliure');

echo 'Cas 0:'.in_array('0', $st_array, METODE_STRICTE)."\n";
echo 'Cas 1:'.in_array('1', $st_array, METODE_STRICTE)."\n";
echo 'Cas 2:'.in_array('2', $st_array, METODE_STRICTE)."\n";
echo 'Cas n:'.in_array('n', $st_array, METODE_STRICTE)."\n";
echo 'Cas z:'.in_array('z', $st_array, METODE_STRICTE)."\n";
echo 'Cas Catalunya:'.in_array('Catalunya', $st_array, METODE_STRICTE)."\n";
echo 'Cas num no:'.in_array(3, $st_array, METODE_STRICTE)."\n";
echo 'Cas num sí:'.in_array(1, $st_array, METODE_STRICTE)."\n";

$st_array2 = array(2,'a','Catalunya Lliure');

echo 'Cas 1a:'.in_array(3, $st_array2, METODE_STRICTE)."\n";
echo 'cas 2a:'.in_array(2, $st_array2, METODE_STRICTE)."\n";
echo 'cas 3a:'.in_array('2', $st_array2, METODE_STRICTE)."\n";
echo 'Cas 4a:'.in_array('Catalunya', $st_array2, METODE_STRICTE)."\n";
echo 'Cas 5a:'.in_array('Catalunya Lliure', $st_array2, METODE_STRICTE)."\n";

I podeu observar el resultat:

PHP codi problemàtic solucionat amb strict

Pareu atenció a que amb el mètode estricte si cerqueu ‘1’ (string) i a l’array hi ha 1 (integer) in_array us retornarà FALSE.

Molt important a tenir en compte que tot el que rebeu de $_GET o $_POST sigui el que sigui us arribarà com un string, o un array d’strings, malgrat en el formulari hagin inserit valors numèrics com 2014.

Nota per a usuaris novells: Jo he utilitzat una constant amb el valor booleà TRUE per a fer servir el mètode estricte però prodrieu fer servir directament true.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberat Zend Framework 2.0

diumenge, setembre 9th, 2012

El proppassat dia 5 de Setembre els creadors de PHP van alliberar Zend Framework 2.0.

Poc us en puc dir doncs encara estic estudiant-ne les funcionalitats, malgrat el que vaig començar a furgar a la beta i el que vaig esbrinar promet.

Més informació al seu bloc:

http://framework.zend.com/blog//zend-framework-2-0-0-stable-released.html

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

PHP en mode interactiu

dijous, agost 23rd, 2012

PHP té un mode interactiu en que podem executar petits programes i proves de concepte.

Només cal que escriviu al terminal:

php -a

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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());
}
Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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).

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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
Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

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.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy