vendredi, juin 16

Tutoriel : votre premier hack COMET en PHP

Comme promis, mais avec un peu (beaucoup ?) de retard, voici un petit tutoriel pour COMET en PHP pour nos amis développeurs.
L'exemple est simplissime, il s'agit de faire tourner un compteur à partir d'instructions serveur... pas vraiment utile me direz-vous, mais bien pratique pour comprendre les bases de la chose.

Les bases sont ici :
1- lancer un script PHP dans une frame cachée (retour des vieilles combines...)
2- génération d'un bout de javascript
3 - exécution du javascript dans la frame visible


1- mon script PHP caché


<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<meta http-equiv="Pragma" content="no-cache">
</HEAD>
<BODY BGCOLOR="blue">
<?php
//on génère ici un javascript
/** début du javascript appelant une fonction de la frame visible */
$jsFunPre = "<script language=JavaScript >parent.push('";

/** fin du JavaScript */
$jsFunPost = "')</script>";
{
$i = 0;
while (true)
{
$i++;
// envoi d'une ligne de JavaScript au client
print($jsFunPre."Page ".$i.$jsFunPost);
flush();
sleep(1);
}
}

?>

</BODY>
</HTML>

2- ma frame principale

<HTML>
<BODY BGCOLOR=black TEXT=white>
<H1>Attendez...</H1>

<div id="initLinkDiv">

<label>Texte poussé par le serveur :</label>
<textarea id="leftTextZone" name="leftTextZone" readonly>
</textarea>

<br>

</div>

</BODY>
</HTML>


3- la page contenant les 2 frames

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Pragma" content="no-cache">

<script LANGUAGE="JavaScript">
var pageStart="<HTML><HEAD></HEAD><BODY BGCOLOR=blue TEXT=white><H2>Server pushes: <P>";
var pageEnd="</H2></BODY></HTML>";

// la fonction javascript appelée par la frame cachée
function push(content)
{
window.frames['displayFrame'].document.getElementById("leftTextZone").value = content;
}

</script>
</HEAD>

<FRAMESET BORDER=0 COLS="*,*,0">
<!-- frame visible -->
<FRAME SRC="frameToDisplay.html" NAME="displayFrame" SCROLLING=yes>

</frame>

<!-- frame cachée-->
<FRAME SRC="hiddenFrame.php" NAME="pushletFrame" BORDER=0 SCROLLING=no>
</frame>
</FRAMESET>

</HTML>


Normalement, si vous avez bien nommé vos fichiers ça devrait marcher... jusqu'au timeout de votre serveur (30 secondes par défaut) !
Je reste, bien entendu, à disposition pour répondre à vos questions...

6 commentaires:

Thanh a dit…

Merci,

je jette un oeil à tout ça dès que possible :) .

Anonyme a dit…

Auriez-vous un autre exemple qui tourne avec un serveur apache ?
Par exemple, qui envoie l'heure toutes les minutes.

JB Boisseau a dit…

Pour envoyer l'heure toutes les minutes, il suffit de remplacer sleep(1) par sleep(60) et de modifier le timeout du serveur dans php.ini (ou dans le code avec la commande set_time_limit()... ce qui ne fonctionne pas en mode safe !).

Liko a dit…

Entre nous pour afficher l'heure y a quand meme plus simple...

Passer par une boucle en js ça me semble plus approprié dans un cas comme ça.

JB Boisseau a dit…

Le but de ce tutoriel, ce n'est pas d'afficher l'heure : c'est de donner un exemple de fonctionnement de COMET !
De plus, une boucle en javascript te donnera l'heure du poste client, pas celle du serveur (puisque c'est tout l'intérêt de COMET !)

tom a dit…

Lol Liko comme t trop bete !!! tu laisses un com et tu sais meme pas de koi ca parle !!!!