2009-05-05 8 views
12

Para fines de afición, tengo un espacio compartido en un servidor de alojamiento que proporciona, como muchos de ellos, tanto PHP como Perl CGI. He leído en varios lugares que los scripts CGI están obsoletos ahora, creo principalmente por problemas de rendimiento (como Is PHP or vanilla Perl CGI faster?).¿Cuándo debería usar Perl CGI en lugar de PHP (o viceversa)?

Pero como recién comencé a estudiar Perl, no quisiera perder el tiempo implementando soluciones en PHP que son mucho más fáciles (o solo posibles) en Perl.

También están los problemas repetitivos, soy consciente de CPAN (que es la existencia, todavía no el contenido), pero no estoy familiarizado con las bibliotecas PHP (aunque no tengo ninguna duda de que existen). No estoy preparado para escribir un procedimiento de inicio de sesión o una administración de usuario básica desde cero por 10^décima vez.

No tengo el lujo en este momento de perder mucho tiempo en la investigación de proyectos de hobby tampoco, así que pensé, pidamos a los expertos una ventaja.

+2

En lugar de CGI simple, eche un vistazo a Catalyst. http://catalystframework.org –

+1

@Brad Gilbert - Usted está combinando CGI.pm y CGI la interfaz. Catalyst puede ejecutarse como un CGI (la sobrecarga de inicio es un poco alta, pero puede ser aceptable). – daotoad

+0

La pregunta es si le proporcionan una interfaz CGI para el servidor web, CGI.pm o ambos. La coincidencia de nombrar significa que no podemos decir, ¿sabes? – ijw

Respuesta

28

La "obsolescencia" de CGI es realmente solo un factor si está haciendo sitios grandes y complejos con muchas páginas vistas.

Muchas personas expresan la idea de que CGI es obsoleto, realmente no entiendo qué es CGI. Existe una idea generalizada errónea de que CGI es una tecnología intrínsecamente basada en Perl. Muchas personas atacan CGI como una forma de rellenar ataques de culto en Perl en apoyo de cualquier lenguaje que admitan. Si quiere ser un verdadero tecnólogo, debe comprender los problemas fundamentales y tomar una decisión basada en los hechos de la situación.

CGI es una interfaz con un servidor web que le permite escribir páginas interactivas en cualquier idioma-- even befunge. Cuando un servidor recibe una solicitud de una página controlada por una secuencia de comandos CGI, el servidor ejecuta la secuencia de comandos y devuelve los resultados al solicitante.

Si su lenguaje de programación requiere una VM, un intérprete o un compilador para cargar cada vez que se ejecuta, entonces este tiempo de inicio será requerido cada vez que se acceda a su página.

Los aceleradores CGI como FastCGI, mod_php, mod_perl y demás, mantienen un intérprete/VM en memoria en todo momento, pueden mantener las bibliotecas cargadas e incluso almacenar en caché el bytecode de los scripts para reducir la sobrecarga de inicio del script.

Si está haciendo un sitio simple, personal o hobby, CGI estará bien. Lo mismo hará PHP.

Si su sitio necesita una tecnología más rápida, puede pasar a mod_perl, FastCGI u otras tecnologías de aceleración CGI.

El idioma que utiliza debe estar determinado por las herramientas que proporciona y cómo se ajustan a sus necesidades.

  1. Haga una lista de las capacidades que necesita.
  2. Haz una lista de los interruptores de ofertas.
  3. Ahora compruebe cada uno de sus posibles conjuntos de herramientas con estas dos listas.
  4. ¿Cuál sale mejor? Pruébalo.
  5. ¿Es malo? Elimínelo de la lista y vuelva al paso 4.

Además, recomiendo no usar befunge. El hecho de que sea posible no significa que deba usarlo.


Actualización: Como mpeters señala, mod_perl, mod_php, mod_ruby, et alia son mucho más que meros aceleradores CGI; proporcionan acceso a la API de Apache. Actúan como aceleradores CGI, pero pueden hacer mucho, mucho, más.

FastCGI es un acelerador de CGI puro.

Actualización 2: PHP y CGI no son mutuamente excluyentes. PHP can be installed as a CGI. PHP se usa a menudo con FastCGI.

+3

Si bien la mayoría de esto es correcto, mod_perl no es solo un acelerador de CGI. De hecho, eso es una especie de efecto secundario de darle la capacidad de controlar cada bit del ciclo de solicitud de Apache en Perl. – mpeters

+2

Amen. Especialmente el bit de "CGI es independiente del lenguaje": la primera biblioteca CGI que he escrito estaba en C como un concierto de consultoría (que estaba en la universidad cuando era muy bueno con C pero de alguna manera nunca había oído hablar de Perl :) – DVK

2

Uso tanto Perl como PHP para sitios web, por razones históricas, principalmente Perl en el trabajo y PHP en el hogar; No creo que haya mucho para elegir entre ellos.

Si sus páginas son en su mayoría HTML fijo con solo una pequeña cantidad de computación, PHP es un poco más fácil, porque de todos modos está incrustado en HTML.

Encuentro PHP un lenguaje más disciplinado, y por lo tanto a veces más limitado, que Perl. PEAR es muy similar a CPAN, no tan grande, creo, pero entonces CPAN es tan grande que tiene mucha escoria.

HTH

Colin

+4

Incrustar HTML en su código es un estilo muy malo. –

+1

Puede incrustar código Perl en HTML con Mason o Template-Toolkit, no es que yo lo aconseje. –

8

Esta es una cuestión bastante subjetiva para decidir qué usar para una afición. Decidí aprender a Perl como un hobby después de mirar PHP y no me gustó el hecho de que no podía leer la mayoría de los PHP y me intimidaba la lista de funciones integradas.

Las primeras cosas que hice fueron scripts CGI para formularios de contacto y un generador de álbumes de fotos. Estaba en un plan de hosting compartido cheapo y no estaba teniendo ningún problema de rendimiento por lo que el problema de rendimiento nunca entró en juego.

En su lugar, la existencia de comp.lang.perl.misc y CPAN aseguró que nunca reconsidere mi decisión de no profundizar en PHP.

Mientras tanto, me di cuenta de que la mayor parte del contenido en mis sitios web es estático una vez generado, así que ahora escribo scripts Perl para generar el contenido fuera de línea.

Por lo tanto, mi respuesta es, elija un proyecto pequeño, cualquier cosa servirá e impleméntelo usando Perl y los módulos de CPAN apropiados y vea si le gusta.

1

Tanto PHP como Perl tienen sus momentos, pero esto es realmente subjetivo. Perl tiene marcos masivos disponibles en CPAN que pueden hacer que funcione tan bien o mejor que PHP, incluso en un entorno puramente CGI. Al mismo tiempo, PHP tiene una gran cantidad de seguidores y un montón de características listas para usar para hacer que la programación de sitios web sea simple. La elección, para mí, se reduce a las preferencias personales. Personalmente prefiero usar Perl que perder el tiempo tratando de encontrar todas las formas funcionales de hacer cosas en PHP. ¡Buena suerte!

+4

Perl puede tener un seguimiento mucho mayor que PHP. PHP solo es útil para escribir sitios web, Perl puede ser útil en casi todas las áreas de programación. –

1

Pruebe Catalyst con Template Toolkit.

sub hello :Path('/hello') :Args(0) { 
    my ($self, $c) = @_; 

    # Hello World 
    $c->response->body($c->welcome_message); 
} 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN"> 
<html> 
    <head> 
    <title>[% title %]</title> 
    </head> 
    <body> 
    <div id="header"> 
     <a href="/index.html" class="logo" alt="Home Page"></a> 
     <h1 class="headline">[% title %]</h1> 
    </div> 

    [% content %] 

    <div id="footer"> 
     <div id="copyright"> 
     &copy; [% copyright %] 
     </div> 
    </div> 
    </body> 
</html> 
+2

No recomendaría particularmente Catalyst con una interfaz CGI para el servidor web, pero es una buena idea si puede usar mod_perl o FastCGI. – ijw

+1

err, este código no hace lo que dice que hace. Tal vez se refiera a la shell: script/myapp_create ver Web TT; Luego agregue a Controller :: Root: sub hello: Ruta ('/ hello'): Args (0) { mi ($ self, $ c) = @_; } y guarde hello.tt en el directorio raíz. Además, aunque funciona en CGI, el rendimiento del catalizador es en tiempo de compilación, por lo que para todos los propósitos prácticos, nunca se usaría CGI para ejecutar un sitio de Catalyst. – singingfish

+0

Esto es solo una representación del estilo de un programa Catalyst, no es un ejemplo real de trabajo. –

2

Si utiliza hosting, en muchos casos PHP seria manejado como CGI también. Si no desea ejecutar FastCGI o mod_perl, puede usar CGI::Application framework. CGI :: La aplicación se ejecutará también con FastCGI o mod_perl, pero a diferencia de Catalyst también se ejecutará como CGI.Tanto Catalyst como CGI :: Application también se pueden ejecutar con sus propios servidores web.

+0

Catalizador también se puede ejecutar como CGI, es muy lento. –

3

Si usas PHP o Perl es discutible desde una perspectiva de escalado, de forma muy similar a como la diferencia entre una aplicación web escrita en PHP y C es irrelevante. Si la diferencia realmente importara, estaríamos escribiendo C o ensamblando.

PHP es lento, pero eso no impide que Wikipedia, Facebook y Yahoo lo usen extensivamente.

Hay dos razones principales que no tiene importancia, desde el punto de vista de escala, el idioma que elija:

  1. usar un proxy inverso de almacenamiento en caché como el calamar. Al descargar la mayor parte de la carga de trabajo de apache, puede reducir drásticamente la carga de invocación de CGI.
  2. Escalar su nivel web es fácil. Es escalar su nivel de base de datos que es difícil. Siempre puede agregar otro servidor web a la granja. Si puede atender 1000 solicitudes por segundo con mod_php y 500 solicitudes por segundo con un CGI, si es más barato y más rápido para desarrollar el CGI, hágalo. Necesitará el doble de cabezales web, pero ya sea:
    1. Usted está en el 90% inferior de la web, y de todos modos solo necesita un servidor web.
    2. Estás en el 10% superior de la web y necesitas múltiples servidores web, pero tienes suficiente tráfico para justificar el costo adicional.

escoger el idioma que usted y su equipo pueden desarrollarse en forma más eficiente.

3

Aquí es un simple "hola mundo" ejemplo que se ejecuta bajo CGI utilizando el microframework Squatting web:

use strict; 
use warnings; 

{ 
    package MyApp; 
    use base 'Squatting'; 
    use base 'Squatting::On::CGI'; 
} 

{ 
    package MyApp::Controllers; 
    use Squatting ':controllers'; 

    our @C = (
     C(
      Index => [ '/' ], 
      get => sub { 
       my ($self) = @_; 
       my $v = $self->v; 
       $v->{say} = 'hello world!'; 
       $self->render('hello'); 
      }, 
     ), 
    ); 
} 

{ 
    package MyApp::Views; 
    use Squatting ':views'; 
    use HTML::AsSubs; 

    our @V = (
     V( 'html', 

      layout => sub { 
       my ($self, $v, @yield) = @_; 
       html (
        head (title('My CGI App')), 
        body (@yield), 
       )->as_HTML; 
      }, 

      hello => sub { 
       my ($self, $v) = @_; 
       p ($v->{say}); 
      }, 
     ), 
    ); 
} 

use CGI; 
my $q = CGI->new; 
MyApp->init; 
MyApp->relocate('/cgi-bin/myapp.cgi'); 
MyApp->cgi($q); 

Guardar como "myapp.cgi" y colocar en su cgi-bin.

Cuestiones relacionadas