La 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:
Con ésto definiremos que espere 5 minutos (60 secs * 5 min = 300 secs). También podemos definir que no haya tiempo límite:
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:
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:
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:
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:
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:
É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: PHP, Programación
Escribe un Comentario