Bonjour à tous, le titre n'est pas très parlant mais mon problème est relativement simple.

J’ai un serveur sur lequel tourne un script PHP en continu, ce dernier est chargé de télécharger des fichiers, les renommer, les déplacer, les compresser etc.

Toutes ces actions sont stockées dans une base de données MySQL. L’objectif est de pouvoir observer l’avancée des opérations via une interface web (voir quels fichiers sont en cours de téléchargement, quels fichiers ont été déplacés etc.)

Cette interface Web est actuellement en place mais la contrainte c’est qu’il y a plusieurs opérations par minute et que je suis obligé de rafraîchir ma page web pour actualiser les informations.

Je cherche donc une solution qui permettrait de pouvoir les visionner en direct : dès que PHP effectue une opération sur un fichier, ça apparaît sur mon interface Web.

J’ai pensé à Node.js et Socket.io mais si je comprends bien il faudrait pouvoir envoyer des emit directement depuis le code PHP, je ne pense pas que cela soit faisable ?

Sinon, existe-t-il un « outil » qui écoute en permanence une base de données et qui détecte dès qu’un changement se produit sur celle-ci ?

Merci d’avance pour votre aide

8 réponses


Merci pour ta réponse, donc si je comprends bien dès que PHP effectue une opération, il faut qu'il enregistre le timestamp dans un fichier texte, mais comment ensuite sur mon interface web je détecte que le timestamp dans ce fichier a été modifié ?

Tu peux renvoyer tes résultats en mode 'chunked', chaque chunk s'affichera dés qu'il sera emis par php.

Salut Huggy, peux-tu détailler un peu plus ? Je ne sais pas du tout à quoi correspond un "chunk" :x

En mode chunk, au lieu que la page soit envoyée d'un seul bloc, elle est envoyée par blocs successifs appelés 'chunk'
chaque chunk doit être précédé de sa taille.
pour envoyer un chunk il suffit de faire un flush();
voici un exemple de script qui envoie des chunk toutes les secondes

<?php
ob_start();
?>
<!DOCTYPE html> 
<html>
<head></head>
<body>
<?php
function dump_chunk($chunk) {
    echo sprintf("%x\r\n%s\r\n", strlen($chunk), $chunk);
    flush();
}

ob_end_flush();
flush();
ob_flush();
for ($i = 0; $i < 1000; $i++) {
    sleep(1);
    dump_chunk('Sending data chunk ' . ($i + 1) . ' of 1000 <br />');
    ob_flush();
}
sleep(1); // needed for last animation

?>
</body>
</html>

Le truc c'est que j'ai du mal à comprendre comment mettre ça en place dans mon cas. Mon PHP effectue des opérations, à chaque opération j'envoie un chunk à la page web de mon interface, mais comment je la "mets sur écoute" pour qu'elle soit prête à intercepter les chunks émis par le serveur ?

La page contient dans son entête "Transfer-encoding : chunked"
C'est le navigateur qui sait que la page n'est pas finie, et il attend les morceaux
Normalement la page doit se terminer par un bloc de taille 0

echo "0\r\n\r\n";
flush();

sur Firefox , l'affichage dépend des balises (a tester) mais sur chrome, l'exemple du dessus fonctionne.

D'accord mais comment je les récupère et je les traite les morceaux ? Et que contient les chunk ? Du texte ? Du json ? Merci de ton aide

Les chunk contiennent du text/html.
Les sites comme FB, Linkedin utilisent ce principe, chaque bloc représente une pagelet qui est construite séparement et est envoyée sous forme de chunk. Si l'ordre des chunk est important il faut faire appel au javascript pour replacer les blocs sinon les blocs s'affichent dans l'ordre d'arrivée.