PHP Bug when reusing variables by references

PHP Bug when reusing variables by references

I Just find a bug in PHP when you are reusing variables by references.

This is the example code:

$lines = array(
	'1' => array(
		'1A'
	),
	'2' => array(
		'2A',
		'2B',
		'2C'
	)
);

foreach($lines as &$items){
	foreach($items as $key => $value){
		if($value=='2B') unset($items[$key]);
	}
}

$items = array();
foreach($lines as $key => $items){
	print_r($items);
}

What this code should do, is to take the $lines array and delete the 2B value, but it doesn’t work like that, and is because it get crash when you use the $items variable in the second foreach and you already used it as a referece variable, even if you clean the $items variable with an empty array as you see in the code.

Just if you change the name or the $items variable in the second foreach it works fine.

https://bugs.php.net/bug.php?id=67608

Charlas sobre Aplicaciones Web con Cakephp

Charlas sobre Aplicaciones Web con Cakephp

Desde el próximo sabado 10 de mayo empezaré a dar unas charlas cuyo objetivo serán mostrar a los programadores e ingenieros de sistemas a desarrollar aplicaciones web en CakePHP.

Mi principal objetivo serán los principiantes, así que por esa razón la primera charla de este sabado desde las 9:30AM hasta la 1:00PM será HTML5 + CSS.

¿Quieres asistir? tengo 5 cupos disponibles, no tiene precio, es gratis.

Para esta primera charla tengo unos requisitos que debes cumplir:

  • Ser ingeniero de sistemas o programador.
  • No tener conocimientos de HTML ni CSS, o en su defecto que sea muy poco lo que sabes.
  • Tener ganas de venir y estar 3 1/2 horas hablando y practicando en el tema.
  • Traer tu propio computador

Todos los requisitos anteriores son obligatorios 🙂

Para el sábado siguiente haremos JavaScript + jQuery, así que espera mis indicaciones 🙂

Puedes contactarme por los comentarios de este artículo o por Twitter, Facebook o LinkedIn

Los pasabocas serán invitados por Salgarus 🙂

Esto será en la ciudad de Barranquilla, así que por favor abstenerse personas de otras partes del mundo.

Variables compartidas en PHP – APC

Los que alguna vez trabajamos con ASP y luego nos pasamos a PHP solo extrañamos una cosa, las variables de Aplicación… Algunos se preguntarán, ¿Qué son las famosas variables de aplicación?

Es muy fácil, la forma mas sencilla de explicarlos es que se imaginen un contador de visitas a una página web, en PHP cómo lo harías? Bueno, tradicionalmente son dos maneras:

  1. Haces una conexión a la base de datos y ya sea en un parametro o en una tabla donde guardas los registros de las visitas, actualizas o insertas lo que tengas que insertar y luego haces una consulta para saber la cantidad de visitas
  2. En un archivo de texto vas guardando la cantidad de visitas + 1 según vayan llegando los visitantes, luego lees el archivo para mostrarlo en la web

Pues en ASP esto es mucho mas fácil, porque puedes tener una variable de Aplicación que es accedida desde cualquier parte del código, lo mejor es que esa variable podrá ser modificada o leída por cualquier session, cualquier cliente y siempre será la misma variable para todos.

Pues bien, en PHP eso también es posible y lo acabo de descubrir… quizás ya tu lo sabías pero yo no (soy de la vieja usanza)… se llama «Caché Alternativo de PHP» que te permite tener variables en memoria para que sea accedida por cualquier cliente.

Aquí tienes toda la documentación http://mx.php.net/manual/es/book.apc.php , pero básicamente son 3 métodos los que mas usas:

  • apc_add — Poner una nueva variable en caché en el almacén de datos
  • apc_store — Guardar una variable en caché en el almacén de datos
  • apc_fetch — Traer una variable almacenada desde la caché

Algunos dirán, «eyyyy!! pero existe memcache», y si, tienen razón, pero son dos cosas diferentes, esto es algo nativo de PHP y ademas no necesitas tener corriendo ningun servicio, en cambio el memcache por si solo gasta memoria, por otro lado, los que usan hosting baratos no siempre cuentan con memcahe, además no siempre vale la pena tener un memcache gastando memoria para almacenar una variable. Todo es la conveniencia, de todas formas es una alternativa nativa.

Espero sea útil, a mi me sirvió 🙂

Evitar tener varias instancias de memcache

Tuvimos un problema al tratar de centralizar una aplicación web que corría en varios dominios, lo que sucedía era que las KEYs del memcache eran exactamente iguales en todos los dominios pero los datos que debían contener esas KEYs eran diferente, obviamente porque eran sitios diferentes solo que con el mismo código fuente.

La solución que se nos ocurrió para evitar tener varias instancias de memcache ejecutadas en el servidor gastando memoria fue la de agregar un Prefijo parametrizado según el dominio en el que se crea la KEY.

Este es un ejemplo del código actual que tenemos

define("PREFIJO","app1"); //este es el parametro que se configura según cada dominio
$memcache= new Memcache();
$memcache->connect("localhost",111112);
$key=PREFIJO."nombre_llave";
$memcache->set($key,$datos,false,60*60);

Luego para leer sería:

$key=PREFIJO."nombre_llave";
$memcache->get($key);

Espero que les sirva como nos sirvió a nosotros 🙂

Convertir un PDF en imágenes JPG con PHP

Hace días alguien del equipo de desarrollo de evoluZiona Sas necesitaba obtener la primera página de un PDF pero en formato JPG con PHP, obviamente de forma dinámica porque era para resolver un problema que nos asechaba desde hace ya algún tiempo.

La solución para el problema la dimos con imagemagick, específicamente con el comando convert, lo que hicimos fue instalar esta herramienta en el servidor y luego usarla con PHP mediante la función exec, aquí el código:

$archivo="archivo_pdf_de_donde_sacaremos_el_jpg.pdf";
$img_path="/tmp"; //ruta temporal para guardar el jpg
$file_name=time();
$dir="/usr/bin/convert";
$comando="$dir {$archivo}[0] $img_path/$file_name.jpg";
exec($comando,$out);

$image=imagecreatefromjpeg("$img_path/$file_name.jpg");
header('Content-Type: image/jpeg');
imagejpeg($image);
unlink("$img_path/$file_name.jpg");

El comando convert recibe los siguiente parametros:

  • ruta del archivo PDF. Entre corchetes se coloca el rango de paginas a convertir en JPG, puede ser una página en especifico o un rango determinado, [0] , [0-100]. Tengan en cuenta que en linux se empieza a numerar desde cero, lo que quiere decir que la primera página vendría siendo la página 0
  • Ruta destino donde se guardará el JPG