Generer un volume important de donnees sans se heurter au timeout php

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.