begin process at 2008 07 21 00:26:22
1 213 521 membres
422 nouveaux aujourd'hui
14 167 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 !

[PHP5] NOTIMEOUT PACKAGE


Information sur la source

Catégorie :Astuces Classé sous : flush, timeout, time, process, limit Niveau : Expert Date de création : 09/10/2006 Date de mise à jour : 24/10/2006 10:44:21 Vu / téléchargé: 4 098 / 258

Note :
9,67 / 10 - par 3 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Ce package est une version...heu...packagée :-) de mes astuces pour éviter le time limit de PHP.
En clair, cela vous permet de faire un gros traitement sans être embêté par le time limit de PHP.
Vous pourrez lire un fichier de 50000 lignes, et l'afficher, même si ça prend 5mn, avec un time limit de 30 secondes, sans aucun problème. Pareil pour une grosse requête.
Le secret ? Les requêtes XMLHTTP (aka Ajax).

Il y a un readme.txt dans le zip, c'est pour l'instant en anglais, je mettrai ça en français quand j'aurai le temps.
De toute façon, 4 fichiers indexX.php vous montreront comment utiliser les 4 types de process disponibles à ce jour dans le package. C'est relativement simple.

N'hésitez pas à me poser des questions si vous rencontrez un problème d'incompréhension.

PS : pour utiliser index2.php vous devrez d'abord créer une table mysql nommée 'tests', et utiliser le fichier sql fourni pour insérer les données.
Ou alors, vous modifiez l'instanciation de la classe pour utiliser une de vos tables :-)

Source

  • <?php
  • /**
  • @author : Johan Barbier <johan.barbier@gmail.com>
  • @Version : 2006/10/09
  • */
  • class noTimeOut {
  • private $aProps = array (
  • 'TYPE' => null,
  • 'DB' => null,
  • 'HOST' => null,
  • 'LOGIN' => null,
  • 'PWD' => null,
  • 'QUERY' => null,
  • 'DBSERVER' => null,
  • 'FILE' => null,
  • 'START' => null,
  • 'LIMIT' => null,
  • 'STEP' => null
  • );
  • private $aDbServers = array (
  • 'MYSQL', 'MSSQL'
  • );
  • private $aTypes = array (
  • 'DEFAULT', 'FILE_OCTET', 'FILE_PATTERN', 'FILE_LINE', 'DB'
  • );
  • public function __construct () {
  • // might be useful later
  • }
  • public function __set ($sType, $sVal) {
  • try {
  • if (!array_key_exists ($sType, $this -> aProps)) {
  • throw new Exception ($sType.' is not a valid property');
  • }
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • try {
  • switch ($sType) {
  • case 'TYPE':
  • if (!in_array ($sVal, $this -> aTypes)) {
  • throw new Exception ($sVal.' is not a valid TYPE value');
  • }
  • break;
  • case 'FILE':
  • if (!file_exists ($sVal)) {
  • throw new Exception ('File '.$sVal.' has not been found');
  • }
  • break;
  • case 'DBSERVER':
  • if (!in_array ($sVal, $this -> aDbServers)) {
  • throw new Exception ('DB SERVER '.$sVal.' is not supported');
  • }
  • break;
  • default :
  • break;
  • }
  • $this -> aProps[$sType] = $sVal;
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • }
  • private static function isNull () {
  • foreach (func_get_args() as $sArg) {
  • if (is_null ($sArg)) {
  • return false;
  • }
  • }
  • return true;
  • }
  • public function flushMe ($aWork = null) {
  • try {
  • if (is_null ($this -> aProps['TYPE'])) {
  • throw new Exception ('TYPE has not been defined');
  • }
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • try {
  • switch ($this -> aProps['TYPE']) {
  • case 'DB':
  • if (false === self::isNull ($this -> aProps['DB'], $this -> aProps['HOST'], $this -> aProps['LOGIN'], $this -> aProps['PWD'], $this -> aProps['QUERY'], $this -> aProps['DBSERVER'], $this -> aProps['START'], $this -> aProps['STEP'])) {
  • throw new Exception ('DB properties have not been fully defined');
  • }
  • $mTmp = $this -> getDB ();
  • break;
  • case 'FILE_OCTET':
  • if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
  • throw new Exception ('FILE properties have not been fully defined');
  • }
  • $mTmp = $this -> getFileOctet ();
  • break;
  • case 'DEFAULT':
  • if (false === self::isNull ($this -> aProps['START'], $this -> aProps['STEP'], $aWork)) {
  • throw new Exception ('DEFAULT properties have not been fully defined');
  • }
  • $mTmp = $this -> getDefault ($aWork);
  • break;
  • case 'FILE_PATTERN':
  • if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
  • throw new Exception ('FILE properties have not been fully defined');
  • }
  • $mTmp = $this -> getFilePat ();
  • break;
  • case 'FILE_LINE':
  • if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
  • throw new Exception ('FILE properties have not been fully defined');
  • }
  • $mTmp = $this -> getFileLine ();
  • break;
  • }
  • return $mTmp;
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • }
  • private function getFilePat () {
  • $sTmp = '';
  • try {
  • if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
  • throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
  • }
  • if ( -1 === (fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
  • throw new Exception ('Failed to modify cursor on : '.$this -> aProps['FILE']);
  • }
  • while (false === ($iEnd = strpos ($sTmp, $this -> aProps['STEP'])) && !feof ($fp)) {
  • $sTmp .= @fgets ($fp, 1024);
  • }
  • $sTmp = substr ($sTmp, 0, $iEnd + strlen ($this -> aProps['STEP']));
  • @fclose ($fp);
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • return $sTmp;
  • }
  • private function getDefault ($aWork) {
  • try {
  • if (!is_array ($aWork)) {
  • throw new Exception ('Parameter must be an array');
  • }
  • $aTmp = array ();
  • for ($i = $this -> aProps['START']; $i < $this -> aProps['START'] + $this -> aProps['STEP']; $i ++) {
  • if (isset ($aWork[$i])) {
  • $aTmp[] = $aWork[$i];
  • }
  • }
  • return $aTmp;
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • }
  • private function getFileOctet () {
  • try {
  • $sTmp = '';
  • if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
  • throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
  • }
  • if ( -1 === (@fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
  • throw new Exception ('Failed to modify cursor on : '.$this -> aProps['FILE']);
  • }
  • if (false === ($sTmp .= @fread ($fp, $this -> aProps['STEP']))) {
  • throw new Exception ('Failed to read file : '.$this -> aProps['FILE']);
  • }
  • @fclose ($fp);
  • return $sTmp;
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • }
  • private function getFileLine () {
  • $sTmp = '';
  • try {
  • if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
  • throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
  • }
  • if ( -1 === (fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
  • throw new Exception ('Failed to modify cursor on : '.$this -> aProps['FILE']);
  • }
  • $iEnd = 0;
  • while ($iEnd < $this -> aProps['STEP']) {
  • $sTmp .= @fgets ($fp);
  • $iEnd ++;
  • }
  • @fclose ($fp);
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • return $sTmp;
  • }
  • private function getDB () {
  • $sDb = strtolower ($this -> aProps['DBSERVER']);
  • try {
  • $rLink = @call_user_func ($sDb.'_connect', $this -> aProps['HOST'], $this -> aProps['LOGIN'], $this -> aProps['PWD']);
  • if (false === $rLink) {
  • throw new Exception ('Failed to connect to host : '.$this -> aProps['HOST']);
  • }
  • if (false === (@call_user_func ($sDb.'_select_db', $this -> aProps['DB'], $rLink))) {
  • throw new Exception ('Failed to select database : '.$this -> aProps['DB']);
  • }
  • if (false === ($rRes = @call_user_func ($sDb.'_query', $this -> aProps['QUERY'], $rLink))) {
  • throw new Exception ('Query failed : '.$this -> aProps['QUERY']);
  • }
  • if (false === (@call_user_func ($sDb.'_data_seek', $rRes, $this -> aProps['START']))) {
  • throw new Exception ('Query failed : '.$this -> aProps['QUERY']);
  • }
  • $iCpt = 0;
  • $aTmp = array ();
  • while (($aRes = call_user_func ($sDb.'_fetch_assoc', $rRes)) && $iCpt < $this -> aProps['STEP']) {
  • $aTmp[] = $aRes;
  • $iCpt ++;
  • }
  • @call_user_func ($sDb.'_close', $rLink);
  • return $aTmp;
  • } catch (Exception $e) {
  • echo $e -> getMessage ();
  • }
  • }
  • }
  • ?>
  • // Classe JS :
  • /**
  • @author : Johan Barbier <johan.barbier@gmail.com>
  • @Version : 2006/10/20
  • */
  • /**
  • @author : Johan Barbier <johan.barbier@gmail.com>
  • @Version : 2006/10/20
  • */
  • function noTimeOut () {
  • var aStack = new Array;
  • var aStacks = new Array;
  • function getObject () {
  • if (window.XMLHttpRequest) {
  • var oXmlhttp = new XMLHttpRequest();
  • } else if (window.ActiveXObject) {
  • var oXmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  • }
  • return oXmlhttp;
  • }
  • function addToData (sStack) {
  • var sData = '';
  • var iArgs = aStack[sStack]['ARGS'].length;
  • if ( iArgs > 0) {
  • for (var iCpt = 0; iCpt < iArgs; iCpt ++) {
  • sData += '&arg_'+iCpt+'='+aStack[sStack]['ARGS'][iCpt];
  • }
  • }
  • return sData;
  • }
  • function getDefault (sStack, iStart) {
  • var j = iStart + aStack[sStack]['STEP'];
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
  • }
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • /*
  • parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML += aStack[sStack]['OXMLHTTP'].responseText;
  • */
  • if (j < aStack[sStack]['LIMIT']) {
  • aStacks.unshift (sStack);
  • aStack[sStack]['START'] = j;
  • checkStack ();
  • }
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'sType=DEFAULT&iStart='+iStart+'&iStep='+STEP;
  • var iArgs = aStack[sStack]['ARGS'].length;
  • data += addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • }
  • function getDB (sStack, iStart) {
  • var j = iStart + aStack[sStack]['STEP'];
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
  • }
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • //parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML += aStack[sStack]['OXMLHTTP'].responseText;
  • if (j < aStack[sStack]['LIMIT']) {
  • aStacks.unshift (sStack);
  • aStack[sStack]['START'] = j;
  • checkStack ();
  • }
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'sType=DB&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sQuery='+aStack[sStack]['QUERY'];
  • data += addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • }
  • function getFile (sStack, iStart) {
  • var j = iStart + aStack[sStack]['STEP'];
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
  • }
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • /*
  • parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML += aStack[sStack]['OXMLHTTP'].responseText;
  • */
  • if (j < aStack[sStack]['LIMIT']) {
  • aStacks.unshift (sStack);
  • aStack[sStack]['START'] = j;
  • checkStack ();
  • }
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'sType=FILE_LINE&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
  • data += addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • }
  • function getFileLine (sStack, iStart) {
  • var j = iStart;
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
  • }
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • /*
  • parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML += aStack[sStack]['OXMLHTTP'].responseText;
  • */
  • j += aStack[sStack]['OXMLHTTP'].responseText.length;
  • if (aStack[sStack]['SUBSTR'] != '') {
  • j -= aStack[sStack]['SUBSTR'];
  • }
  • if (j < aStack[sStack]['LIMIT']) {
  • aStacks.unshift (sStack);
  • aStack[sStack]['START'] = j;
  • checkStack ();
  • }
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'sType=FILE_LINE&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
  • data += addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • }
  • function getFilePat (sStack, iStart) {
  • var j = iStart;
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
  • }
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • /*
  • parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML += aStack[sStack]['OXMLHTTP'].responseText;
  • */
  • j += aStack[sStack]['OXMLHTTP'].responseText.length;
  • if (aStack[sStack]['SUBSTR'] != '') {
  • j -= aStack[sStack]['SUBSTR'];
  • }
  • if (j < aStack[sStack]['LIMIT']) {
  • aStacks.unshift (sStack);
  • aStack[sStack]['START'] = j;
  • checkStack ();
  • }
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • var data = 'sType=FILE_PATTERN&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
  • data += addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • }
  • function oneShot (sStack) {
  • aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
  • aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
  • if (aStack[sStack]['OXMLHTTP'].readyState==1) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==2) {
  • if (aStack[sStack]['MSG'] != '') {
  • parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
  • }
  • }
  • if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
  • /**
  • * DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
  • *
  • */
  • /*
  • if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
  • var oNode = parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
  • parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
  • } else {
  • parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
  • }
  • */
  • parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML = aStack[sStack]['OXMLHTTP'].responseText;
  • checkStack ();
  • }
  • }
  • aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • data = addToData (sStack);
  • aStack[sStack]['OXMLHTTP'].send (data);
  • checkStack ();
  • }
  • function getData (sStack, sType) {
  • var bGo = false;
  • switch (sType) {
  • case 'DEFAULT':
  • getDefault (sStack, aStack[sStack]['START']);
  • break;
  • case 'FILE_OCTET':
  • getFile (sStack, aStack[sStack]['START']);
  • break;
  • case 'FILE_LINE':
  • getFileLine (sStack, aStack[sStack]['START']);
  • break;
  • case 'FILE_PATTERN':
  • getFilePat (sStack, aStack[sStack]['START']);
  • break;
  • case 'DB':
  • getDB (sStack, aStack[sStack]['START']);
  • break;
  • case 'ONE_SHOT':
  • oneShot (sStack);
  • break;
  • }
  • }
  • function checkStack () {
  • var iLen = aStacks.length;
  • if (iLen > 0) {
  • var sStack = aStacks[iLen - 1];
  • __checkStack = function () {
  • var sType = aStack[aStacks[iLen - 1]]['TYPE'];
  • aStacks.pop ();
  • getData (sStack, sType);
  • }
  • if (aStack[sStack]['TIMEOUT'] > 0) {
  • setTimeout ('__checkStack()', aStack[sStack]['TIMEOUT'] );
  • } else {
  • __checkStack (sStack, iLen);
  • }
  • }
  • }
  • this.declareStack = function (sStack) {
  • aStack[sStack] = new Array;
  • aStack[sStack]['START'] = aStack[sStack]['LIMIT'] = aStack[sStack]['STEP'] = aStack[sStack]['FILE'] = aStack[sStack]['QUERY'] = aStack[sStack]['TARGET'] = aStack[sStack]['SCRIPT'] = aStack[sStack]['MSG'] = aStack[sStack]['SUBSTR'] = '';
  • aStack[sStack]['METHOD'] = 'POST';
  • aStack[sStack]['TIMEOUT'] = 0;
  • aStack[sStack]['ARGS'] = new Array;
  • aStack[sStack]['MSG_WAITING'] = 'Loading';
  • aStack[sStack]['MSG_LOADED'] = 'Loaded';
  • aStack[sStack]['MSG_READY'] = 'OK';
  • }
  • this.startWork = function (sStack) {
  • aStack[sStack]['OXMLHTTP'] = getObject ();
  • var iLen = aStacks.length;
  • aStacks[iLen] = sStack;
  • checkStack ();
  • }
  • this.initialize = function (sStack, sType, mValue) {
  • if (!aStack[sStack]) {
  • return false;
  • }
  • switch (sType) {
  • case 'START' :
  • aStack[sStack]['START'] = mValue;
  • return true;
  • break;
  • case 'LIMIT' :
  • aStack[sStack]['LIMIT'] = mValue;
  • return true;
  • break;
  • case 'STEP' :
  • aStack[sStack]['STEP'] = mValue;
  • return true;
  • break;
  • case 'SUBSTR' :
  • aStack[sStack]['SUBSTR'] = mValue;
  • return true;
  • break;
  • case 'FILE' :
  • aStack[sStack]['FILE'] = mValue;
  • return true;
  • break;
  • case 'QUERY' :
  • aStack[sStack]['QUERY'] = mValue;
  • return true;
  • break;
  • case 'TARGET' :
  • aStack[sStack]['TARGET'] = mValue;
  • return true;
  • break;
  • case 'SCRIPT' :
  • aStack[sStack]['SCRIPT'] = mValue;
  • return true;
  • break;
  • case 'MSG' :
  • aStack[sStack]['MSG'] = mValue;
  • return true;
  • break;
  • case 'MSG_WAITING' :
  • aStack[sStack]['MSG_WAITING'] = mValue;
  • return true;
  • break;
  • case 'MSG_LOADED' :
  • aStack[sStack]['MSG_LOADED'] = mValue;
  • return true;
  • break;
  • case 'MSG_READY' :
  • aStack[sStack]['MSG_READY'] = mValue;
  • return true;
  • break;
  • case 'METHOD' :
  • if (mValue != 'POST' || mValue != 'GET') {
  • return false;
  • }
  • aStack[sStack]['METHOD'] = mValue;
  • return true;
  • break;
  • case 'TYPE':
  • aStack[sStack]['TYPE'] = mValue;
  • break;
  • case 'ARGS':
  • aStack[sStack]['ARGS'] = mValue;
  • break;
  • case 'TIMEOUT':
  • mValue = parseInt (mValue);
  • if (false == isNaN (mValue)) {
  • aStack[sStack]['TIMEOUT'] = mValue;
  • } else {
  • return false;
  • }
  • break;
  • default:
  • return false;
  • break;
  • }
  • }
  • }
<?php
/**
@author : Johan Barbier <johan.barbier@gmail.com>
@Version : 2006/10/09
*/

class noTimeOut {
	private $aProps = array (
		'TYPE' => null,
		'DB' => null,
		'HOST' => null,
		'LOGIN' => null,
		'PWD' => null,
		'QUERY' => null,
		'DBSERVER' => null,
		'FILE' => null,
		'START' => null,
		'LIMIT' => null,
		'STEP' => null
		);

	private $aDbServers = array (
		'MYSQL', 'MSSQL'
		);

	private $aTypes = array (
		'DEFAULT', 'FILE_OCTET', 'FILE_PATTERN', 'FILE_LINE', 'DB'
		);


	public function __construct () {
		// might be useful later
	}

	public function __set ($sType, $sVal) {
		try {
			if (!array_key_exists ($sType, $this -> aProps)) {
				throw new Exception ($sType.' is not a valid property');
			}
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
		try {
			switch ($sType) {
				case 'TYPE':
					if (!in_array ($sVal, $this -> aTypes)) {
						throw new Exception ($sVal.' is not a valid TYPE value');
					}
					break;
				case 'FILE':
					if (!file_exists ($sVal)) {
						throw new Exception ('File '.$sVal.' has not been found');
					}
					break;
				case 'DBSERVER':
					if (!in_array ($sVal, $this -> aDbServers)) {
						throw new Exception ('DB SERVER '.$sVal.' is not supported');
					}
					break;
				default :
					break;
			}
			$this -> aProps[$sType] = $sVal;
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
	}

	private static function isNull () {
		foreach (func_get_args() as $sArg) {
			if (is_null ($sArg)) {
				return false;
			}
		}
		return true;
	}

	public function flushMe ($aWork = null) {
		try {
			if (is_null ($this -> aProps['TYPE'])) {
				throw new Exception ('TYPE has not been defined');
			}
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
		try {
			switch ($this -> aProps['TYPE']) {
				case 'DB':
					if (false === self::isNull ($this -> aProps['DB'], $this -> aProps['HOST'], $this -> aProps['LOGIN'], $this -> aProps['PWD'], $this -> aProps['QUERY'], $this -> aProps['DBSERVER'], $this -> aProps['START'], $this -> aProps['STEP'])) {
						throw new Exception ('DB properties have not been fully defined');
					}
					$mTmp = $this -> getDB ();
					break;
				case 'FILE_OCTET':
					if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
						throw new Exception ('FILE properties have not been fully defined');
					}
					$mTmp = $this -> getFileOctet ();
					break;
				case 'DEFAULT':
					if (false === self::isNull ($this -> aProps['START'], $this -> aProps['STEP'], $aWork)) {
						throw new Exception ('DEFAULT properties have not been fully defined');
					}
					$mTmp = $this -> getDefault ($aWork);
					break;
				case 'FILE_PATTERN':
					if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
						throw new Exception ('FILE properties have not been fully defined');
					}
					$mTmp = $this -> getFilePat ();
					break;
				case 'FILE_LINE':
					if (false === self::isNull ($this -> aProps['FILE'], $this -> aProps['START'], $this -> aProps['STEP'])) {
						throw new Exception ('FILE properties have not been fully defined');
					}
					$mTmp = $this -> getFileLine ();
					break;
			}
			return $mTmp;
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
	}

	private function getFilePat () {
		$sTmp = '';
		try {
			if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
				throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
			}
			if ( -1 === (fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
				throw new Exception ('Failed to  modify cursor on : '.$this -> aProps['FILE']);
			}
			while (false === ($iEnd = strpos ($sTmp, $this -> aProps['STEP'])) && !feof ($fp)) {
				$sTmp .= @fgets ($fp, 1024);
			}
			$sTmp = substr ($sTmp, 0, $iEnd + strlen ($this -> aProps['STEP']));
			@fclose ($fp);
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
		return $sTmp;
	}

	private function getDefault ($aWork) {
		try {
			if (!is_array ($aWork)) {
				throw new Exception ('Parameter must be an array');
			}
			$aTmp = array ();
			for ($i = $this -> aProps['START']; $i < $this -> aProps['START'] + $this -> aProps['STEP']; $i ++) {
				if (isset ($aWork[$i])) {
					$aTmp[] = $aWork[$i];
				}
			}
			return $aTmp;
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
	}

	private function getFileOctet () {
		try {
			$sTmp = '';
			if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
				throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
			}
			if ( -1 === (@fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
				throw new Exception ('Failed to  modify cursor on : '.$this -> aProps['FILE']);
			}
			if (false === ($sTmp .= @fread ($fp, $this -> aProps['STEP']))) {
				throw new Exception ('Failed to  read file : '.$this -> aProps['FILE']);
			}
			@fclose ($fp);
			return $sTmp;
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
	}

	private function getFileLine () {
		$sTmp = '';
		try {
			if (false === ($fp = fopen ($this -> aProps['FILE'], 'r'))) {
				throw new Exception ('Failed to open file : '.$this -> aProps['FILE']);
			}
			if ( -1 === (fseek ($fp, $this -> aProps['START'], SEEK_SET))) {
				throw new Exception ('Failed to  modify cursor on : '.$this -> aProps['FILE']);
			}
			$iEnd = 0;
			while ($iEnd < $this -> aProps['STEP']) {
				$sTmp .= @fgets ($fp);
				$iEnd ++;
			}
			@fclose ($fp);
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
		return $sTmp;
	}

	private function getDB () {
		$sDb = strtolower ($this -> aProps['DBSERVER']);
		try {
			$rLink = @call_user_func ($sDb.'_connect', $this -> aProps['HOST'], $this -> aProps['LOGIN'], $this -> aProps['PWD']);
			if (false === $rLink) {
				throw new Exception ('Failed to connect to host : '.$this -> aProps['HOST']);
			}
			if (false === (@call_user_func ($sDb.'_select_db', $this -> aProps['DB'], $rLink))) {
				throw new Exception ('Failed to select database : '.$this -> aProps['DB']);
			}
			if (false === ($rRes = @call_user_func ($sDb.'_query', $this -> aProps['QUERY'], $rLink))) {
				throw new Exception ('Query failed : '.$this -> aProps['QUERY']);
			}
			if (false === (@call_user_func ($sDb.'_data_seek', $rRes, $this -> aProps['START']))) {
				throw new Exception ('Query failed : '.$this -> aProps['QUERY']);
			}
			$iCpt = 0;
			$aTmp = array ();
			while (($aRes = call_user_func ($sDb.'_fetch_assoc', $rRes)) && $iCpt < $this -> aProps['STEP']) {
				$aTmp[] = $aRes;
				$iCpt ++;
			}
			@call_user_func ($sDb.'_close', $rLink);
			return $aTmp;
		} catch (Exception $e) {
			echo $e -> getMessage ();
		}
	}
}
?>

// Classe JS :
/**
@author : Johan Barbier <johan.barbier@gmail.com>
@Version : 2006/10/20
*/
/**
@author : Johan Barbier <johan.barbier@gmail.com>
@Version : 2006/10/20
*/
function noTimeOut () {

	var aStack = new Array;
	var aStacks = new Array;

	function getObject () {
		if (window.XMLHttpRequest) {
			var oXmlhttp = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			var oXmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		return oXmlhttp;
	}

	function addToData (sStack) {
		var sData = '';
		var iArgs = aStack[sStack]['ARGS'].length;
		if ( iArgs > 0) {
			for (var iCpt = 0; iCpt < iArgs; iCpt ++) {
				sData += '&arg_'+iCpt+'='+aStack[sStack]['ARGS'][iCpt];
			}
		}
		return sData;
	}

	function getDefault (sStack, iStart) {
		var j = iStart + aStack[sStack]['STEP'];
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
				}
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				/*
				parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML +=  aStack[sStack]['OXMLHTTP'].responseText;
				*/
				if (j < aStack[sStack]['LIMIT']) {
						aStacks.unshift (sStack);
						aStack[sStack]['START'] = j;
						checkStack ();
				}
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var data = 'sType=DEFAULT&iStart='+iStart+'&iStep='+STEP;
		var iArgs = aStack[sStack]['ARGS'].length;
		data += addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
	}

	function getDB (sStack, iStart) {
		var j = iStart + aStack[sStack]['STEP'];
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];

				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];

				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];

				}
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				//parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML +=  aStack[sStack]['OXMLHTTP'].responseText;
				if (j < aStack[sStack]['LIMIT']) {
						aStacks.unshift (sStack);
						aStack[sStack]['START'] = j;
						checkStack ();
				}
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var data = 'sType=DB&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sQuery='+aStack[sStack]['QUERY'];
		data += addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
	}

	function getFile (sStack, iStart) {
		var j = iStart + aStack[sStack]['STEP'];
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
				}
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				/*
				parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML +=  aStack[sStack]['OXMLHTTP'].responseText;
				*/
				if (j < aStack[sStack]['LIMIT']) {
						aStacks.unshift (sStack);
						aStack[sStack]['START'] = j;
						checkStack ();
				}
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var data = 'sType=FILE_LINE&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
		data += addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
	}

	function getFileLine (sStack, iStart) {
		var j = iStart;
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
				}
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				/*
				parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML +=  aStack[sStack]['OXMLHTTP'].responseText;
				*/
				j += aStack[sStack]['OXMLHTTP'].responseText.length;
				if (aStack[sStack]['SUBSTR'] != '') {
					j -= aStack[sStack]['SUBSTR'];
				}
				if (j < aStack[sStack]['LIMIT']) {
						aStacks.unshift (sStack);
						aStack[sStack]['START'] = j;
						checkStack ();
				}
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var data = 'sType=FILE_LINE&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
		data += addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
	}

	function getFilePat (sStack, iStart) {
		var j = iStart;
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];
				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById (aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_READY'];
				}
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				/*
				parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML +=  aStack[sStack]['OXMLHTTP'].responseText;
				*/
				j += aStack[sStack]['OXMLHTTP'].responseText.length;
				if (aStack[sStack]['SUBSTR'] != '') {
					j -= aStack[sStack]['SUBSTR'];
				}
				if (j < aStack[sStack]['LIMIT']) {
						aStacks.unshift (sStack);
						aStack[sStack]['START'] = j;
						checkStack ();
				}
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var data = 'sType=FILE_PATTERN&iStart='+iStart+'&iStep='+aStack[sStack]['STEP']+'&sFile='+aStack[sStack]['FILE'];
		data += addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
	}

	function oneShot (sStack) {
		aStack[sStack]['OXMLHTTP'].open(aStack[sStack]['METHOD'], aStack[sStack]['SCRIPT'], true);
		aStack[sStack]['OXMLHTTP'].onreadystatechange=function() {
			if (aStack[sStack]['OXMLHTTP'].readyState==1) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_WAITING'];

				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==2) {
				if (aStack[sStack]['MSG'] != '') {
					parent.document.getElementById(aStack[sStack]['MSG']).firstChild.data = aStack[sStack]['MSG_LOADED'];

				}
			}
			if (aStack[sStack]['OXMLHTTP'].readyState==4 && aStack[sStack]['OXMLHTTP'].status == 200) {
				/**
				* DOM version, but it does not allow to read HTML tags, or, at least, I did not manage to do it
				*
				*/
				/*
				if (!parent.document.getElementById (aStack[sStack]['TARGET']).hasChildNodes()) {
					var oNode =  parent.document.createTextNode (aStack[sStack]['OXMLHTTP'].responseText);
					parent.document.getElementById (aStack[sStack]['TARGET']).appendChild (oNode);
				} else {
					parent.document.getElementById (aStack[sStack]['TARGET']).firstChild.appendData (aStack[sStack]['OXMLHTTP'].responseText);
				}
				*/
				parent.document.getElementById(aStack[sStack]['TARGET']).innerHTML = aStack[sStack]['OXMLHTTP'].responseText;
				checkStack ();
			}
		}
		aStack[sStack]['OXMLHTTP'].setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		data = addToData (sStack);
		aStack[sStack]['OXMLHTTP'].send (data);
		checkStack ();
	}

	function getData (sStack, sType) {
		var bGo = false;
		switch (sType) {
			case 'DEFAULT':
				getDefault (sStack, aStack[sStack]['START']);
				break;
			case 'FILE_OCTET':
				getFile (sStack, aStack[sStack]['START']);
				break;
			case 'FILE_LINE':
				getFileLine (sStack, aStack[sStack]['START']);
				break;
			case 'FILE_PATTERN':
				getFilePat (sStack, aStack[sStack]['START']);
				break;
			case 'DB':
				getDB (sStack, aStack[sStack]['START']);
				break;
			case 'ONE_SHOT':
				oneShot (sStack);
				break;
		}
	}

	function checkStack () {
		var iLen = aStacks.length;
		if (iLen > 0) {
			var sStack = aStacks[iLen - 1];
			__checkStack = function () {
					var sType = aStack[aStacks[iLen - 1]]['TYPE'];
					aStacks.pop ();
					getData (sStack, sType);
				}
			if (aStack[sStack]['TIMEOUT'] > 0) {
				setTimeout ('__checkStack()', aStack[sStack]['TIMEOUT'] );
			} else {
				__checkStack (sStack, iLen);
			}
		}
	}

	this.declareStack = function (sStack) {
		aStack[sStack] = new Array;
		aStack[sStack]['START'] = aStack[sStack]['LIMIT'] = aStack[sStack]['STEP'] = aStack[sStack]['FILE'] = aStack[sStack]['QUERY'] = aStack[sStack]['TARGET'] = aStack[sStack]['SCRIPT'] = aStack[sStack]['MSG'] = aStack[sStack]['SUBSTR'] = '';
		aStack[sStack]['METHOD'] = 'POST';
		aStack[sStack]['TIMEOUT'] = 0;
		aStack[sStack]['ARGS']  = new Array;
		aStack[sStack]['MSG_WAITING'] = 'Loading';
		aStack[sStack]['MSG_LOADED'] = 'Loaded';
		aStack[sStack]['MSG_READY'] = 'OK';
	}

	this.startWork = function (sStack) {
		aStack[sStack]['OXMLHTTP'] = getObject ();
		var iLen = aStacks.length;
		aStacks[iLen] = sStack;
		checkStack ();
	}

	this.initialize = function (sStack, sType, mValue) {
		if (!aStack[sStack]) {
			return false;
		}
		switch (sType) {
			case 'START' :
				aStack[sStack]['START'] = mValue;
				return true;
				break;
			case 'LIMIT' :
				aStack[sStack]['LIMIT'] = mValue;
				return true;
				break;
			case 'STEP' :
				aStack[sStack]['STEP'] = mValue;
				return true;
				break;
			case 'SUBSTR' :
				aStack[sStack]['SUBSTR'] = mValue;
				return true;
				break;
			case 'FILE' :
				aStack[sStack]['FILE'] = mValue;
				return true;
				break;
			case 'QUERY' :
				aStack[sStack]['QUERY'] = mValue;
				return true;
				break;
			case 'TARGET' :
				aStack[sStack]['TARGET'] = mValue;
				return true;
				break;
			case 'SCRIPT' :
				aStack[sStack]['SCRIPT'] = mValue;
				return true;
				break;
			case 'MSG' :
				aStack[sStack]['MSG'] = mValue;
				return true;
				break;
			case 'MSG_WAITING' :
				aStack[sStack]['MSG_WAITING'] = mValue;
				return true;
				break;
			case 'MSG_LOADED' :
				aStack[sStack]['MSG_LOADED'] = mValue;
				return true;
				break;
			case 'MSG_READY' :
				aStack[sStack]['MSG_READY'] = mValue;
				return true;
				break;
			case 'METHOD' :
				if (mValue != 'POST' || mValue != 'GET') {
					return false;
				}
				aStack[sStack]['METHOD'] = mValue;
				return true;
				break;
			case 'TYPE':
				aStack[sStack]['TYPE'] = mValue;
				break;
			case 'ARGS':
				aStack[sStack]['ARGS'] = mValue;
				break;
			case 'TIMEOUT':
				mValue = parseInt (mValue);
				if (false == isNaN (mValue)) {
					aStack[sStack]['TIMEOUT'] = mValue;
				} else {
					return false;
				}
				break;
			default:
				return false;
				break;
		}
	}
}







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

10 octobre 2006 10:01:42 :
Tites modifications
11 octobre 2006 15:07:05 :
Modifs mineures sur les messages
11 octobre 2006 16:12:28 :
Modif sur les exceptions
11 octobre 2006 17:52:12 :
Grosses modifications. Ajout d'un type : FILE_LINE et remplacement de l'ancien par FILE_OCTET, plus juste. Ajout d'un exemple de FILE_LINE (vraiment du ligne à ligne). Ajout d'un exemple d'envoi d'email avec le package noTimeOut (email.php, email.txt et scripts/sendEmail.php)
12 octobre 2006 10:43:06 :
Rajout du 'true' dans la méthode xmlhttp::open()
20 octobre 2006 10:38:42 :
Ajout de la gestion de piles de processus, permettant d'effectuer plusieurs traitements en asynchrone.
20 octobre 2006 11:56:59 :
Ajout d'une méthode à la classe js : oneShot. Utilisée pour les traitements Ajax basiques en one shot (1 traitement). Ajout d'une propriété : ARGS, qui est un tableau JS : il permet de passer autant de variables que nécessaire au script de traitement PHP.
20 octobre 2006 12:14:27 :
Petite optimisation
20 octobre 2006 12:56:16 :
Addition: js timeout
24 octobre 2006 10:44:21 :
Bug sur le TIMEOUT JS corrigé. Maintenant, le timeout JS fonctionne à merveille sans bloquer le navigateur. Cela permet de temporiser la sortie. Je ferai un exemple d'utilisation ludique, pour changer ;-)
  • signaler à un administrateur
    Commentaire de FhX le 09/10/2006 18:35:02

    Hmmm, pas mal pas mal :)

    Question code (bah oui, moi jvois que ca en ce moment ^^ ) :
    (l. 67)
    if (is_null ($this -> aProps['DB']) || is_null ($this -> aProps['HOST']) || is_null ($this -> aProps['LOGIN']) || is_null ($this -> aProps['PWD']) || is_null ($this -> aProps['QUERY']) || is_null ($this -> aProps['DBSERVER']) || is_null ($this -> aProps['START']) || is_null ($this -> aProps['STEP'])) {

    huhuhuhu ? T'en as pas eu raz le bol d'écrire tout ca ? ;)

    T'aurais pu faire un truc dans le genre :
    private static function are_null() {
    $num_args = func_num_args();
      for ($i=0; $i<=$num_args; $i++ ) {
           $arg = func_get_arg($i);
            if ( is_null($arg) ) return true;
      }
    return false;
    }
    // Que tu appèles comme ca :
    if ( self::are_null($var1, $var2, $var3, $var4 ...) ) throw new Exception('...');

    // Voila :)
    // Suivant : (l. 26)
    private $aTypes = array('...');
    huhuhu, $aTypes n'est pas fait pour être changé ! Donc ==> constante !

    Y'a peut être encore 2 ou 3 trucs mais j'hésite :p
    Cependant, bonne classe. J'aime bien l'utilisation du try{}catch{} ^^

  • signaler à un administrateur
    Commentaire de FhX le 09/10/2006 22:39:44

    ah si :
    l. 144

    "while (($aRes = mysql_fetch_assoc ($rRes)) && $iCpt < $this -> aProps['STEP']) {"

    t'as oublié un call_user_func pour le fetch_assoc dans le cas de mssql au lieu de mysql ^^
    D'ailleurs, j'ai toujours pas compris pourquoi tu utilisais pas un objet de db au lieu d'un truc comme ca :p

  • signaler à un administrateur
    Commentaire de malalam le 10/10/2006 08:19:54 administrateur CS

    Les try catch, c'était pour te faire plaisir en plus (si si!).
    Pour la fonction 'null' oui tu as raison, c'est une bonne idée.
    pour la propriété $aProps, nan, je préfère comme ça parce que ça me permet de centraliser mes propriétés pour tester le __set (). Et une constante de classe ne peut pas être un tableau, malheureusement.
    Et le while (), oui, c'est un oubli. Ca ne marchait pas au début, alors pour tester j'ai mis la fonction en dur, puis j'ai trouvé ce qui n'allait pas, et j'ai oublié de la remettre lol.
    Et je n'utilise pas d'objet db parce que c'est juste la 1ère version : à terme, je vais en mettre un. Mais là c'est juste que j'avais besoin de quelques fonctions bien précises. Je n'ai pas terminé ce code, je compte le rendre plus fonctionnel; mais je dois le tester à fond sur mes codes d'abord. Et trouver à quelles occasions il peut être utilisé, celles-ci mises à part.
    Pi avant j'ai toujours un problème avec les fichiers XML. Le flushing par motif fonctionne bien...sauf dans le cas d'un XML complexe contenant des caractères invisibles : la taille du fichier, et le nombre de caractères renvoyés ne correspondent plus, du coup javascript et php ne sont plus d'accord, n'ont plus les mêmes offset, et j'ai des décalages :-(
    Et comme à la base je veux l'utiliser pour du xml, ce truc...(mon debugger en fait : je sors le contexte de la page débuggée, et ce contexte peut-être énorme! Donc, cette appli me permettra de l'afficher quand même sans problème; mais je n'y suis pas encore tout à fait).

    Merci en tous cas, je ferai tes modifs tout à l'heure :-)

  • signaler à un administrateur
    Commentaire de malalam le 10/10/2006 08:21:01 administrateur CS

    Par contre il y a un objet javascript dans le fichier, alors si quelqu'un est calé dans ce domaine, je veux bien des critiques dessus aussi! Parce que la POO javascript, ce n'est pas ma spécialité...!

  • signaler à un administrateur
    Commentaire de jean84 le 10/10/2006 17:19:14

    Super interessant ! Je reviens dans un mois quand je l'aurais totalement comrpise ;-)

    Au fait, c'est quoi un __set() ? Sa fait plusieurs fois que t'en parles, j'ai pas comrpis ce que c'etait...

  • signaler à un administrateur
    Commentaire de malalam le 10/10/2006 18:00:28 administrateur CS

    Hello,

    merci, déjà ;-)

    __set () est une méthode magique pour créer un setter.
    A savoir que je passe par là pour permettre (ou non) l'initialisation de propriétés privées (ou protégées).
    De plus, cela permet d'être un peu plus clair éventuellement.
    Ici par exemple, j'ai un tableau comme propriété privée(noTimeOut::aProps), contenant des clefs et des valeurs.
    Avec le setter, au lieu de permettre ceci :
    $oNTM -> aProps['DB'] = 'MYSQL';
    qui serait l'initialisation logique
    Je permets ceci :
    $oNTM -> DB = 'MYSQL';
    ce qui est plus intuitif.
    De plus, il me permet de vérifier éventuellement les valeurs assignées.
    Dans le cas de DB, je n'autorise que 2 valeurs : MYSQL ou MSSQL.

    PS : pour comprendre le code, il faut aussi lire la classe js, et les fichiers dans le répertoire scripts/ voire les indexN.php lol...
    $oNTM

  • signaler à un administrateur
    Commentaire de stepibou le 10/10/2006 20:20:50

    Salut,

    Je vois le code , c'est bien!...

    Mais au vu de cette classe je m'interoge un peu de l'utilité de toute ces verifications.
    En effet une fois le code mis en place, la classe utilisée a bon escient, on reverifie toujours tout, alors que le code ne change pas... ??
    je comprend que tout ces messages d'erreur peuvent aider le développeur utilisant ta classe, a comprend ou est son erreur eventuel, mais apres aucune erreur ne doit subvenir, en production. Si y en a une ce serai un hackage!.
    Donc voila est ce que ca ralonge pas trop la procedure au point de devoir justement utiliser ton systeme te permetant de passer outre les time limit.?

    Personnelement, je m'oriente aussi vers une programation assez bien ecrite dans le genre, mais au contraire, je ne fait pas trop de verification qui a mon sens alourdisent le code et le complique.

    Mais c'est vrai que le system de __set est plutot pas mal vu!

    Concretement : est-ce que en fonctoionnement on passe plus, par ces verif là et que les variable sont assigné directement..?

  • signaler à un administrateur
    Commentaire de malalam le 11/10/2006 08:16:39 administrateur CS

    Hello,

    plait-il...? Se passer des vérifications en se disant que de toutes façons, en prod, on ne doit pas avoir d'erreurs ?
    Mais, si tu ne fais aucune vérification, donc aucun try catch ou autre...et que ton code, globalement, se retrouve avec une mauvaise variable quelquepart : tu auras une erreur, en prod aussi. Une erreur interne à PHP, mais qui sortira. quand même. Et ton code ne marchera pas.
    Si on suit ce que tu dis, autant coder sans jamais faire de vérification. Aucune.
    "En effet une fois le code mis en place, la classe utilisée a bon escient, on reverifie toujours tout, alors que le code ne