Ojo con la memoria en PHP

Filed Under (PHP) by admin on 26-11-2007

Tagged Under :

Erase una vez un programador web realizando un script relativamente complicado… Lo prueba en su maquina, funciona de maravilla. Lo sube al servidor de producción.

Craaash. Y ni siquiera un rastro de error. Revisa que los errores están habilitados, revisa los logs, y nada. Busca algún rastro y nada….

Mis poderes de psíquico me dicen que es un error de memoria.

Usualmente, PHP captura esos errores y nos lanza el ya típico error “Allowed memory size of x bytes exhausted”. Esto es debido a que por precaución contra malos programadores, y especialmente en servidores compartidos, es posible limitar la memoria ocupada por cada script.
Para lidiar con estos problemas, he aquí unos tips básicos que harán tu experiencia un poco menos difícil.

  1. Revisa el uso de memoria de tus scripts
    La función memory_get_usage te regresa el numero de bytes que tu script esta ocupando. Sin embargo esta función no esta disponible en todos los sistemas, ya que hay que compilar php con el parametro –enable-memory-limit. Si en tu servidor no existe esta función puedes emularla de la siguiente manera.if( !function_exists('memory_get_usage') ){
    function memory_get_usage() {
    exec(”ps -orss -p “.getmypid(), $output);
    return $output[1];
    }
    }
    Es similar a la incluida en php, aunque no es tan exacta, pero te puedes dar una buena idea de lo que esta sucediendo. Requiere privilegios de ejecución, ya que utiliza el comando ps.
  2. Cuando termines, no te olvides de limpiar
    Si ya no utilizas una variable que contenga una fuerte cantidad de memoria, destrúyela con unset($variable). Esto liberara inmediatamente la memoria ocupada.
  3. Dí no a las globales
    Esta es una extensión de la anterior. Ten cuidado al usar variables globales. Cuando usas unset en una variable global adentro de una función solamente se destruye la variable local, no la global. Así que una razón mas para NO usar variables globales. (como si hicieran falta ;) )
  4. No confies en el barrendero
    En general he notado que al finalizar una función, esta desactiva las variables locales. Sin embargo, no siempre es el caso o bien no se libera la memoria que estas variables usaron, por lo que cuando uses variables pesadas dentro de una función, desactivalas con unset antes de terminar el script si ya no haces uso de ellas.
  5. Olvida tan pronto como puedas
    Si vas a utilizar por ejemplo, un archivo de muchas lineas, evita mantenerlo en memoria. Esto ultimo es lo mas facil pero puede provocar errores a la larga. En su lugar ve procesando el archivo linea por linea y escribe el resultado en un archivo. tmpfile y las funciones fopen, fclose y similares son tus amigos. Este consejo es el que mas te va a salvar la vida en estos casos, créeme.
  6. No ignores los avisosComo recomendación general, cuando estés debuggeando scripts utiliza error_reporting con E_STRICT. Esto te dará un poco mas de información que E_ALL, aunque con el tiempo y conforme vayas mejorando tus habilidades no notaras la diferencia.
  7. Fuerza bruta
    Como ultimo recurso, si nada de lo anterior funciona (que no he encontrado caso en que no funcione) es posible aumentar la memoria disponible para tu script, mediante la directiva ini_set(”memory_limit”, “16M”) la cual elevaría a 16 MB la capacidad de tu script. Esta directiva esta disponible en cualquier servidor que permita la ejecución de la funcion ini_set. Aunque se cuidadoso, especialmente si tienes un servidor compartido, se buen vecino y no acabes con el servidor.

Que perro… más malo él¡¡

Filed Under (Videos YouTube) by admin on 24-11-2007

Por si alguien no lo sabe se llama Rufo.

El saqueo en casa de Jaime, versión documentada

Filed Under (Videos YouTube) by admin on 24-11-2007

Efecto reflejo

Filed Under (Photoshop) by admin on 24-11-2007

Para que entiendas mejor este tutorial: Las opciones de los menús a utilizar, serán escritas de esta forma:[Menu->submenu->opción...]. Para nombrar el layer de un objeto, solo hace falta hacer doble click sobre el nombre del layer del objeto, escribir el nombre y oprimir Enter. Haré uso de Photoshop CS2 en ingles, empecemos:

Lo primero es tener la imagen u objeto a aplicarle el efecto, debidamente recortado; a este layer le nombraremos “objeto”. En este caso utilizare una flor:

Ahora crearemos el reflejo del objeto, así que seleccionamos el layer objeto y lo duplicamos [Layer->Duplicate Layer....]; al cual nombraremos “reflejo”.

La ventana “layers” del panel derecho, ahora, debe quedarnos algo así:

Aquí viene lo mas importarte para que esto resulte, rotar el objeto. Seleccionamos el layer “reflejo” y lo rotamos verticalmente [Edit->Transform->Flip Vertical....]

Ahora debemos asegurarnos que las dos figuras (”objeto” y “reflejo”) coincidan, esto es, que la parte de abajo del layer objeto coincida con la parte de arriba del layer “reflejo”. Si fuera necesario podemos rotar el layer “reflejo”, para eso, seleccionamos el layer “reflejo” y lo rotamos[Edit->Free Transform...].

Antes:

Después:

En este ejemplo simularemos el reflejo que se produce, cuando un objeto esta recargado sobre una superficie plana. Así que debemos degradar la imagen para que se logre el efecto. Para esto haremos uso de mascaras, seleccionamos el layer “reflejo” y entramos en modo editar mascara[Dar click en el botón"Edit in Quick Mask Mode", El cuadrado rojo con el circulo blanco que se encuentra en el panel izquierdo]:

Ahora seleccionamos el botón Gradient Tool [Dar click en el botón Gradient Tool, se encuentra en el panel izquierdo] :

Ahora solo tenemos que trazar una línea, de arriba abajo. Comenzando un poco arriba del layer “reflejo” y terminando un 15% antes de que la figura del objeto termine:

Una vez que soltemos el click del trazo, la parte de arriba de todo el layer se coloreara de rojo(recuerden, estamos en modo editar mascara; si no te sale así vuelve a comenzar; algo hiciste mal). Así que ahora volveremos al Modo Standard[Hacemos click en el botón Edit Standard Mode, el cuadro blanco con el circulo blanco del panel izquierdo]:

Lo que acabamos de hacer, es una selección degradada, por eso nos aparece una parte del layer “reflejo” encerrada en un cuadro de selección(si, las hormiguitas esas que caminan alrededor de esa parte del objeto XD). Así que solo oprimimos la tecla “delete” del teclado(ya se que es redundante, pero no quiero confusiones). Dependiendo desde donde comenzaron el degradado en modo Mascara, serán los resultados que tendrán, pero debe quedarles algo así:

En mi caso, necesitare bajar el Fill de mi layer:

Ahora solo falta poner la superficie plana del objeto, y listo:

Redirigir con JavaScript

Filed Under (JavaScript) by admin on 24-11-2007

Hacer una redirección con JavaScript es muy sencillo. Podemos hacer que la redirección actúe justo al cargar la página o que actúe tras un cierto tiempo.

Redirección al cargar la página:

<body onLoad=”document.location.href=’http://www.alexmedina.net’”>

Si ponemos esto en nuestra etiqueta “body”, cuando la página cargue, redireccionará a AlexMedina.net.

Si nos interesa más una redirección que sea efectiva transcurridos unos segundos, podemos hacerlo así:

Entre <head> y </head> pondremos:

<script type=”text/javascript”>

var pagina = ‘http://www.alexmedina.net’;
var segundos = 5;

function redireccion() {

document.location.href=pagina;

}

setTimeout(”redireccion()”,segundos);

</script>

Tan solo tenemos que cambiar las variables pagina y segundos, marcadas en negrita, para que redirija a la página que queramos y en el tiempo que queramos.

Lo que hacemos es crear un “timeout” que llame a la función “redireccion()” transcurridos tantos segundos como marque la variable “segundos”. La función redirección lo único que hace es redirigir a la página que se indica en la variable “pagina”.