2009-03-27 18 views
5

Estoy desarrollando algunas secuencias de comandos CGI y estoy tratando de encontrar una solución para disminuir el "tiempo de inicio" producido cuando importo muchos módulos con "uso".¿Cómo puedo reducir el tiempo de inicio del script Perl CGI?

Actualización:

Las soluciones aportadas son agradables, pero los guiones que estoy carreras tanto en la consola y el modo CGI comprobar si algunas variables típicas del entorno HTTP están presentes trabajo.

En el "modo de consola" que volcar los datos "normalmente", y en "modo html" que hacer algunos reemplazos en tiempo real y enviar otras cabeceras HTTP al cliente.

Me gustaría mejorar el tiempo de arranque en ambos casos.

+0

¿Está creando un nuevo proceso para cada solicitud? –

+0

sí, pero ese no es exactamente mi problema principal, ya que algunos scripts se ejecutan tanto en consola como en modo CGI ^^ – mndg

Respuesta

9
  • Asegúrese de que esto es en realidad su cuello de botella
  • Sólo los módulos de importación que necesita
  • Asegúrese de que no tiene que buscar un trillón de lugares para encontrarlos
  • considerar la posibilidad de procesos con arranque en caliente costoso ejecutar (por ejemplo, como daemon) y usa scripts CGI más livianos para iniciarlos
  • Busca varios aceleradores en lugar de hacer un CGI completo desde un shell (depende de lo que estés usando para publicar las páginas).
12

Considere usar CGI::Fast para iniciar un proceso de perl para manejar múltiples solicitudes. Me llevó muy poco esfuerzo cambiar algunos de mis grandes scripts CGI a CGI :: Fast. A diferencia de mod_perl, es muy fácil ejecutar CGI :: Fast en sitios de hosting porque puedes reiniciar tus scripts sin reiniciar Apache (al menos eso es lo que mi proveedor de internet me dijo cuando pedí mod_perl).

+2

+1 # también es bueno tener en cuenta, FCGI no está vinculado a la implementación del servidor, lo que lo hace mucho más portátil. –

+0

Suena bien, y si las secuencias de comandos se ejecuta en el modo de consola también? más propina? thx :) – mndg

+0

Es posible reiniciar su programa sin reiniciar mod_perl. Pero FastCGI es más simple. –

4

Siempre se puede probar el pragma less:

use less 'starttime'; 

Por supuesto, esto depende del sistema *. Su mejor opción es usar mod_perl o uno de los módulos FastCGI: CGI::Fast, FCGI, etc.

Si tiene que ser rápido desde la línea de comandos es posible que desee pasar a una arquitectura cliente/servidor (que es todo FastCGI es).

* advertencia no hay sistemas que actualmente implementar una opción para los menos starttime pragma.

+0

wops, parece que no es muy portátil ^^ – mndg

2

Bueno, otros ya han sugerido que CGI podría ser su problema aquí, así que consideraré que no puede eliminar CGI de la imagen.

Es posible que desee considerar this old article. Aparentemente, una fuente de tiempo de arranque lento es un gran @INC, por lo que consolidar todo en un PERL5LIB corto parece ser de gran ayuda (parece ser una suposición razonable, pero nunca lo intenté).

Alternativamente (o adicionalmente), si no te importa pagar algún precio en tiempo de ejecución puede utilizar Class::Autouse

Enjoy!

1

Pruebe usar SpeedyCGI o Perl persistente.

Ambos implementan más o menos la misma idea: en lugar del intérprete Perl, son un envoltorio que analiza el programa y lo mantiene en la memoria, ahorrando así el tiempo requerido para inicializar el intérprete y analizar en cada ejecución.

Esto debería funcionar bien con la configuración de entorno dual que describió, que podría ser/no ser el caso al usar CGI :: Fast o mod_perl.

EDIT Si esto ayuda, bien. De lo contrario, deberá medir dónde pasa el script su tiempo de ejecución.

Cuestiones relacionadas