Aumentar el limite de tiempo maximo de ejecución de un script en PHP

Cuando instalamos un servidor web LAMP, la configuración por defecto de PHP es válida para la mayoría de las aplicaciones. Sin embargo, es posible que si desarrollamos o instalamos aplicaciones que necesiten de una gran cantidad de recursos del sistema nos encontremos con algunos límites.

php max_execution_time

Algunos de ellos pueden ser: la memoria consumida en la ejecución del script, el tamaño de los archivos subidos al servidor, el número de variables pasadas por get o por post, etc.

En esta estrada hablamos sobre el límite de tiempo de ejecución de un script.

Fatal error: Maximum execution time of 30 seconds exceeded

Este es el error que nos encontraremos si nuestro script sobrepasa el tiempo máximo de ejecución definido.

Encontrarnos con este error no es una situación excesivamente habitual y en muchos casos puede ser el resultado de un error de programación, como por ejemplo una rutina que nos haga entrar en un bucle infinito.

Pero también es posible alcanzar ese límite por las propias exigencias de nuestro software. En mi caso, me he encontrado con esta situación al desarrollar aplicaciones empresariales que procesan una gran cantidad de datos.

Medida de protección

Que PHP disponga de un límite máximo de tiempo de ejecución para los scripts es una medida de protección que puede librarnos de largas esperas e incluso de algún reinicio. La experiencia me dice que en algunas ocasiones un bucle infinito puede dejar un equipo completamente bloqueado.

Así que antes de ampliar el tiempo máximo de ejecución mi consejo es que nos aseguremos de que:

  1. No es un bug en nuestro script el que crea la necesidad de ampliar este tiempo.
  2. Nuestro script está razonablemente optimizado.

Es decir, nada que no debamos hacer con cualquier otro script que no supere el tiempo de ejecución máximo.

Cómo aumentar el límite el tiempo de ejecución de un script PHP

Por defecto, el tiempo máximo de ejecución de un script es de 30 segundos. Si ya tenemos claro que queremos aumentar este tiempo podemos hacerlo de varias formas.

Con la función set_time_limit()

Utilizaremos esta función al comienzo de nuestro script definiendo el tiempo máximo de ejecución en segundos. Por lo tanto, con este método el nuevo limite afectará única y exclusivamente al script dónde lo utilicemos.

<?php

set_time_limit(60);

...

?>

Debemos puntualizar que en caso de que estemos utilizando php en modo seguro esta función no tendrá ningún efecto.

Con la función init_set()

Este sistema funciona exactamente igual que set_time_limit(), con la única diferencia que utilizaremos la función init_set() pasando el string max_execution_time como primer parámetro.

<?php

ini_set('max_execution_time', 60)

...

?>

En el archivo php.ini

En este caso, la principal diferencia entre este método y los dos anteriores es que el nuevo límite afectará a todos los scripts PHP que se ejecuten en el servidor dónde apliquemos esta configuración. Para aplicarlo, buscamos la directriz max_execution_time, dentro de la sección Resources Limits, en el archivo php.ini y modificamos su valor.

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 60

Y acto seguido reiniciamos el servidor Apache 2 para que los cambios surtan efecto.:

sudo service apache2 restart

La ubicación del archivo php.ini variará en función del sistema que estemos utilizando. En los sistemas Linux basados en Debian como Ubuntu la ubicación será /etc/php/X.X/apache2, donde X.X será la versión de PHP.

En el archivo .htaccess

Esta es quizás la opción menos conocida de las que mostramos en esta entrada, pero es una de las más interesante en cuanto a que podemos conseguir que la nueva directriz aplique a todos los scripts cuando no tenemos acceso al archivo php.ini.

Para aplicar este sistema editaremos el archivo .htaccess que nos interese incluyendo las siguientes líneas:

<IfModule mod_php7.c>
php_value max_execution_time 60
</IfModule>

Si nuestro servidor utiliza una versión 5.X de PHP en lugar de una versión 7.X, solo habría que cambiar mod_php7.c por mod_php5.c.

Cómo comprobar el valor de tiempo máximo de ejecución

Podemos comprobar el valor de tiempo máximo de ejecución configurado en nuestro servidor en la sección Core de la salida de la función phpinfo():

max_execution_time phpinfo()

O como acabamos de ver, accediendo al archivo de configuración php.ini:

max_execution_time en php.ini

Créditos, referencias y artículos relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *