Tiempo máximo de ejecución en PHP 7

El tiempo máximo de ejecución es uno de los errores más comunes que encuentran los desarrolladores.
Por defecto, el tiempo máximo de ejecución del script PHP que se ejecuta en el navegador es 30 segundos, a menos que ejecutemos el script dentro del entorno CLI, donde no existe limitación.

Podríamos probarlo fácilmente a través de un ejemplo simple, dado a través de los archivos index.php y script.php, de la siguiente manera:

<?php
// index.php
require_once 'script.php';
error_reporting(E_ALL);
ini_set('display_errors', 'On');
sleep(10);
echo 'Test#1';
?php
// script.php
sleep(25);
echo 'Test#2';

Ejecutado desde el navegador, esto devolverá el siguiente error:

Test#2
Fatal error: Maximum execution time of 30 seconds exceeded in
/var/www/html/index.php on line 5

Ejecutado desde el entorno CLI, esto devolverá el siguiente resultado:

Test#2Test#1

Afortunadamente para nosotros, PHP proporciona dos formas de controlar el valor del tiempo de espera:

  • Usando la directiva de configuración max_execution_time (archivo php.ini, función ini_set())
  • Usando la función set_time_limit()

El uso de la función set_time_limit() tiene una implicación interesante. Echemos un vistazo al siguiente ejemplo:

<?php
// index.php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
echo 'Test#1';
sleep(5);
set_time_limit(10);
sleep(15);
echo 'Test#2';

El ejemplo anterior dará como resultado el siguiente error:

Test#1
Fatal error: Maximum execution time of 10 seconds exceeded in
/var/www/html/index.php on line 9

Curiosamente, la función set_time_limit() reinicia el contador de tiempo de espera desde cero en el punto donde fue llamado. Lo que esto realmente significa es que al usar la función set_time_limit() en todo el código, en un sistema en gran parte complejo, podemos extender significativamente el tiempo de espera general más allá de los límites inicialmente imaginados. Esto es bastante peligroso, ya que el tiempo de espera de PHP no es el único tiempo de espera en la mezcla cuando se trata de entregar la página web final al navegador de un usuario.
Los servidores web vienen con varias configuraciones de tiempo de espera propias que pueden interrumpir la ejecución de PHP:

  • Apache:
    -Directiva TimeOut, el valor predeterminado es 60 segundos
  • Nginx:
    -directiva client_header_timeout, el valor predeterminado es 60 segundos
    -directiva client_body_timeout, el valor predeterminado es 60 segundos
    -directiva fastcgi_read_timeout, el valor predeterminado es 60 segundos

Si bien podemos controlar los tiempos de espera de las secuencias de comandos dentro del contexto del navegador, la pregunta importante es ¿por qué querríamos hacerlo? Los tiempos de espera suelen ser el resultado de operaciones intensivas en recursos, como varios bucles no optimizados, exportaciones de datos, importaciones, generacion de archivos PDF, y así sucesivamente. Mientras que el entorno del navegador es excelente el enfoque debe ser entregar páginas a los usuarios en el menor tiempo posible.

Comparte