2011-02-10 8 views
6

OK, esto puede sonar un poco loco, pero tengan paciencia conmigo por un minuto.Analizador de SSI escrito en PHP?

Estoy trabajando en un sitio donde la norma es el uso de SSI para incluir los encabezados, pies de página y los menús. Los archivos incluidos usan condicionales SSI para manejar diferentes navegadores, algunos #include nesting y algunos #set/#if trickery para resaltar la página actual en el menú. En otras palabras, es más que solo instrucciones #include en el SSI.

estoy seguro de que algunos podrían argumentar con la estética, pero en realidad funciona bastante bien, para HTML estático.

Ahora, el problema: me gustaría simplemente "#incluir" los mismos archivos html de encabezado y pie de página procesados ​​con SSI de mis scripts PHP, evitando la duplicación de código y manteniendo el aspecto uniforme del sitio. Si PHP se ejecutara en el entorno usual de mod_php, podría hacer eso usando la función virtual() de PHP. Desafortunadamente, el sitio está utilizando FastCGI/suexec para ejecutar PHP (para que cada VirtualHost pueda ejecutarse como un usuario diferente), y esto rompe virtual().

He estado usando un analizador de SSI bastante simple que escribí en PHP (maneja #includes, y algunas declaraciones #if realmente simples), pero me gustaría una solución más general. Entonces, antes de volverme loco y escribir un analizador de SSI más completo, probablemente con errores, ¿alguien sabe de un analizador de SSI completo escrito en PHP? Naturalmente, también estoy abierto a otras soluciones que funcionan bajo las limitaciones que he descrito.

Muchas gracias por su tiempo.

+1

No llamaría a los archivos incluidos en SSI con "' # include' nesting y '# set' /' # if' trickery "* static * HTML. ;) De lo contrario, pregunta interesante. : D – deceze

+0

La única implementación que conozco es http://nanoweb.si.kz/manual/mod_include.html, pero eso solo implementa las tres funciones estándar, y no constituye mucho de un analizador. – mario

+0

@deceze: Bueno ... son "estáticos" en el sentido de que cada archivo HTML solicitado por el usuario produce el mismo resultado cada vez. Sin embargo, estoy de acuerdo en que los archivos incluidos en SSI no son estáticos en absoluto. –

Respuesta

2

Tome un vistazo a ESI: http://en.wikipedia.org/wiki/Edge_Side_Includes

Se puede crear un PHP-proxy para manejarlos, es el HttpCache en Symfony2: https://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

o utilizar un proxy HTTP como barniz, con más prestaciones que Symfony2. ..

+0

Ideas interesantes. Lamentablemente, no tengo control total sobre el servidor, por lo que no puedo instalar un proxy completo como Varnish. Symfony parece útil, y definitivamente lo investigaré más a fondo para otros fines, pero realmente espero una solución considerablemente más pequeña. Symfony parece tener más de 20 megabytes para una instalación base. No sé qué tan bueno es cargando modularmente, pero definitivamente parece una exageración severa para este problema comparativamente simple. –

1

Me doy cuenta de que esta es una vieja pregunta, pero me encontré con el mismo problema hace unos años, aunque con una implementación perl. Seguí adelante y bifurcada un intento anterior y llegué bastante lejos en la implementación de un apache completa (2.2.22) mod_include emulador/analizador como un módulo Perl http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pm Poco después de haber encontrado Apache output filters, y se dio cuenta de lo perfecto que es una solución para mis necesidades . Básicamente, puede decirle a apache que analice el resultado de su script como si fuera un archivo .shtml o .php (o lo que sea). Por lo tanto, puede generar el marcado SSI a partir de un script perl o php (o lo que sea) y hacer que apache lo analice. Esta es la forma en que puede hacerlo (en su archivo .htaccess):

AddOutputFilter INCLUDES .cgi 

Eso es para los archivos cgi normales, pero cuidado, esto agrega un poco de cabeza a todos los archivos .cgi ser ejecutado, así que lo que en realidad hacer es crear una extensión especial para que se ejecute como un CGI que se ha analizado su salida, sin tener la sobrecarga añadida a los archivos normales CGI:

<Files ~ ".pcgi$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pcgi 
</Files> 

para php que sólo podría hacer algo como:

<Files ~ ".pphp$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pphp 
</Files> 

y eso debería hacer el truco! Espero que ayude a alguien por ahí.