domingo, 7 de septiembre de 2014

Uso del memory limit en php

La forma más usual de ejecutar un script PHP es mediante algún navegador aunque también se puede ejecutar por shell. Ambos se ven afectados por el tiempo de ejecución del script. Además, dependiendo del servidor desde el que lo ejecutamos, tenemos que tener en cuenta la cantidad de memoria que vamos a usar. Y aún tenemos más cosas... No todos los tipos de error están configurados para mostrarse. Puede que el servidor tenga configurado mostrar sólo los errores importantes y los que él considera sólo alertas no nos van a aparecer... 
En éste artículo voy a intentar explicar tres instrucciones muy útiles para controlar la ejecución de un script PHP: set_time_limit(), ini_set('memory_limit') y el error_reporting().

El límite de tiempo de proceso de un script php
Todo script PHP ocupa un tiempo de proceso del servidor al ejecutarse. Ése tiempo por defecto es 30 segundos, pero puede configurarse otro valor en la variable max_execution_time en el archivo de configuración (php.ini). El problema es que si no tienes el servidor en casa no será tan fácil acceder a ésa variable, pues los hostings acostumbran a fijar ellos un tiempo prudencial y no tienes acceso para configurar nada.
Pero podemos fijar un tiempo límite distinto al que venga por defecto usando la instrucción set_time_limit(). Esta función la debemos incluir al principio del script y acepta un parámetro numérico con el que indicaremos el número de segundos que debe esperar. Por ejemplo podemos usar:

PHP:
set_time_limit(300);

Con ésto definiremos que espere 5 minutos (60 secs * 5 min = 300 secs). 
También podemos definir que no haya tiempo límite:

PHP:
set_time_limit(0);

Aunque no es nada aconsejable, pues si el script contiene algun error o realiza alguna llamada externa que pueda tener dificultades, el servidor nunca lo detendrá.
Pero aún hay más. Realmente lo que hace ésta instrucción es resetear el contador de tiempo de proceso a zero y instaurar un nuevo límite. Si tenemos el límite de tiempo por defecto a 30 segundos y llamamos a set_time_limit(30) cuando llevamos 25 segundos de ejecución, en total el script podrá tardar 55 segundos (25 secs + 30 secs = 55 secs).
Por último, esta función no se ejecutará en un entorno dónde el PHP se esté ejecutando en modo seguro, forma en que muchos hostings baratos ejecutan los scripts por compartir muchos usuarios en el mismo servidor.
Podéis encontrar más información en el manual online de PHP: set_time_limit().

Límite de memoria usado por un script

Al igual que el tiempo de proceso, hay definido un límite de memoria en el archivo de configuración bajo la variable memory_limit, pero tampoco tendremos acceso a éste en un hosting normal. Además, en los hostings acostumbran a configurar un límite de memoria bastante bajo, como por ejemplo DreamHost y Arsys que lo tienen a 8 MegaBytes.
El problema es que con el uso de objetos y clases en PHP y varios requires enlazados ése límite es rápidamente sobrepasado. Además, si estamos trabajando con un script que maneja gran cantidad de datos, 8 megas es realmente poco.
De todas formas tenemos una función que varía ciertas variables iniciales y, gracias a ella, podemos ajustar el límite de memoria del script actual al valor que necesitemos: el ini_set(). Ésta función varía el parámetro especificado sólo durante la ejecución del mismo, y al acabar restaurará el valor por defecto. Para aumentar el límite de memoria a 64 MB debemos usar la función de la siguiente manera:


PHP:
ini_set('memory_limit','64M');

Con ésto al principio del script estaremos setando el límite de memoria a 64 para el script actual. Se debe tener especial cuidado en la M que sigue al 64, que especifica que la unidad es MegaBytes. Si no la ponemos, se va a tomar como Bytes, y éso es tan poco que puede que PHP no tenga suficiente memoria ni para mostrar un error de exceso de memoria

No hay comentarios:

Publicar un comentario