begin process at 2008 07 25 13:09:46
1 216 226 membres
190 nouveaux aujourd'hui
14 180 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GENERER UN VOLUME IMPORTANT DE DONNEES SANS SE HEURTER AU TIMEOUT PHP


Information sur la source

Catégorie :Astuces Classé sous : settimelimit, timeout, ajax, donnees, traitement Niveau : Initié Date de création : 05/10/2006 Date de mise à jour : 06/10/2006 12:44:38 Vu / téléchargé: 7 084 / 353

Note :
Aucune note

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

Ceci est une petite astuce sur laquelle je travaille en ce moment.
Ce n'est pas parfait, mais ça fonctionne.
A vous de l'adapter à vos besoins...quant à moi, je travaillerai plus avant dans ce sens.

Cette astuce vous permet de générer un volume important de données avec PHP, sans être bloqué par le timeout (time_limit) de PHP.
Dans ce code, j'ai fixé le timeout à 5 secondes, et je m'amuse à afficher les chiffres de 1 à 50000
J'utilise les requêtes XMPLHTTP (AJAX) pour ça.

Ajout d'une version pour fichiers texte...avec cette fois, un timeout fixé à 2 secondes, et un fichier de 5000 lignes.

Source

  • Fichier buffer.php
  • <?php
  • set_time_limit (5);
  • $iSize = filesize ('texte.txt');
  • ?>
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  • <head>
  • <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  • <script type="text/javascript">
  • if (window.XMLHttpRequest) {
  • oXmlhttp = new XMLHttpRequest();
  • } else if (window.ActiveXObject) {
  • oXmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  • }
  • function display (iLine, iLimit, iStep) {
  • var j = iLine + iStep;
  • oXmlhttp.open('POST','buffer_.php');
  • oXmlhttp.onreadystatechange=function() {
  • if (oXmlhttp.readyState==1) {
  • document.getElementById ('msg').firstChild.data = 'Chargement';
  • }
  • if (oXmlhttp.readyState==2) {
  • document.getElementById ('msg').firstChild.data = 'Chargé';
  • }
  • if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {
  • document.getElementById ('msg').firstChild.data = 'OK';
  • document.getElementById ('divContent').firstChild.data += oXmlhttp.responseText;
  • if (j < iLimit) {
  • display (j, iLimit, iStep);
  • }
  • }
  • }
  • oXmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'iLine='+iLine;
  • oXmlhttp.send (data);
  • }
  • function displayFile (iOctet, iLimit, iStep, sFile) {
  • var j = iOctet + iStep;
  • oXmlhttp.open('POST','bufferF_.php');
  • oXmlhttp.onreadystatechange=function() {
  • if (oXmlhttp.readyState==1) {
  • document.getElementById ('msg').firstChild.data = 'Chargement';
  • }
  • if (oXmlhttp.readyState==2) {
  • document.getElementById ('msg').firstChild.data = 'Chargé';
  • }
  • if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {
  • document.getElementById ('msg').firstChild.data = 'OK';
  • document.getElementById ('divContent').firstChild.data += oXmlhttp.responseText;
  • if (j < iLimit) {
  • displayFile (j, iLimit, iStep, sFile);
  • }
  • }
  • }
  • oXmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'iOctet='+iOctet+'&iStep='+iStep+'&sFile='+sFile;
  • oXmlhttp.send (data);
  • }
  • </script>
  • </head>
  • <body>
  • <div id="msg">Attente</div>
  • <div id="divContent" style="width: 500px;">&nbsp;</div>
  • <script type="text/javascript">
  • displayFile (0, <?php echo $iSize; ?>, 1024, 'texte.txt');
  • </script>
  • </body>
  • </html>
  • ------------------------------------
  • Fichier buffer_.php
  • <?php
  • set_time_limit (5);
  • if (isset ($_POST['iLine'])) {
  • $sChaine = '';
  • for ($i = $_POST['iLine']; $i < $_POST['iLine'] + 10; $i ++) {
  • $sChaine.= $i.' | ';
  • }
  • echo $sChaine;
  • }
  • ?>
  • ---------------------------------------------------
  • Fichier bufferF_.php
  • <?php
  • set_time_limit (2);
  • if (isset ($_POST['iOctet'])) {
  • $sChaine = '';
  • $fp = fopen ($_POST['sFile'], 'r');
  • fseek ($fp, $_POST['iOctet'], SEEK_SET);
  • $sChaine .= fread ($fp, $_POST['iStep']);
  • fclose ($fp);
  • echo $sChaine;
  • }
  • ?>
Fichier buffer.php

<?php
set_time_limit (5);
$iSize = filesize ('texte.txt');
?>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
		<script type="text/javascript">
		if (window.XMLHttpRequest) {
			oXmlhttp = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			oXmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}

		function display (iLine, iLimit, iStep) {
			var j = iLine + iStep;
			oXmlhttp.open('POST','buffer_.php');
			oXmlhttp.onreadystatechange=function() {
				if (oXmlhttp.readyState==1) {
					document.getElementById ('msg').firstChild.data = 'Chargement';
				}
				if (oXmlhttp.readyState==2) {
					document.getElementById ('msg').firstChild.data = 'Chargé';
				}
				if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {
					document.getElementById ('msg').firstChild.data = 'OK';
					document.getElementById ('divContent').firstChild.data += oXmlhttp.responseText;
					if (j < iLimit) {
							display (j, iLimit, iStep);
					}
				}
			}
				oXmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				var data = 'iLine='+iLine;
				oXmlhttp.send (data);
		}
		function displayFile (iOctet, iLimit, iStep, sFile) {
			var j = iOctet + iStep;
			oXmlhttp.open('POST','bufferF_.php');
			oXmlhttp.onreadystatechange=function() {
				if (oXmlhttp.readyState==1) {
					document.getElementById ('msg').firstChild.data = 'Chargement';
				}
				if (oXmlhttp.readyState==2) {
					document.getElementById ('msg').firstChild.data = 'Chargé';
				}
				if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {
					document.getElementById ('msg').firstChild.data = 'OK';
					document.getElementById ('divContent').firstChild.data += oXmlhttp.responseText;
					if (j < iLimit) {
							displayFile (j, iLimit, iStep, sFile);
					}
				}
			}
				oXmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				var data = 'iOctet='+iOctet+'&iStep='+iStep+'&sFile='+sFile;
				oXmlhttp.send (data);
		}
		</script>
	</head>
	<body>
		<div id="msg">Attente</div>
		<div id="divContent" style="width: 500px;">&nbsp;</div>

		<script type="text/javascript">
		displayFile (0, <?php echo $iSize; ?>, 1024, 'texte.txt');
		</script>
	</body>
</html>

------------------------------------
Fichier buffer_.php

<?php
set_time_limit (5);
if (isset ($_POST['iLine'])) {
	$sChaine = '';
	for ($i = $_POST['iLine']; $i < $_POST['iLine'] + 10; $i ++) {
		$sChaine.= $i.' | ';
	}
	echo $sChaine;
}
?>

---------------------------------------------------
Fichier bufferF_.php

<?php
set_time_limit (2);
if (isset ($_POST['iOctet'])) {
	$sChaine = '';
	$fp = fopen ($_POST['sFile'], 'r');
	fseek ($fp, $_POST['iOctet'], SEEK_SET);
	$sChaine .= fread ($fp, $_POST['iStep']);
	fclose ($fp);
	echo $sChaine;
}
?>
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

06 octobre 2006 12:44:38 :
Ajout d'une version pour fichiers texte...avec cette fois, un timeout fixé à 2 secondes, et un fichier de 5000 lignes.
  • signaler à un administrateur
    Commentaire de kankrelune le 05/10/2006 14:41:03

    Ouep pas con... moi j'avais pensé il fut un temps à un système de header('Location pour un traitement par étape (genre mailling list avec beaucoups d'abonnés)... après tout dépend du type de traitement avec le header on ne peut pas afficher comme fait ta technique... .. .

    @ tchaOo°

  • signaler à un administrateur
    Commentaire de malalam le 05/10/2006 14:43:50 administrateur CS

    Ouais l'avantage ici c'est d'avoir un affichage "asynchrone". Ca affiche au fur et à mesure que ça lit.
    Bon...je ne suis pas pleinement satisfait. A la base, je voulais faire ça pour lire un flux xml bien lourd présent dans un fichier. Mais ce système ne le permettra jamais. Par contre, ça fonctionne pour des tableaux, des requêtes sql, et certains types de fichiers (je ferai des exemples que j'ajouterai au fur et à mesure).
    J'étais parti sur la bufferisation (ob_start()...), mais bon...pas efficace lol.
    je suis preneur de toutes autres idées!

  • signaler à un administrateur
    Commentaire de taz_iup le 05/10/2006 15:26:50

    J'aurais plutot pense jsutement à virer la bufferisation... avec quelques flush de temps a autres pour envoyer morceau par morceau le code html au navigateur... ex :

    <?php

    for ($i=0; i<1000000; $i++) {
        echo "Ligne $i<br/>";
        flush ();
    }

    ?>

    ce qui a pour effet d'envoyer le contenu html au navigateur ligne / ligne

  • signaler à un administrateur
    Commentaire de taz_iup le 05/10/2006 15:28:02

    Autant pour moi il manque un $(for ($i=0; $i<1000000; $i++))

  • signaler à un administrateur
    Commentaire de malalam le 05/10/2006 15:35:52 administrateur CS

    Non, de cette manière, ça ne passera pas outre le timeout PHP. Mets un set_time_limit (5); devant ton code, et lance le (en corrigeant le $i manquant ;-) ), et tu verras.
    cec dit, y a de l'idée oui, mais je ne suis pas certain qu'on puisse arriver à un truc concluant avec la bufferisation.

  • signaler à un administrateur
    Commentaire de kankrelune le 05/10/2006 15:51:51

    Non la bufferisation n'a rien a voir... le seul truc que tu obtiendra c'est d'afficher ligne par ligne mais tu ne passera pas outre le timeout... .. .

    @ tchaOo°

  • signaler à un administrateur
    Commentaire de taz_iup le 05/10/2006 17:04:19

    on peut pas le modifier le timeout ? genre un set_time_limit (0).

    http://fr3.php.net/manual/fr/function.set-time-limit.php

  • signaler à un administrateur
    Commentaire de malalam le 05/10/2006 17:26:49 administrateur CS

    Lol, dans ce cas, quel intérêt d'essayer de contourner le problème...?
    Tu vois bien que cette fonction, je l'ai mise dans mon script (set_time_limit()).
    On peut le modifier SI le serveur l'autorise, et/ou si on a la main sur le serveur et le php.ini.
    Mais là ce qui m'intéresse, c'est : si on ne le peut pas, ou si on ne le veut pas. Et dans mon cas perso à moi : je ne le VEUX pas.

  • signaler à un administrateur
    Commentaire de FhX le 05/10/2006 19:01:16

    Bon, ca marche et chui toujours content quand ca marche.

    Jvais être le seul boulet à critiquer mais :
    "# if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {
    #                     document.getElementById ('msg').firstChild.data = 'OK';
    #                 }
    #                 if (oXmlhttp.readyState==4 && oXmlhttp.status == 200) {"

    2 fois le même if() ? :p

    M'enfin voila ;)

  • signaler à un administrateur
    Commentaire de guill76 le 05/10/2006 19:15:58

    Salut étant curieux du résultat, j'ai exécuté ton script :
    Parse error: parse error, unexpected T_STRING in D:\Apache Group\Apache2\www\fourretout\buffer.php on line 4
    j'ai l'impression qu'il ya 1 interpretation php de la ligne <?xml ?> et pourtant t'as bien spécifié au début les balises <?php ?> comprends pas.

  • signaler à un administrateur
    Commentaire de guill76 le 05/10/2006 19:20:03

    Oups j'ai rien dit:
    short_open_tag = On

  • signaler à un administrateur
    Commentaire de guill76 le 05/10/2006 19:27:27

    Au fait ce serait pas mon script de redimenssionnement d'image qui t'aurait donné cette idée??

  • signaler à un administrateur
    Commentaire de malalam le 06/10/2006 08:08:30 administrateur CS

    FhX => heu...oups. Lol.

    Guill76 => heu non, désolé, pourquoi...? J'ai cette idée depuis près de 2 ans, mais je n'avais jamais essayé. Et là, j'ai une nécessité, qui m'a poussé à essayer.

  • signaler à un administrateur
    Commentaire de Mastronic le 16/10/2006 13:24:35

    script sympas.. j'ai deja ue le probleme de Time-out.. et donc j'ai voulu testé le resultat du script sur FREE.FR.

    syntax error, unexpected T_STRING in
    .../buffer.php on line 5

    certainement à cause de short_open_tag = On  ( Merci Guill76)
    mais nous ne pouvons modifier le parametre, donc que faire?


    Second question: j'ai bien envie de comprendre ce script, existe t'il un site pour comprendre les fonctionalité de XMPLHTTP (AJAX)

    D'avance Merci.

  • signaler à un administrateur
    Commentaire de malalam le 16/10/2006 13:31:27 administrateur CS

    Tu vires la ligne <?xml...> des pages où il y en a une.

    Il existe des tas de tutos pour xmlhttp, si tu tapes ça dans google, tu vas en trouver tout un tas :-)

  • signaler à un administrateur
    Commentaire de kankrelune le 16/10/2006 13:42:50

    Plutot que de virer <?xml ...> tu le met dans un echo

    echo '<?xml version="1.0" encoding="ISO-8859-1"?>';

    @ tchaOo°

Ajouter un commentaire

Pub



Appels d'offres

Animation Flash alimen...
Budget : 6 000€
Creation portail video
Budget : 3 000€
Site de e-commerce
Budget : 5 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS