Controlar el Script PHP: set_time_limit, memory_limit y error_reporting
23 de Noviembre de 2006 en Programación, PHP
Lecturas: 10,417

PHPLa forma más usual de ejecutar un script PHP es mediante 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:

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

PHP:

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

Reportando errores

PHP clasifica los errores en varios tipos diferentes, de forma que podemos escoger qué nivel queremos que nos muestre. Éstos errores (si no se cambia la configuración) van a mostrarse como si fueran prints, es decir, en medio de la página. Por ello a veces se establecen configuraciones para ocultar ciertos mensajes que puede que ya conozcamos y que no interfieren en el programa, simplemente por estética. Pero lo común (y mejor) es trabajar el código para eliminar todos los mensajes y tener un código error free.

Los tipos de errores son los siguientes:

valor constante
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT

Si nos fijamos tenemos un número que se refiere a cada error. Ése número es el valor decimal del bit que ocupa el error en la cadena binária, de forma que podemos definir varios errores a mostrar a la vez sumando los números de cada error (y el parser los desmembrará en cada error). Con algo de conocimientos de números binarios y definición de flags entenderás lo que digo, pero si no, no te preocupes, porque se aconseja definir los niveles de error con su nombre (que es una constante interna del PHP).

¿Cómo se usa? Deberemos poner el tipo de error a prestar atención como parámetro de la función:

PHP:

Con éste estamos definiendo que queremos que PHP nos reporte todos los errores. Ojo que el E_ALL no incluye el E_STRICT. Por otro lado, aviso que al mostrarse todos los errores van a aparecer multitud! Veamos otra forma:

PHP:
error_reporting(E_ERROR | E_WARNING | E_PARSER);

Esta vez estamos definiendo que queremos que nos muestren los errores, las advertencias y los fallos de parseo. Aquí por ejemplo nos libramos de los Notice, que son los típicos de no inicializar variables, etc.

El que usualmente viene por defecto es:

PHP:
error_reporting(E_ALL ^ E_NOTICE);

Éste nos va a mostrar todos los errores excepto el Notice. Nótese el carácter ^, que significa excepto.

Podemos encontrar más información en el manual de PHP: error reporting.

Tags: ,
 Enviar a Fresqui

Leer los Comentarios

[ # 7 ] Pingback desde Los Links de Tolito » Blog Archive » Links del 23 de Noviembre del 2006 [23 de Noviembre de 2006, 12:59]

[…] Controlar el Script PHP: set_time_limit, memory_limit y error_reporting […]

[ # 40 ] Pingback desde Un error handler que lance exceptions en PHP at PHPBSD.net [13 de Enero de 2007, 06:43]

[…] Puedes consultar más información acerca de los niveles de error del PHP en la documentación de la función error_reporting, también puedes pegarle un vistazo al post Controlar el Script PHP: set_time_limit, memory_limit y error_reporting publicado en SyntaxError.es, un blog amigo dentro de la red SmallSquid.com. Es interesante también consultar la documentación de set_error_handler para más información acerca de los handlers de errores. […]

[ # 8002 ] Comment desde ale [04 de Noviembre de 2007, 02:34]

che, estoy probasndo el ini_set(’memory_limit’,'64M’);
la idea es colocar eso antes de empesar el escript que me va a consumir memoria… pero al final del script ¿que pongo?

Gracias!

Ale

[ # 8054 ] Comment desde Xavi [04 de Noviembre de 2007, 10:19]

Nada. Al acabar el script se termina el “modo especial” definido. El siguiente script que se ejecute mantendrá la configuración original del servidor.

Saludos

[ # 19038 ] Pingback desde Controlar el Script PHP: set_time_limit, memory_limit y error_reporting | metodoPHP.com [27 de Marzo de 2008, 07:55]

[…] 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: […]

[ # 26831 ] Comment desde Pablete [01 de Julio de 2008, 10:24]

Muchas Gracias!! Tenia un problema, de limitaciones del host y lo solucione gracias a esto!!

[ # 27095 ] Comment desde Daniel [03 de Julio de 2008, 05:00]

Hola

dos preguntas

UNA:
si yo tengo un proceso… por ejemplo subir archivos grandes que tardan aprox. 15 min. y tengo establecido el set_time_limit(300); en 5 min. que pasa entonces? se detiene el script y obtengo un error?

LA OTRA:
Si establezco set_time_limit(300); al inicio de un script y este script inluye otro, esta configuración lo alcanza? o debo agregarle tambien esta configuración a este script incluido?

Saludos

[ # 27096 ] Comment desde Xavi [03 de Julio de 2008, 05:04]

Respuestas:
UNA: el script acaba lanzando un Fatal Error diciendo algo como “maximum time exceed”.

DOS: En principio la directiva prevalece mientras el script se está ejecutando, sea lo que sea lo que hace (cURLs, requires, includes, …)

Salu10.

[ # 66197 ] Comment desde carlos siu [30 de Marzo de 2009, 06:04]

Hola, tengo un hosting configurado con memory_limit 32M, pero necesito para un portal lo siguiente memory_limit 128M, puedo usar el ini_set(’memory_limit’,’128M’) y me va correr sin problemas mi script.

[ # 66198 ] Comment desde Xavi [30 de Marzo de 2009, 06:21]

Puede que tu hostic tenga anulada la instrucción “ini_set”. Pruébalo y luego ejecutas un “var_export(ini_get(’memory_limit’));” para saber si lo ha ejecutado

Escribe un Comentario





Estadísticas