Archive for the ‘PHP’ Category

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

Alliberat PHPStorm 7.1.1

dilluns, gener 27th, 2014

S’ha alliberat la nova versió de PHPStorm, que adreça un bon número de bugs.

http://blog.jetbrains.com/phpstorm/2014/01/phpstorm-7-1-1-bug-fix-update-is-available/

Com instal·lar memcache per a PHP en Linux

dilluns, novembre 18th, 2013

En aquest article explicaré com instal·lar memcache i memcached en Ubuntu/Debian Linux i el seu suport per a PHP.

Per a aclarir els dubtes memcached és la llibreria del sistema operatiu que ofereix el servei de base de dades NoSQL en memòria.

Les llibreries client s’anomenen php5-memcache, la versió més antiga i més estable, i php5-memcached la nova versió amb més funcionalitats.

Assumeixo que teniu apache2 instal·lat i us passo les passes per a instal·lar memcached i tot el necessari per a treballar en PHP.

Per a refrescar els paquets:

sudo apt-get update

En  primer lloc ens assegurarem de tenir PHP instal·lat:

sudo apt-get install php5

Instal·larem altres llibreries necessàries per a PHP

sudo apt-get install php5-dev

sudo apt-get install php-pear

sudo apt-get install make

Instal·larem memcached:

sudo apt-get install memcached

Instal·larem el client memcache:

sudo apt-get install memcache

Instal·larem l’extensió per a PHP:

sudo apt-get install php5-memcache

Escriurem l’arxiu per a que PHP carregui la llibreria en iniciar-se l’apache:

echo “extension=memcache.so” > /etc/php5/apache2/conf.d/memcache.ini

I reiniciem l’apache:

sudo service apache2 restart

L’arxiu de configuració és a /etc/memcached.conf

 

Alliberats PHP 5.5.5 i 5.4.21

dissabte, octubre 19th, 2013

El proppassat 17 d’octubre foren alliberades les versions 5.5.5 i 5.4.21 de PHP respectivament.

Respecte la 5.4.21, aquesta versió soluciona 10 bugs de la versió anterior.

Per a mi els pitjors són:

Standard:

  • Fixed bug #61548 (content-type must appear at the end of headers for 201 Location to work in http).

CLI server:

  • Fixed bug #65633 (built-in server treat some http headers as case-sensitive).

Datetime:

  • Fixed bug #64157 (DateTime::createFromFormat() reports confusing error message).

Filter:

  • Add RFC 6598 IPs to reserved addresses.
  • Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names).

DBA extension:

  • Fixed bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write).

Els podeu consultar tots al changelog.

Respecte la versió 5.5.5 soluciona uns 20 bugs, podeu veure la llista completa al changelog.

Jo destaco els següents errors solucionats, com els més greus:

Core:

  • Fixed bug #64979 (Wrong behavior of static variables in closure generators).
  • Fixed bug #65821 (By-ref foreach on property access of string offset segfaults)

CLI Server:

  • Fixed bug #65633 (built-in server treat some http headers as case-sensitive).
  • Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding).

Datetime:

  • Fixed bug #64157 (DateTime::createFromFormat() reports confusing error message).
  • Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime).
  • Fixed bug #65548 (Comparison for DateTimeImmutable doesn’t work).

DBA:

  • Fixed bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write).

Filter:

  • Add RFC 6598 IPs to reserved addresses.
  • Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names).

FTP:

  • Fixed bug #65667 (ftp_nb_continue produces segfault).

GD:

  • Ensure that the defined interpolation method is used with the generic scaling methods.

OPCache:

  • Fixed bug #65845 (Error when Zend Opcache Optimizer is fully enabled).
  • Fixed bug #65665 (Exception not properly caught when opcache enabled).
  • Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var).
  • Fixed issue #135 (segfault in interned strings if initial memory is too low).

Sockets:

  • Fixed bug #65808 (the socket_connect() won’t work with IPv6 address).

SPL:

  • Fixed bug #64782 (SplFileObject constructor make $context optional / give it a default value).

Standard:

  • Fixed bug #61548 content-type must appear at the end of headers for 201 Location to work in http.

XMLReader:

  • Fixed bug #51936 Crash with clone XMLReader.
  • Fixed bug #64230 XMLReader does not suppress errors.

 

 

 

 

 

 

 

 

 

 

 

 

 

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.

Alliberat PHP 5.5.3 i 5.4.19

divendres, agost 30th, 2013

El proppassat 22 d’Agost s’alliberaren noves versions de PHP.

La 5.5.3 i la 5.4.19.

Aquestes versions arriben prou ràpid, doncs solucionen uns bugs trobats a les versions anteriors certament una mica aparatosos.

Recordeu que PHP 5.3 va arribar a end-of-life al Juliol i ja no el mantenen.

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

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

Afegir l’hora a una plantilla Smarty

dimecres, juliol 10th, 2013

Si heu d’afegir l’hora a una plantilla d’Smarty és molt fàcil:

 

Hora local: {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}

Alliberat Zend Framework 2 versió 2.1.3

dimecres, febrer 27th, 2013

El 21 de Febrer passat va ser alliberada la versió 2.1.3 del Framework de Zend.

Podeu descarregar-lo des d’aquí: http://framework.zend.com/downloads/latest

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.

PHP 5.4 incorpora facilitats de control de progrès de la pujada

dilluns, febrer 18th, 2013

Una barra de progrès d'exempleUna de les noves característiques de PHP 5.4 és que facilita, a través de $_SESSION fer un seguiment de com va la pujada dels arxius que estem enviant.

Això és interessant perquè mentre un procés de PHP està rebent els arxius per POST, un altre pot estar atenent crides Json del navegador, i així mostrar la títpica barra de tasques.

Aquesta funcionalitat és molt interessant però heu de tenir en compte, que si heu fet que la SESSION del vostre projecte es recuperi de base de dades perquè teniu diversos frontals web, estareu afegint una càrrega de fins a 100 queries sobre la base de dades per cada arxiu (una per cada punt percentual).

Això es pot modificar amb la directiva de PHP.ini

session.upload_progress.freq =  "1%"

Podeu especificar “10%” per a que només faci 10 queries. També podeu especificar bytes.

Aquests articles us resultaran interessants:

http://docs.php.net/manual/en/session.upload-progress.php

http://php.refulz.com/new-in-php-5-4-improvements-in-session-extension/

 

També heu de parar atenció als temes de control de sessió, per a evitar els problemes de bloqueigs de sessions.

Si treballeu amb un sol servidor web i feu servir session_start estareu bloquejant l’accès d’altres processos a la sessió (per exemple peticions Ajax). Si no coneixieu  això reviseu session_write_close();

Aquest article us ajudarà: http://konrness.com/php5/how-to-prevent-blocking-php-requests/

session.upload_progress.freq =  "1%"

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.

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

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