FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 2015
-
9 oct. 2006 à 18:35
cs_mrfox
Messages postés89Date d'inscriptionsamedi 25 mai 2002StatutMembreDernière intervention 5 décembre 2009
-
19 mai 2008 à 21:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_mrfox
Messages postés89Date d'inscriptionsamedi 25 mai 2002StatutMembreDernière intervention 5 décembre 2009 19 mai 2008 à 21:20
Ola
Ca peut fonctionner pour la génération d'un mega fichier zip ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 23 mai 2007 à 19:39
Oui tu as raison, mais au moment où j'ai codé cette classe, je voulais voir ce que cela donnait de gérer les exceptions interception comprise dans la classe.
En fait, ça ne sert à rien si ce n'est à perdre des ressources pour rien...faudra que je recode ça.
Alakhnor => l'utilisation de ces classes passent nécessairement par une revisite de ton code. Il faut le voir autrement : la boucle est gérée par du javascript, c'est tout.
Poutr php4, tu dois pouvoir réécrire la classe php...à priori. Rien de vital ne tire partie des spécificités PHP5.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 6 mai 2007 à 17:08
Etrange, je ne l'aurais pas codé comme ca cette classe.
Enfin si, mais au niveau des try{}catch() non.
J'aurais dégagé les try{}catch() des méthodes pour commencer.
Théoriquement, le try{}catch() se fait lors d'un appel de méthode et pas dans la méthode elle même. Sauf si c'est pour appeler une méthodes privée/protégée.
Ex :
# 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 ();
# }
Ce que j'aurais fait :
public function __set($var, $val) {
if ( !array_key_exists($var, $this -> aProps) )
throw new GetSetException($var, 'set');
// suite...
}
Et quand tu appèles ta classe de l'extérieur :
try {
$maclasse = new noTimeOut;
$maclasse->timeout = 360;
// etc..
} catch ( GetSetException $gs ) {
die ( $gs->getMessage() );
} catch ( Exception $e ) {
die ( $e->getMessage() );
}
Par contre (voila la suite ^^) :
#public function flushMe ($aWork = null) {
# 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;
Voila comment je l'aurais joué. J'aurais étendu la classe d'exception pour chaque cas :)
Autrement, ton try{}catch() ne sert pas à grand chose dans une classe :)
alakhnor
Messages postés2Date d'inscriptiondimanche 4 mars 2007StatutMembreDernière intervention 5 mai 2007 5 mai 2007 à 20:36
J'aimerais pouvoir utiliser ces classes. Malheureusement, je me heurte à 2 problèmes:
- je dois développer en php4
- mon programme est une boucle effectuant un certains nombre de traitements incluant des requêtes vers FlickR calculées par le reste. Je ne vois pas trop comment déporter des traitements et les traiter dans la classe php.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 2 nov. 2006 à 18:06
Merci, c'est très gentil :-)
cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 20152 2 nov. 2006 à 17:56
yess !
merci pour tes explications :)
je vais tester ça de ce pas ... puis allez j'te fais un petit vote pour tous les efforts que tu fais pour nous ;)
merki
@++
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 2 nov. 2006 à 12:34
Hello,
ce code a été nominé pour les innovation Awards de phpclasses.org.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 27 oct. 2006 à 12:31
Caviar => ton serveur est configuré en short_open_tag à On. Et c'est maaal ;-)
Donc, soit tu le mets en short_open_tag à Off, histoire qu'il ne prenne pas le <? de la l'en tête XML pour du php, soit tu fais un echo :
echo '<?xml version="1.0" encoding="iso-8859-1"?>';
Pour les autres parse error, forcément...s'il commence à interpréter ça comme du php, il continue jusqu'à ce qu'il rencontre un tag de fermeture...donc, tout le html est interprété comme du PHP.
cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 20152 27 oct. 2006 à 12:07
euh ...saluté
le système à l'air très intéréssant cependant en testant en local avec php 5.1.2 j'ai cette erreur
Parse error: parse error in c:\no_time_out_package\obuffer\index.php on line 13
la ligne en question étant
<?xml version="1.0" encoding="iso-8859-1"?>
effectivement je comprends bien que le serveur interprète ça en php alors que ça n'en est pas.
même si j'enlève cette ligne j'ai plein de parse error :(
@++
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 20 oct. 2006 à 10:37
Merci Wizard512 :-)
Je viens de mettre à jour la source.
Je n'ai pas fini encore, mais déjà, une addition importante : le package gère maintenant des piles de processus. Ce qui veut dire que l'on peut lancer plusieurs traitements en asynchrone : lire 2 fichiers à la fois par exemple.
index6.php a aussi été ajouté et montre justement ce fonctionnement.
La façon d'instancier l'objet a été modifié aussi, voir le readme.txt et les différents fichiers.
wizard512
Messages postés459Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention11 mai 20132 17 oct. 2006 à 20:08
A ok, je comprens mieux maintenant,
Script intéressant, et bien élaboré,
bonne explication et suivie de la source,
ce qui est assez rare....
Ma note : 10
Bon Prog........
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 oct. 2006 à 08:12
La fonction set_time_limit () ne fonctionne que si l'hébergeur laisse l'accès à cette fonction. Ce qui est très rarement le cas en mutualisé. Et pour cause...
Evidemment, on peut aussi modifier le php.ini. Idem, il faut y avoir accès.
Il y aussi le safe mode, s'il est activé, et qu'on veut le garder (ahem), on ne peut pas modifier comme ça ces valeurs.
Ce script est fait pour ce genre de situations. Mais il a aussi un autre avantage : avec un set_time_limit (0), ta page restera vierge jusqu'à ce que le traitement soit terminé. Ce qui peut prendre 1mn, 2mn, 10mn...etc. Sans rien. Ce script, lui, affiche en continue les données qu'il récupère. La page est "vivante", elle bouge, elle ne laisse pas l'utilisateur devant une page vide.
wizard512
Messages postés459Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention11 mai 20132 16 oct. 2006 à 21:28
Je n'ais pas tout lus en entier,
je me suis arréter a :
"même si ça prend 5mn, avec un time limit de 30 secondes, sans aucun problème"
Et la je me suis presser de m'authentifier et
d'écrire se commentaire :
Moi j'ai une astuce pour exécuter un document php
quelque sois la longueur des lignes, la voici ^^' :
Je place en tête du script : "set_time_limit( 0 );"
Afin de ne mettre aucune limit de temps
Et a la fin : "exit;"
Pour quiter l'exécution du code
Enfin voila quoi,
a mon avie vous avez deja tablé sur la question mais bon,
c'étais juste au cas ou....
Bon prog........... xD
~~ DotWizard512 ~~
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 13 oct. 2006 à 13:06
Re,
"Ps : c'est pour PHP5, les exceptions, hein."
>> J' ai vu ^^ merci ;-)
Merci pour ces explications ;-)
Dernier petit truc tu as omis de mettre une vérification en JavaScript ( enfin plustot en Ajax ^^ ) :
Tu ne vérif pas si la page a été trouvée :S c' est pas obligé mais c' est mieux :
if(oXmlhttp.readyState 4 && oXmlhttp.status 404){// Erreur 404 ! Fichier introuvable !
document.getElementById(MSG).innerHTML = '
Le fichier ' + SCRIPT + ' n\' existe pas !
';
return false;
}
@+
}
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 13 oct. 2006 à 11:40
Ps : c'est pour PHP5, les exceptions, hein.
Sinon, je me rends compte que pour bien utiliser ce package, il faut comprendre ce qu'il fait...j'incluerai un tuto dans le package un de ces jours.
Mais je vais donner un exemple :
sans utiliser la classe PHP, qui ne servira à rien dans ce cas. On peut utiliser la classe JS, elle facilitera les choses.
Il suffit d'utiliser sa méthode getDefault (donc, type = DEFAULT).
On met un STEP de 100 par exemple, un START à 0, et pas de limite (dans ce cas, virer le if (j < LIMIT) et toujours rappeler récursivement la méthode xmlhttp), ou une très grande limite, genre 1 milliard. Dans le fichier de traitement PHP, on récupère START, et STEP. Et on fait un truc du genre : for ($i = START; $i < START + STEP; $i ++) et on affiche $i. (je n'ai pas utiliser les bonnes variables hein, ce sera $_POST['iStart'] par exemple, si on reste dans le cadre de mon package). On met dans ce fichier, et même le fichier d'appel pour être convaincu, un set_time_limit (5) par exemple.
Tu verras que PHP affichera les chiffres, sans sourciller. Il pourra ainsi tourner indéfiniment, jusqu'à arriver à LIMIT s'il y en a une, et affichera : 0, 1, 2...500...10000...99999999, 999999999999999 etc... durant des jours et des jours si tu le veux.
Essaye de faire ça sans mon package, ou du moins, sans ce qu'il montre (avec un time_limit évidemment hein), tu auras du mal.
Ce package peut aussi permettre d'éviter le dépassement de la mémoire allouée à PHP dans certain cas. Une énorme requête par exemple, qui va chercher des tonnes d'enregistrements, peut planter à ce niveau là, avant le timeout. Ben là c'est pareil, vu que je vais récupérer mes enregistrements en plusieurs passes, la mémoire allouée ne sera pas dépasser (si on calcule bien hein).
Bien sûr, ce n'est pas valable pour, par exemple, le redimensionnement d'une image énorme! On ne peut - à priori - pas faire ça en plusieurs passes. Donc...niet.
J'espère que ça éclaircit un peu le bin's :-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 13 oct. 2006 à 11:21
Ben évidemment que je ruse. Le timeout est celui de PHP : le max_execution_time. Il est fixé à 30, 60 etc secondes. Si on a pas la main sur le serveur, on ne peut généralement pas le changer.
Mais Ajax, c'est du js, donc ce n'est pas soumis au timeout. Mon package utilise Ajax pour effectuer un traitement lourd en plusieurs fois, en appelant un nombre de fois le traitement serveur, nbre de fois défini par le STEP et LIMIT, STEP se chargeant aussi d'incrémenter le traitement: par exemple, j'ai un fichier de 10000 lignes, je veux le lire en entier mais avec PHP ça prend trop de temps. Donc j'utilise ce package pour lire, par exemple, le fichier 100 lignes par 100 lignes. Ajax me l'affiche 100 lignes par 100 lignes (en gardant les lignes précédentes évidemment) : j'ai un affichage séquentiel, qui dure ce qu'il dure, mais qui n'est jamais arrêté avant la fin de la lecture complète.
Même principe pour n'importe quel autre traitement : je veux envoyer 50000 emails ? Pas de problème. Lire une table contenant 1000000 d'entrées ? No problemo... ;-)
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 13 oct. 2006 à 10:11
Salut,
donc enfaite Ajax n' empêche pas le timeout ?
Enfaite pour éviter le time out tu ruses, nan ?
Tu fais les choses en plusieurs fois.
Sinon autre question ( je suis chiant je sais ^^ ) comment marche try et catch ??
Car j' ai rien trouvé dans la doc de php :S
@+ et merci
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 13 oct. 2006 à 09:12
Ma théorie est bonne. Il suffit simplement de bien calculer son coup et de ne pas faire faire plus de traitements au serveur qu'il n'en faut pour rester dans le temps limite.
Et elle est bonne parce que : xmlhttp est un objet javascript, donc exécuté côté client. On appelle grâce à lui un traitement côté serveur. A ce moment, le décompte du temps commence. Le traitement s'effectue. S'il dure trop longtemps, boum, timeout. D'où le STEP que j'ai mis dans mes classes. Une fois le traitement effectué, le serveur balance le résultat au client, et évidemment, vu qu'on quitte le serveur, le décompte s'arrête et le temps imparti revient à 0. Là, ma classe vérifie si on a fini (LIMIT), sinon, elle rebalance un traitement, en incrémentant grâce au STEP, au serveur. Le décompte recommence, etc.
Soit tu as mal utilisé ma classe, soit ton STEP est trop gros.
Chez moi ça marche parfaitement. Sauf dans un cas : si on fait une connerie dans l'utilisation qui provoque une erreur dans la classe PHP par exemple (et encore, normalement, plus maintenant, vu que j'intercepte tout).
Quant à avoir une idée, non, pas son le code utilisé.
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 12 oct. 2006 à 22:51
Salut,
Désoler de casser l' embiance :S mais ta théorie comme quoi ajax empêcherai le timeout est fausse :S
Ou alors mauvaise manipulation du code de ma part !?
Fatal error: Maximum execution time of 2 seconds exceeded in script.php on line 17
Une idée ??
@+
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 12 oct. 2006 à 12:55
De rien ;-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 12 oct. 2006 à 11:00
Merci ;-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 12 oct. 2006 à 10:38
Ouais, tien, je pensais que c'était true par défaut moi...bizarre. D'autant plus que ça tourne chez moi.
Bon enfin je vais mettre true aussi, ça fera pas de mal!
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 12 oct. 2006 à 10:37
Salut,
pour la lecture de ton fichier de 5000 lignes en 2 secs j' ai aucun timeout avec ou sans ajax ^^
Pour le mettre en timeout (2secs) j' ai fais ceci :
for($i=0;$i<=100000;$i++){
echo $i,"
\r\n";
}
timeout à $i = 56374
sinon avec ajax pas de timeout ;-)
10/10
@+
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 12 oct. 2006 à 10:10
Salut,
Nan ça marche pas non plus :S
Mais j' ai trouvé d' où venais le problème ;-)
oXmlhttp.open('POST', SCRIPT);
Il manque le dernier paramètre ^^ et or quand on ne met rien il a pour valeur false ^^
Dès que j' ai mit oXmlhttp.open('POST', SCRIPT, true);
ça a marché nikel ;-)
@+
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 12 oct. 2006 à 09:36
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 12 oct. 2006 à 08:13
Salut,
"PHP version 4.3.3, et ça marche sous IE...?
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5."
>> Enfin quand je dis que ça marche ajax marche ^^
Il est évidant que la class php ne puisse marcher.
Mais ce que je voulais voir c' etait ta class en javascript donc peu importe la version de php ^^
Avec IE il m' envoie toutes les erreurs qui sont faites avec php, alors qu' avec FF rien :'(
"Bon enfin, quelle est l'erreur JS sous firefox ?"
>> Il n' y a aucune erreur !!!
C' est trop zarb :S
"Essaye en virant le parent devant document...mais je ne suis pas convaincu.
essaye aussi en gardant parent.blabla, mais à la place du appendChild (), tu mets un bon vieux non standard
parent.document.getElementById(TARGET).innerHTML += oXmlhttp.responseText"
>> J' y ai déjà pensé ^^
J' ai essayé:
parent.document.getElementById(TARGET).innerHTML = oXmlhttp.responseText;
Et toujour rien :'(
Alors que si je fais :
alert(Xmlhttp.responseText);
Il m' affiche mon alert avec tout ce qu' il faut :S
Voilà la version de FF : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7
Javascript : On
Une idée ??
@+
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 12 oct. 2006 à 07:55
Immortal => essaye aussi en gardant parent.blabla, mais à la place du appendChild (), tu mets un bon vieux non standard
parent.document.getElementById(TARGET).innerHTML += oXmlhttp.responseText
Mais si ça vient vraiment du TARGET, ben y a un truc qui ne colle pas. S'il est bien défini dans ta page appelant, et que la classe js est bien incluse via <script.../>, elle doit trouver l'élément dans le document parent.
Jean84 => là j'utilise la classe Exception standard, je n'ai pas défini la mienne. Je le ferai peut-être, pour le fun, et mieux séparer les choses. La doc officielle est pratique, mais manque d'infos à ce sujet, c'est vrai.
Cet article sur les blogs dév de Zend est pas mal (mais en anglais hein, je précise pour les réfractaires):
http://devzone.zend.com/node/view/id/666
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 11 oct. 2006 à 21:19
"PHP version 4.3.3, et ça marche sous IE...?
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5.
- Mdr, fallait oser ^^, surtout que le titre est plus qu'evocateur : [PHP5] NOTIMEOUT PACKAGE
- J'ai jamais compris comment on pouvait definir sa propre classe d'exeptions. J'ai voulu l'utiliser avec mes classes en C++ mais a chaque fois je me bornais a n'utiliser qu'un seul catch(..) afin de tout recuperer, car je pigeais a peu pres.. que dalle ! lol
Comment sa fonctionne en php5 ? T'as un tuto ou un truc dans le genre ??
Merci ;-)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 19:43
PHP version 4.3.3, et ça marche sous IE...?
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5.
Bon enfin, quelle est l'erreur JS sous firefox ?
Essaye en virant le parent devant document...mais je ne suis pas convaincu.
Et puis c'est bizarre que sur mon firefox ça marche, si c'était un problème client.
Et côté serveur, ça devrait ne PAS DU TOUT marcher, avec PHP4.
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 11 oct. 2006 à 19:23
Salut,
J' ai rien touché et j' utilise index.php
Ma config c' est :
Apache version 1.3.27
PHP version 4.3.3
MySQL version 4.0.15
J' ai mit à jour avec ton nouveau code est rien c' est pareil :@
9a marche pas avec FF et ça marche avec IE :S
@+
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 16:11
J'ai quand même décidé de te faire plaisir, stepibou ;-)
Mate le nouveau code : j'ai utilisé les exceptions différemment.
Autre façon de faire ;-)
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 11 oct. 2006 à 15:39
"Ouais mais 1 try appelle 1 catch. Et je voulais, ici, 1 catch par erreur possible : connexion échouée, sélection de la db échouée, etc..."
la succetion de if te sert justement à preparer le catch final...
Mais c'est vrai que si il y a une hierarchie dans les etapes, on est obliger de faire comme tu a fait, a ok, ... Et ouai si on veut afficher que l'erreur primaire en effet.
C'est peu compliqué tout de meme. :p
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 15:07
Voilà pour le message.
ceci dit, j'ai tjrs besoin de tes codes pour voir ce qui peut planter chez toi.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 14:55
Je ne l'ai pas testé sous...IE. Je ne l'ai testé que sous Firefox.
Au passage, je n'ai pas fini l'implémentation du message, justement. Vais m'y atteler.
Montre le code de ton index (ou dis moi lequel tu utilises si tu n'as rien modifié), idem pour le script.
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 11 oct. 2006 à 14:44
Salut,
Chez moi j' ai un bug quand je le test avec firefox !
ça met Attente :@
Alors qu' avec IE aucun bug :S
J' ai fait quelque essaie et ça viendrait de la ligne 118 :
parent.document.getElementById (TARGET).firstChild.appendData (oXmlhttp.responseText);
oXmlhttp.responseText a des données correctes mais l' affectation de ces données à l' id divContent n' est pas bonne de même avec msg !!!
Une idée ???
Sinon tout marche nikel ;-)
@+
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 09:19
Ouais mais 1 try appelle 1 catch. Et je voulais, ici, 1 catch par erreur possible : connexion échouée, sélection de la db échouée, etc...
Tu remarqueras que dans d'autres méthodes, je n'utilise qu'1 try, parce que je ne veux intercepter qu'1 erreur (si j'échoue dans l'ouverture d'un fichier...une fois ouvert, j'arriverai à le lire à priori).
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 11 oct. 2006 à 09:08
Oui, effet ca m'a fait prendre conscience que je faisais les choses de facon un un trop "laxiste" qq fois.
Mais bon pour des élements constants, qui ne sont pas omdifier je ferai pas de modifications, mais pr les elément variables et qui plus est accessible par methodes GET ou POST , là c'est sure c'est indispensable!
j'y retourne de ce pas!
Sinon, y a quand meme qq chose qui me chagrine dans ton code, c'est la succession de try justement.
En effet ici tu n'utilise pas les avantages de try par rapport au if.
Le try permet d'essayer plusieurs lignes de commandes successives avant d'arriver a un evantuel echec.
Alors que le if essaye un element, par un element.
concretement:
try 1
try 2
try 3
=>
if 1
if 2
if 3
try 1 2 3
Voila, mais bravo pr ta source et ton partage!!
a+
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 11 oct. 2006 à 08:16
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 change pas... ??"
=> mais le code change tout le temps...? Tu peux le faire évoluer sur la même page, changer les paramètres...etc. Sans parler de pages différentes.
Il ne faut pas confondre optimisation et laisser-aller! Tu ne peux JAMAIS être sûr à 100% que ton code recevras toujours les bons paramètres. Parce que généralement, un code est alimenté par un autre code, lui-même dépendant d'un 3ème etc...
Ma façon de coder est efficace...la preuve : en production, mes serveurs sont quand même en error_reporting (E_ALL). Et je fais des sites grand public, pour de grosses boîtes.
Donc non, je ne suis pas d'accord avec toi ;-) Ca n'alourdit pas le code, au contraire, à la lecture, on voit tout de suite ce dont on a besoin. Et ça ne le ralentit pas, parce qu'un try ou un if ( isset ()), ça ne bouffe pas trop de ressource. Et parce qu'à côté de ça, j'optimise quand même pas mal...
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 10 oct. 2006 à 20:20
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..?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 10 oct. 2006 à 18:00
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
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 10 oct. 2006 à 17:19
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...
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 10 oct. 2006 à 08:21
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é...!
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 10 oct. 2006 à 08:19
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 :-)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 9 oct. 2006 à 22:39
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
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 9 oct. 2006 à 18:35
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{} ^^
19 mai 2008 à 21:20
Ca peut fonctionner pour la génération d'un mega fichier zip ?
23 mai 2007 à 19:39
En fait, ça ne sert à rien si ce n'est à perdre des ressources pour rien...faudra que je recode ça.
Alakhnor => l'utilisation de ces classes passent nécessairement par une revisite de ton code. Il faut le voir autrement : la boucle est gérée par du javascript, c'est tout.
Poutr php4, tu dois pouvoir réécrire la classe php...à priori. Rien de vital ne tire partie des spécificités PHP5.
6 mai 2007 à 17:08
Enfin si, mais au niveau des try{}catch() non.
J'aurais dégagé les try{}catch() des méthodes pour commencer.
Théoriquement, le try{}catch() se fait lors d'un appel de méthode et pas dans la méthode elle même. Sauf si c'est pour appeler une méthodes privée/protégée.
Ex :
# 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 ();
# }
Ce que j'aurais fait :
public function __set($var, $val) {
if ( !array_key_exists($var, $this -> aProps) )
throw new GetSetException($var, 'set');
// suite...
}
Et quand tu appèles ta classe de l'extérieur :
try {
$maclasse = new noTimeOut;
$maclasse->timeout = 360;
// etc..
} catch ( GetSetException $gs ) {
die ( $gs->getMessage() );
} catch ( Exception $e ) {
die ( $e->getMessage() );
}
Par contre (voila la suite ^^) :
#public function flushMe ($aWork = null) {
# 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;
switch ($this -> aProps['TYPE']) {
case 'DB':
if ( !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 IssetException('DB');
try {
$mTmp = $this -> getDB ();
} catch ( Exception $e ) {
die ( $e->getMessage() );
}
break;
// Etc...
try {
$maclasse = new noTimeOut;
$maclasse->timeout = 360;
$maclass->flushMe();
// etc..
} catch ( GetSetException $gsE ) {
die ( $gsE->getMessage() );
} catch ( IssetException $iE ) {
die ( $iE->getMessage() );
} catch ( Exception $e ) {
die ( $e->getMessage() );
}
Voila comment je l'aurais joué. J'aurais étendu la classe d'exception pour chaque cas :)
Autrement, ton try{}catch() ne sert pas à grand chose dans une classe :)
5 mai 2007 à 20:36
- je dois développer en php4
- mon programme est une boucle effectuant un certains nombre de traitements incluant des requêtes vers FlickR calculées par le reste. Je ne vois pas trop comment déporter des traitements et les traiter dans la classe php.
2 nov. 2006 à 18:06
2 nov. 2006 à 17:56
merci pour tes explications :)
je vais tester ça de ce pas ... puis allez j'te fais un petit vote pour tous les efforts que tu fais pour nous ;)
merki
@++
2 nov. 2006 à 12:34
ce code a été nominé pour les innovation Awards de phpclasses.org.
Je ne serais pas contre un petit vote ;-)
http://www.phpclasses.org/vote.html
Merci par avance !
27 oct. 2006 à 12:31
Donc, soit tu le mets en short_open_tag à Off, histoire qu'il ne prenne pas le <? de la l'en tête XML pour du php, soit tu fais un echo :
echo '<?xml version="1.0" encoding="iso-8859-1"?>';
Pour les autres parse error, forcément...s'il commence à interpréter ça comme du php, il continue jusqu'à ce qu'il rencontre un tag de fermeture...donc, tout le html est interprété comme du PHP.
27 oct. 2006 à 12:07
le système à l'air très intéréssant cependant en testant en local avec php 5.1.2 j'ai cette erreur
Parse error: parse error in c:\no_time_out_package\obuffer\index.php on line 13
la ligne en question étant
<?xml version="1.0" encoding="iso-8859-1"?>
effectivement je comprends bien que le serveur interprète ça en php alors que ça n'en est pas.
même si j'enlève cette ligne j'ai plein de parse error :(
@++
20 oct. 2006 à 10:37
Je viens de mettre à jour la source.
Je n'ai pas fini encore, mais déjà, une addition importante : le package gère maintenant des piles de processus. Ce qui veut dire que l'on peut lancer plusieurs traitements en asynchrone : lire 2 fichiers à la fois par exemple.
index6.php a aussi été ajouté et montre justement ce fonctionnement.
La façon d'instancier l'objet a été modifié aussi, voir le readme.txt et les différents fichiers.
17 oct. 2006 à 20:08
Script intéressant, et bien élaboré,
bonne explication et suivie de la source,
ce qui est assez rare....
Ma note : 10
Bon Prog........
17 oct. 2006 à 08:12
Evidemment, on peut aussi modifier le php.ini. Idem, il faut y avoir accès.
Il y aussi le safe mode, s'il est activé, et qu'on veut le garder (ahem), on ne peut pas modifier comme ça ces valeurs.
Ce script est fait pour ce genre de situations. Mais il a aussi un autre avantage : avec un set_time_limit (0), ta page restera vierge jusqu'à ce que le traitement soit terminé. Ce qui peut prendre 1mn, 2mn, 10mn...etc. Sans rien. Ce script, lui, affiche en continue les données qu'il récupère. La page est "vivante", elle bouge, elle ne laisse pas l'utilisateur devant une page vide.
16 oct. 2006 à 21:28
je me suis arréter a :
"même si ça prend 5mn, avec un time limit de 30 secondes, sans aucun problème"
Et la je me suis presser de m'authentifier et
d'écrire se commentaire :
Moi j'ai une astuce pour exécuter un document php
quelque sois la longueur des lignes, la voici ^^' :
Je place en tête du script : "set_time_limit( 0 );"
Afin de ne mettre aucune limit de temps
Et a la fin : "exit;"
Pour quiter l'exécution du code
Enfin voila quoi,
a mon avie vous avez deja tablé sur la question mais bon,
c'étais juste au cas ou....
Bon prog........... xD
~~ DotWizard512 ~~
13 oct. 2006 à 13:06
"Ps : c'est pour PHP5, les exceptions, hein."
>> J' ai vu ^^ merci ;-)
Merci pour ces explications ;-)
Dernier petit truc tu as omis de mettre une vérification en JavaScript ( enfin plustot en Ajax ^^ ) :
Tu ne vérif pas si la page a été trouvée :S c' est pas obligé mais c' est mieux :
if(oXmlhttp.readyState 4 && oXmlhttp.status 404){// Erreur 404 ! Fichier introuvable !
document.getElementById(MSG).innerHTML = '
Le fichier ' + SCRIPT + ' n\' existe pas !
';
return false;
}
@+
}
13 oct. 2006 à 11:40
Sinon, je me rends compte que pour bien utiliser ce package, il faut comprendre ce qu'il fait...j'incluerai un tuto dans le package un de ces jours.
Mais je vais donner un exemple :
sans utiliser la classe PHP, qui ne servira à rien dans ce cas. On peut utiliser la classe JS, elle facilitera les choses.
Il suffit d'utiliser sa méthode getDefault (donc, type = DEFAULT).
On met un STEP de 100 par exemple, un START à 0, et pas de limite (dans ce cas, virer le if (j < LIMIT) et toujours rappeler récursivement la méthode xmlhttp), ou une très grande limite, genre 1 milliard. Dans le fichier de traitement PHP, on récupère START, et STEP. Et on fait un truc du genre : for ($i = START; $i < START + STEP; $i ++) et on affiche $i. (je n'ai pas utiliser les bonnes variables hein, ce sera $_POST['iStart'] par exemple, si on reste dans le cadre de mon package). On met dans ce fichier, et même le fichier d'appel pour être convaincu, un set_time_limit (5) par exemple.
Tu verras que PHP affichera les chiffres, sans sourciller. Il pourra ainsi tourner indéfiniment, jusqu'à arriver à LIMIT s'il y en a une, et affichera : 0, 1, 2...500...10000...99999999, 999999999999999 etc... durant des jours et des jours si tu le veux.
Essaye de faire ça sans mon package, ou du moins, sans ce qu'il montre (avec un time_limit évidemment hein), tu auras du mal.
Ce package peut aussi permettre d'éviter le dépassement de la mémoire allouée à PHP dans certain cas. Une énorme requête par exemple, qui va chercher des tonnes d'enregistrements, peut planter à ce niveau là, avant le timeout. Ben là c'est pareil, vu que je vais récupérer mes enregistrements en plusieurs passes, la mémoire allouée ne sera pas dépasser (si on calcule bien hein).
Bien sûr, ce n'est pas valable pour, par exemple, le redimensionnement d'une image énorme! On ne peut - à priori - pas faire ça en plusieurs passes. Donc...niet.
J'espère que ça éclaircit un peu le bin's :-)
13 oct. 2006 à 11:21
Mais Ajax, c'est du js, donc ce n'est pas soumis au timeout. Mon package utilise Ajax pour effectuer un traitement lourd en plusieurs fois, en appelant un nombre de fois le traitement serveur, nbre de fois défini par le STEP et LIMIT, STEP se chargeant aussi d'incrémenter le traitement: par exemple, j'ai un fichier de 10000 lignes, je veux le lire en entier mais avec PHP ça prend trop de temps. Donc j'utilise ce package pour lire, par exemple, le fichier 100 lignes par 100 lignes. Ajax me l'affiche 100 lignes par 100 lignes (en gardant les lignes précédentes évidemment) : j'ai un affichage séquentiel, qui dure ce qu'il dure, mais qui n'est jamais arrêté avant la fin de la lecture complète.
Même principe pour n'importe quel autre traitement : je veux envoyer 50000 emails ? Pas de problème. Lire une table contenant 1000000 d'entrées ? No problemo... ;-)
vas voir sur la doc officielle, php.net, pour les exceptions :
http://fr2.php.net/manual/fr/language.exceptions.php
13 oct. 2006 à 10:11
donc enfaite Ajax n' empêche pas le timeout ?
Enfaite pour éviter le time out tu ruses, nan ?
Tu fais les choses en plusieurs fois.
Sinon autre question ( je suis chiant je sais ^^ ) comment marche try et catch ??
Car j' ai rien trouvé dans la doc de php :S
@+ et merci
13 oct. 2006 à 09:12
Et elle est bonne parce que : xmlhttp est un objet javascript, donc exécuté côté client. On appelle grâce à lui un traitement côté serveur. A ce moment, le décompte du temps commence. Le traitement s'effectue. S'il dure trop longtemps, boum, timeout. D'où le STEP que j'ai mis dans mes classes. Une fois le traitement effectué, le serveur balance le résultat au client, et évidemment, vu qu'on quitte le serveur, le décompte s'arrête et le temps imparti revient à 0. Là, ma classe vérifie si on a fini (LIMIT), sinon, elle rebalance un traitement, en incrémentant grâce au STEP, au serveur. Le décompte recommence, etc.
Soit tu as mal utilisé ma classe, soit ton STEP est trop gros.
Chez moi ça marche parfaitement. Sauf dans un cas : si on fait une connerie dans l'utilisation qui provoque une erreur dans la classe PHP par exemple (et encore, normalement, plus maintenant, vu que j'intercepte tout).
Quant à avoir une idée, non, pas son le code utilisé.
12 oct. 2006 à 22:51
Désoler de casser l' embiance :S mais ta théorie comme quoi ajax empêcherai le timeout est fausse :S
Ou alors mauvaise manipulation du code de ma part !?
Le zip : http://immortal-pc.info/Ajax/Ajax.zip
à $i = 98650
Fatal error: Maximum execution time of 2 seconds exceeded in script.php on line 17
Une idée ??
@+
12 oct. 2006 à 12:55
12 oct. 2006 à 11:00
12 oct. 2006 à 10:38
Bon enfin je vais mettre true aussi, ça fera pas de mal!
12 oct. 2006 à 10:37
pour la lecture de ton fichier de 5000 lignes en 2 secs j' ai aucun timeout avec ou sans ajax ^^
Pour le mettre en timeout (2secs) j' ai fais ceci :
for($i=0;$i<=100000;$i++){
echo $i,"
\r\n";
}
timeout à $i = 56374
sinon avec ajax pas de timeout ;-)
10/10
@+
12 oct. 2006 à 10:10
Nan ça marche pas non plus :S
Mais j' ai trouvé d' où venais le problème ;-)
oXmlhttp.open('POST', SCRIPT);
Il manque le dernier paramètre ^^ et or quand on ne met rien il a pour valeur false ^^
Dès que j' ai mit oXmlhttp.open('POST', SCRIPT, true);
ça a marché nikel ;-)
@+
12 oct. 2006 à 09:36
Non, je n'ai pas d'idée, là, à priori.
Essaye avec cette version non pacakagée :
http://www.phpcs.com/codes/GENERER-VOLUME-IMPORTANT-DONNEES-SANS-HEURTER-TIMEOUT-PHP_39811.aspx
Elle est sensiblement différente, moins pratique aussi, mais elle montre en fait l'astuce. Ce package-ci est une application de cette astuce.
12 oct. 2006 à 08:13
"PHP version 4.3.3, et ça marche sous IE...?
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5."
>> Enfin quand je dis que ça marche ajax marche ^^
Il est évidant que la class php ne puisse marcher.
Mais ce que je voulais voir c' etait ta class en javascript donc peu importe la version de php ^^
Avec IE il m' envoie toutes les erreurs qui sont faites avec php, alors qu' avec FF rien :'(
"Bon enfin, quelle est l'erreur JS sous firefox ?"
>> Il n' y a aucune erreur !!!
C' est trop zarb :S
"Essaye en virant le parent devant document...mais je ne suis pas convaincu.
essaye aussi en gardant parent.blabla, mais à la place du appendChild (), tu mets un bon vieux non standard
parent.document.getElementById(TARGET).innerHTML += oXmlhttp.responseText"
>> J' y ai déjà pensé ^^
J' ai essayé:
parent.document.getElementById(TARGET).innerHTML = oXmlhttp.responseText;
document.getElementById(TARGET).innerHTML = oXmlhttp.responseText;
document.getElementById(TARGET).firstChild.appendData = oXmlhttp.responseText;
Et toujour rien :'(
Alors que si je fais :
alert(Xmlhttp.responseText);
Il m' affiche mon alert avec tout ce qu' il faut :S
Voilà la version de FF : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7
Javascript : On
Une idée ??
@+
12 oct. 2006 à 07:55
parent.document.getElementById(TARGET).innerHTML += oXmlhttp.responseText
Mais si ça vient vraiment du TARGET, ben y a un truc qui ne colle pas. S'il est bien défini dans ta page appelant, et que la classe js est bien incluse via <script.../>, elle doit trouver l'élément dans le document parent.
Jean84 => là j'utilise la classe Exception standard, je n'ai pas défini la mienne. Je le ferai peut-être, pour le fun, et mieux séparer les choses. La doc officielle est pratique, mais manque d'infos à ce sujet, c'est vrai.
Cet article sur les blogs dév de Zend est pas mal (mais en anglais hein, je précise pour les réfractaires):
http://devzone.zend.com/node/view/id/666
11 oct. 2006 à 21:19
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5.
- Mdr, fallait oser ^^, surtout que le titre est plus qu'evocateur : [PHP5] NOTIMEOUT PACKAGE
- J'ai jamais compris comment on pouvait definir sa propre classe d'exeptions. J'ai voulu l'utiliser avec mes classes en C++ mais a chaque fois je me bornais a n'utiliser qu'un seul catch(..) afin de tout recuperer, car je pigeais a peu pres.. que dalle ! lol
Comment sa fonctionne en php5 ? T'as un tuto ou un truc dans le genre ??
Merci ;-)
11 oct. 2006 à 19:43
T'es sûr de ta version de PHP hein ? Parce que la classe noTimeOut PHP est écrite en PHP5.
Bon enfin, quelle est l'erreur JS sous firefox ?
Essaye en virant le parent devant document...mais je ne suis pas convaincu.
Et puis c'est bizarre que sur mon firefox ça marche, si c'était un problème client.
Et côté serveur, ça devrait ne PAS DU TOUT marcher, avec PHP4.
11 oct. 2006 à 19:23
J' ai rien touché et j' utilise index.php
Ma config c' est :
Apache version 1.3.27
PHP version 4.3.3
MySQL version 4.0.15
J' ai mit à jour avec ton nouveau code est rien c' est pareil :@
9a marche pas avec FF et ça marche avec IE :S
@+
11 oct. 2006 à 16:11
Mate le nouveau code : j'ai utilisé les exceptions différemment.
Autre façon de faire ;-)
11 oct. 2006 à 15:39
la succetion de if te sert justement à preparer le catch final...
Mais c'est vrai que si il y a une hierarchie dans les etapes, on est obliger de faire comme tu a fait, a ok, ... Et ouai si on veut afficher que l'erreur primaire en effet.
C'est peu compliqué tout de meme. :p
11 oct. 2006 à 15:07
ceci dit, j'ai tjrs besoin de tes codes pour voir ce qui peut planter chez toi.
11 oct. 2006 à 14:55
Au passage, je n'ai pas fini l'implémentation du message, justement. Vais m'y atteler.
Montre le code de ton index (ou dis moi lequel tu utilises si tu n'as rien modifié), idem pour le script.
11 oct. 2006 à 14:44
Chez moi j' ai un bug quand je le test avec firefox !
ça met Attente :@
Alors qu' avec IE aucun bug :S
J' ai fait quelque essaie et ça viendrait de la ligne 118 :
parent.document.getElementById (TARGET).firstChild.appendData (oXmlhttp.responseText);
oXmlhttp.responseText a des données correctes mais l' affectation de ces données à l' id divContent n' est pas bonne de même avec msg !!!
Une idée ???
Sinon tout marche nikel ;-)
@+
11 oct. 2006 à 09:19
Tu remarqueras que dans d'autres méthodes, je n'utilise qu'1 try, parce que je ne veux intercepter qu'1 erreur (si j'échoue dans l'ouverture d'un fichier...une fois ouvert, j'arriverai à le lire à priori).
11 oct. 2006 à 09:08
Mais bon pour des élements constants, qui ne sont pas omdifier je ferai pas de modifications, mais pr les elément variables et qui plus est accessible par methodes GET ou POST , là c'est sure c'est indispensable!
j'y retourne de ce pas!
Sinon, y a quand meme qq chose qui me chagrine dans ton code, c'est la succession de try justement.
En effet ici tu n'utilise pas les avantages de try par rapport au if.
Le try permet d'essayer plusieurs lignes de commandes successives avant d'arriver a un evantuel echec.
Alors que le if essaye un element, par un element.
concretement:
try 1
try 2
try 3
=>
if 1
if 2
if 3
try 1 2 3
Voila, mais bravo pr ta source et ton partage!!
a+
11 oct. 2006 à 08:16
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 change pas... ??"
=> mais le code change tout le temps...? Tu peux le faire évoluer sur la même page, changer les paramètres...etc. Sans parler de pages différentes.
Il ne faut pas confondre optimisation et laisser-aller! Tu ne peux JAMAIS être sûr à 100% que ton code recevras toujours les bons paramètres. Parce que généralement, un code est alimenté par un autre code, lui-même dépendant d'un 3ème etc...
Ma façon de coder est efficace...la preuve : en production, mes serveurs sont quand même en error_reporting (E_ALL). Et je fais des sites grand public, pour de grosses boîtes.
Donc non, je ne suis pas d'accord avec toi ;-) Ca n'alourdit pas le code, au contraire, à la lecture, on voit tout de suite ce dont on a besoin. Et ça ne le ralentit pas, parce qu'un try ou un if ( isset ()), ça ne bouffe pas trop de ressource. Et parce qu'à côté de ça, j'optimise quand même pas mal...
10 oct. 2006 à 20:20
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..?
10 oct. 2006 à 18:00
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
10 oct. 2006 à 17:19
Au fait, c'est quoi un __set() ? Sa fait plusieurs fois que t'en parles, j'ai pas comrpis ce que c'etait...
10 oct. 2006 à 08:21
10 oct. 2006 à 08:19
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 :-)
9 oct. 2006 à 22:39
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
9 oct. 2006 à 18:35
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{} ^^