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é: 8 836 / 391

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;
}
?>

Fichier Zip

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

Historique

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.

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

problème de timeout [ par GoldPegasus ] j'ai un probl&#232;me de time out. je demande de r&#233;aliser un traitement a une page php mais le traitement d&#233;passe les diff&#233;rents time o Info sur settimelimit [ par Arnauti ] Bonjour, je crois savoir que la fonction settimelimit() sert &#224; modifier le timeout de php mais comment l'utiliser dans un script car chez Traitement de date avant requete sql [ par sharkit ] Bonjour &#224; toute la communaut&#233;,Voici mon probl&#232;me : J'ai un moteur de recherche par date (2 champs :&nbsp;debut et fin ) dont les dates Traitement php sur un portion de fichier xml !!!! [ par charloteuf ] Hello,J'ai bien lu les sujets pr&#233;c&#233;dents, mais je me demande si le parsing xml est possible pour ma m&#233;thode.En fait j'ai un fchier xml Inserer des donnees dans ma base de donnee. [ par achillechimi ] Bonjour, j,essai depuis des jours d,inserer environ 45 donnees dans une table(tableau) de ma base de donnees, jusqu,ici sans succes.Je voudrais savoir Récupération de données aléatoire avec un SELECT [ par frfx ] Bonjour,J'ai&nbsp;fait une base de donn&#233;es clients avec mysql, l'insertion ou la modification de donn&#233;es s'eff&#233;ctue sans probl&#232;me, Gerer un apostrophe et la recuperation des donnees dans un champs de formulaire [ par murrigane ] Bonjour ! J'ai encore un soucis avec mon histoire de formulaire (a la fin je vais finir par devenir une pro sur le sujet...) Je recupere des val while il ecrit plusieur fois les reponse [ par Pauldb ] bonjour voila j'ai un script qui fonctionne (presque) tres bien sauf que lorsqu'il doit &#233;crire les donn&#233;es ca ecrit une fois la phrase la pr XmlHttpRequest (AJAX) [ par BenXbox ] Salut à tous, Je cherche à actualiser une page avec le XmlHttpRequest(AJAX) toutes les 20 secondes. Cette page s'appel EnLigne.php Merci d'avance. enlever un while [ par spiesalex ] Salut tous le monde, &lt;?php include('connect.php'); $reponse = mysql_query("SELECT * FROM tribunat ORDER BY ID DESC LIMIT 0,70"); while ($donnees =


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,827 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.