2010-11-29 12 views
50

¿Hay una buena razón para no configurar la variable de configuración PHP max_execution_time en 0?¿Es una mala idea ini_set ('max_execution_time', 0) una mala idea?

Un compañero de trabajo recientemente revisado en un cambio en un archivo que ha añadido:

ini_set('max_execution_time', 0); 

El valor por defecto había sido demasiado baja para una página que hizo un poco de procesamiento complejo antes de devolver la salida al usuario.

El manual indica que el propósito principal de la configuración es el siguiente:

prevenir que scripts mal escritos de atar el servidor.

Pero también afirman a continuación:

Su servidor web puede tener otras configuraciones de tiempo de espera que también puede interrumpir la ejecución de PHP. Apache tiene una directiva Timeout e IIS tiene una función de tiempo de espera CGI. Ambos predeterminados a 300 segundos. Consulte la documentación de su servidor web para obtener detalles específicos.

Nos estamos quedando bajo Apache, por lo que se aplica ajuste Tiempo de espera. ¿Hay alguna razón para no establecer max_execution_time en cero globalmente? Tengo curiosidad sobre si hay ventajas que tengo en cuenta cuando no poniéndolo a cero.

+0

en php 7, es ini_set ('max_execution_time', '0'); (0 es una cadena, de lo contrario obtendrá un TypeError). Y sí, esa es una buena idea en dev si necesita ejecutar scripts de cómputos pesados. – ling

Respuesta

56

A riesgo de irritarte;

Hace la pregunta incorrecta. No necesita una razón para NO desviarse de los valores predeterminados, sino al revés. Necesitas una razón para hacerlo. Los tiempos de espera son absolutamente esenciales cuando se ejecuta un servidor web y desactivar esa configuración sin una razón es inherentemente contrario a las buenas prácticas, incluso si se ejecuta en un servidor web que tiene una directiva de tiempo de espera propia.

Ahora, en cuanto a la respuesta real; probablemente no importe para nada en este caso particular, pero es una mala práctica usar un sistema diferente. ¿Qué sucede si el script se ejecuta posteriormente en un servidor diferente con un tiempo de espera diferente? Si puede decir con seguridad que nunca sucederá, está bien, pero las buenas prácticas consisten principalmente en dar cuenta de los eventos aparentemente improbables y no vincular innecesariamente la configuración y la funcionalidad de sistemas completamente diferentes. El rechazo de tales principios es responsable de muchas incompatibilidades inútiles en el mundo del software. Casi todas las veces, son imprevistos.

¿Qué sucede si el servidor web más tarde está configurado para ejecutar algún otro entorno de tiempo de ejecución que solo hereda la configuración de tiempo de espera del servidor web? Digamos, por ejemplo, que luego necesita un programa de CGI de 15 años de antigüedad escrito en C++ por alguien que se mudó a otro continente, que no tiene idea de ningún tiempo de espera excepto el del servidor web. Eso podría ocasionar que se requiera cambiar el tiempo de espera y porque PHP se basa inútilmente en el tiempo de espera del servidor web en lugar del propio, lo que puede causar problemas para el script PHP. O al revés, que necesita un tiempo de espera del servidor web menor por alguna razón, pero PHP aún necesita tenerlo más alto.

No es una buena idea vincular la funcionalidad PHP con el servidor web porque el servidor web y PHP son responsables de diferentes roles y deben mantenerse lo más funcionalmente separados posible.Cuando el lado PHP necesita más tiempo de procesamiento, debe ser una configuración en PHP simplemente porque es relevante para PHP, no necesariamente todo lo demás en el servidor web.

En resumen, es simplemente combinar el asunto innecesariamente cuando no es necesario.

Por último pero no menos importante, 'stillstanding' es correcto; al menos debería usar set_time_limit() que ini_set().

Espero que esto no fuera demasiado condescendiente e irritante. Como dije, probablemente esté bien en tus circunstancias específicas, pero es una buena práctica no asumir que tus circunstancias sean la Única Verdadera Circunstancia. Eso es todo. :)

+0

En primer lugar, intento comprender la razón de ser del valor predeterminado. El hecho de que sea un defecto no lo hace bueno. Tener una configuración predeterminada de 'max_execution_time' todavía me parece lo mismo que tener un "detector de bucle infinito". Y la implementación de PHP (por defecto, 0 en 'cli', 30 en caso contrario) parece contradecir su argumento de "vincular innecesariamente la configuración y la funcionalidad de sistemas completamente diferentes". No obstante, proporcionó una respuesta bien escrita y basada en principios con buenos ejemplos. Gracias. – benizi

+0

Bueno, en un entorno de línea de comandos nunca se deshace de tener que lidiar con el medio ambiente (de ahí la importancia del cumplimiento de POSIX) por lo que no es exactamente comparable. Pero aún más, CLI PHP es relativamente nuevo; PHP no pretendía ser un entorno de CLI hasta la versión ... 4.5 o incluso 5, creo. – Teekin

+1

¿Quién está "quieto" y dónde puedo encontrarlo? –

11

La razón es tener algún valor distinto de cero. la práctica general para tenerlo a corto y largo a nivel mundial para los guiones de trabajo larga como analizadores, rastreadores, volquetes, exportando & guiones importadores etc.

  1. Puede detener el servidor, el trabajo corrupta de otras personas por la memoria consumir guión sin siquiera sabiéndolo
  2. No verá errores donde algo, digamos, bucle infinito sucedió, y será más difícil de diagnosticar.
  3. Tal sitio puede ser fácilmente dosificadas por un solo usuario, cuando las páginas que solicitan con tiempo largo de ejecución
Cuestiones relacionadas