2014-09-03 2 views
0

Ok voici ce que j'ai:Apache SSI inclut virtuelle à une mauvaise position

fichier Plain Apache avec

<html> 
<...> 
<!--#include virtual="/SSI/ssi_portlet.php" --> 
<...> 
</html> 

Mais le résultat est:

<html> 
<...> 
</html> 
Content of SSI PHP Script Result 

au lieu de:

<html> 
<...> 
Content of SSI PHP Script Result 
<...> 
</html> 

Alors pourquoi l'ajout d'apache le résultat du script au bas de la page à la place à l'endroit où la balise include est appelée?

L'Apache est un Apache/2.2.22 (Debian) avec PHP version 5.4.4-14 + deb7u12

+0

Pourquoi utilisez-vous SSI pour ce en premier lieu, si votre serveur semble soutenir PHP? Mélanger ces deux entraîne souvent des complications. Je recommande d'utiliser PHP pour inclure le fichier. – CBroe

+0

Je pourrais expliquer en détail, mais malheureusement, cela n'aiderait pas à résoudre le problème. Le client veut avoir ceci, et il travaille sur mon environnement de développement, mais le serveur de production semble configuré différemment. – Kaffee

Répondre

0

Je suis venu aussi à travers cette question en incluant un fichier PHP dans mon HTML de sortie, qui est généré par PHP. Lorsque vous reproduisez votre exemple, en utilisant un fichier HTML, je n'ai aucun problème. Pourrais-je être que vos fichiers HTML sont traités par un gestionnaire PHP?

Je ne sais pas si vous êtes toujours à la recherche d'une solution car la question est ancienne, mais vous ou quelqu'un d'autre pourriez essayer une solution que j'ai trouvée.

Solution:

Ajouter ces fonctions PHP à votre fichier "ssi_portlet.php":
ob_flush(); et ob_end_clean(); au début et ob_start(); jusqu'à la fin.

J'ai testé de nombreuses autres combinaisons en utilisant les fonctions de contrôle de sortie de PHP, php.net, c'est la seule qui a fonctionné de manière cohérente avec divers scénarios.

Dans votre exemple "SSI/ssi_portlet.php" pourrait ressembler à ceci:

<?php 
ob_flush(); ob_end_clean(); 
echo "Content of SSI PHP Script Result"; 
ob_start(); 

Je l'ai testé cette solution sur Windows en utilisant XAMPP exécutant Apache/2.4.12 (Win32) PHP/5.6.8 .

Raison:

Mon idée pourquoi ce problème se produit est encore un peu vague, alors ne hésitez pas à vous aider.

La sortie que PHP génère dans le fichier include semble interférer avec la sortie existante. Parce qu'ils utilisent tous deux un tampon pour sortir les données. (plus d'informations sur la mise en mémoire tampon de sortie PHP à la fin de ce post)

ob_flush();ob_flush(); va vider toute sortie existante et va nettoyer le tampon et désactiver si elle est désactivée. Cela s'assurera qu'il n'interfère avec aucune sortie/tampons existants.

ob_start(); est de s'assurer que tous les autres fichiers PHP SSI inclus fonctionneront correctement, mais ils doivent également contenir la même solution que ci-dessus. Cela étant dit, SSI inclus ne doit pas être utilisé pour inclure de grandes quantités de données ou pour créer une page dynamique. Comme la mise en mémoire tampon de sortie est un mécanisme permettant d'augmenter les performances, la désactivation de la mise en mémoire tampon des sorties n'est pas la meilleure solution. Certainement pas lors de la manipulation de beaucoup de sortie. Il serait préférable d'utiliser PHP include() à ces fins.

PHP output_buffering:

PHP peut utiliser un mécanisme appelé mise en mémoire tampon de sortie et il a un paramètre appelé "output_buffering", qui peut avoir 3 valeurs possibles. Citation de mon fichier php.ini:

; Output buffering is a mechanism for controlling how much output data 
; (excluding headers and cookies) PHP should keep internally before pushing that 
; data to the client. If your application's output exceeds this setting, PHP 
; will send that data in chunks of roughly the size you specify. 
; On = Enabled and buffer is unlimited. (Use with caution) 
; Off = Disabled 
; Integer = Enables the buffer and sets its maximum size in bytes. 
output_buffering=4096 
Questions connexes