2011-02-10 9 views
6

OK, questo potrebbe sembrare un po 'pazzo, ma portami qui per un minuto.parser SSI scritto in PHP?

Sto lavorando su un sito in cui lo standard è quello di utilizzare SSI per includere intestazioni, piè di pagina e menu. I file inclusi usano condizionali SSI per gestire diversi browser, alcuni #include nesting e alcuni #set/#if trucchi per evidenziare la pagina corrente nel menu. In altre parole, è più che semplice # include direttive nell'SSI.

Sono sicuro che alcuni potrebbero discutere con l'estetica, ma in realtà funziona abbastanza bene, per HTML statico.

Ora, il problema: mi piacerebbe solo "# include" le stesse SSI-analizzati intestazione e piè di pagina html file dal mio script PHP, evitando così la duplicazione del codice e mantenendo aspetto uniforme del sito. Se PHP fosse in esecuzione nel solito ambiente mod_php, sarei in grado di farlo usando la funzione virtual() di PHP. Sfortunatamente, il sito utilizza FastCGI/suexec per eseguire PHP (in modo che ogni VirtualHost possa essere eseguito come un utente diverso) e ciò interrompe virtual().

Ho usato un parser SSI abbastanza semplice che ho scritto in PHP (gestisce #include e alcune semplici istruzioni #if), ma mi piacerebbe una soluzione più generale. Quindi, prima che impazzisco e scrivo un parser SSI probabilmente più bacato e completo, qualcuno sa di un parser SSI completo scritto in PHP? Naturalmente, sono aperto anche ad altre soluzioni che funzionano secondo i vincoli che ho delineato.

Grazie mille per il vostro tempo.

+1

Non chiamerei i file inclusi SSI con "n. # Include" nidificazione e "# set' /' # if "inganno" * statico * HTML. ;) Altrimenti, domanda interessante. : D – deceze

+0

L'unica implementazione che conosco è http://nanoweb.si.kz/manual/mod_include.html - ma che implementa solo le tre funzioni standard e non costituisce molto un parser. – mario

+0

@deceze: Beh ... sono "statici" nel senso che ogni file HTML richiesto dall'utente produce sempre lo stesso output. Sono d'accordo, tuttavia, che i file inclusi in SSI non sono affatto statici. –

risposta

2

Date un'occhiata a ESI: http://en.wikipedia.org/wiki/Edge_Side_Includes

è possibile creare un PHP-proxy per gestirli, è la HttpCache in Symfony2: https://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

o utilizzare un proxy HTTP come per unghie, più performante di Symfony2. ..

+0

Idee interessanti. Sfortunatamente, non ho il pieno controllo del server, quindi non posso installare un proxy completo come Varnish. Symfony sembra utile, e sicuramente lo esaminerò ulteriormente per altri scopi, ma spero davvero in una soluzione notevolmente più piccola. Symfony sembra essere più di 20 megabyte per un'installazione di base. Non so quanto sia buono a caricare in modo modulare, ma sembra decisamente eccessivo per questo problema relativamente semplice. –

1

Mi rendo conto che questa è una domanda vecchia, ma mi sono imbattuto in quello stesso problema alcuni anni fa, sebbene con un'implementazione perl. Sono andato avanti e biforcato un tentativo precedente e ottenuto abbastanza lontano in attuazione di un apache completo (2.2.22) mod_include emulatore/parser come modulo Perl http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pm Subito dopo che ho trovato apache output filters, e capito quanto perfetta una soluzione che è per le mie esigenze . Fondamentalmente, puoi dire ad apache di analizzare l'output del tuo script come se fosse un file .shtml o .php (o qualsiasi altra cosa). Quindi puoi generare un markup SSI da uno script perl o php (o qualsiasi altra cosa), e farlo analizzare da Apache. In questo modo si può fare (nel file .htaccess):

AddOutputFilter INCLUDES .cgi 

Questo è per i normali file CGI, ma attenzione, questo aggiunge un po 'di testa a tutti i file .cgi in corso di esecuzione, così quello che in realtà fare è creare un'estensione speciale in modo che venga eseguito come un CGI che poi ha analizzato la sua produzione, senza avere la testa ai normali file CGI:

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

per php si può solo fare qualcosa di simile:

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

e quello dovrebbe fare il trucco! Spero che aiuti qualcuno là fuori.