IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] Script assez long à exécuter jusqu'au bout côté serveur


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut [Système] Script assez long à exécuter jusqu'au bout côté serveur
    Bonjour,

    Contexte:
    Animation Flash qui permet de créer un joli dessin avec la souris.
    Envoi pixel par pixel de l'image créée à une page PHP pour générer une image JPEG.

    L'animation met 20 secondes environ à envoyer 320 000 variables
    Mais le script PHP met plus de 3 minutes à créer effectivement l'image!

    Problème:
    le script PHP s'exécute dans une autre fenêtre qui s'ouvre en cliquant sur "Générer Image". Mais si l'utilisateur ferme cette fenêtre, l'image n'est pas générée! Or moi je voudrais impérativement qu'elle soit enregistrée.

    En ASP y'a un RUNAT=Server, mais est-ce que ce type de script s'exécute même si la fenêtre est fermée pendant l'exécution du script? En PHP comment c'est faisable? Ou est-ce au moins faisable?

    @+! Samy

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    tu es obligé d'envoyer l'image pixel par pixel !?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Je m'y attendais à celle-la!

    Dans flash, ce n'est pas une image, mais plusieurs superposées, donc pour récupérer ce qui est à l'écran, c'est uniquement du pixel par pixel.

    En fait, c'était juste le contexte ça...ma question principale serait:

    "Comment être sûr qu'un long script soit exécuter jusqu'à la fin"? Je ne peux pas empêcher la fermeture de la fenêtre, c'est pourquoi je cherchais un moyen d'exécuter ça uniquement sur le serveur.

    @+! Samy

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    mais que veut tu faire exactement ??? racourcir le temps d'exécution de ton script ou surtout que ton script passe ???

  5. #5
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    Hello,

    http://at2.php.net/manual/fr/function.ignore-user-abort.php


    Sinon, tout comme dit plus haut, tu as visiblement un problème de conception, parce que 3 minutes pour construire une bete image, c'est quand même énorme... et traiter l'image pixel par pixel, y a longtemps que ça ne se fait plus... s'il s'agit vraiment de "calques" différents, tu peux les envoyer tels quel à PHP (en PNG par exemple), et il les fusionnera... ça irra certainement plus vite....

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    Citation Envoyé par Kioob
    Hello,

    http://at2.php.net/manual/fr/function.ignore-user-abort.php


    Sinon, tout comme dit plus haut, tu as visiblement un problème de conception, parce que 3 minutes pour construire une bete image, c'est quand même énorme... et traiter l'image pixel par pixel, y a longtemps que ça ne se fait plus... s'il s'agit vraiment de "calques" différents, tu peux les envoyer tels quel à PHP (en PNG par exemple), et il les fusionnera... ça irra certainement plus vite....
    il explique pourquoi il ne peut pas envoyer toutes l'image non ???

  7. #7
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    non.

    "plusieurs images superposées" = "calques" = possibilité d'envoi à PHP pour fusion. Pas de traitement par pixel ici.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    sinon il a qu'a augmenter le time_max_execution_server a 5 min ... lol

  9. #9
    Membre très actif
    Avatar de Wormus
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Par défaut
    Bon admettons que tu sois obligé de recourir à cette méthode !

    pk veut tu recréer l'image entièrement sur l'autre page pour l'enregistrer peut être peut tu enregistrer l'ensemble de tes 300000 variables qd l'utilisateur clique sur son bouton et ensuite générer l'image
    Enfin je m'y connais pas trop dans ce domaine donc corrige moi si ce que je dit est abérant mais ce serait peut être énormément plus rapide !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Précisions, car la plupart d'entre vous ne vous êtes pas intéressé à ma question principale:

    Ce ne sont pas des calques figés, le visiteur peut déposer plusieurs clips différents dans un même clip avec des zones de textes qu'il peut poser par-dessus et un clip en fond...je pense pas que ce genre d'explication ait été nécessaire...bref, ce ne sont pas 2 ou 3 calques prédéfinis qui pourraient être envoyés.

    Concernant le ignore_user_abort, c'est intéressant, mais je m'y connais pas beaucoup en PHP:
    C'est comme un envoi de formulaire en POST qui envoie toutes mes variables à ma page PHP où il y a mon script. J'ai juste à ajouter ignore_user_abort() au début du script?

    Pour le time_max_execution_server, c'était prévu. Mais en ASP, y'a RUNAT=Server ...en PHP y'a qqch qui ressemble???


    Sinon, l'idée intéressante, c'est de retenir toutes les valeurs dans une BDD...l'inconvénient étant le poids d'un tel stockage!!!!

    Merci pour tous ces commentaires en tout cas!

    @+! Samy

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Le principal: être sûr que tout mon script s'exécute. Peu importe la durée...mais il faut qu'il continue à s'exécuter si le visiteur ferme la fenêtre

    Alors est-ce que avec ignore_user_abort au début du script ça répondrait à mon problème?

  12. #12
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    oui, "ignore_user_abort" sert justement à ça, et uniquement à ça.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    D'après le nom j'étais plutôt confiant...je m'empresse de vérifier cela!

    @+! Samy

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Bon, ben ignore_user_abort, ça marche pas du tout! Je dois mal m'y prendre...

    j'ai mon script, et après <?php je mets 2è ligne: ignore_user_abort(true) ...j'ai essayé avec "false" aussi sans plus de succès!

    Une idée?

  15. #15
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Oui : il ne faut pas du tout mettre de paramètre ^_^

    [Edit] N'oublie pas set_time_limit()

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    J'me suis tourné vers register_shutdown_function, ça aurait pu être bien, mais j'ai lu que les buffers étaient vidés avant l'exécution d'une telle fonction...bref toutes mes variables passées sont perdues avant l'exécution de cet évènement! GRRRRRRRRR


    ...vais pas y arriver!!

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    Si seulement c'était si simple...

    Je vous mets l'intégralité du script PHP (c'est pas de moi)

    Si j'appuie pas sur le bouton STOP ou que je ferme pas le fenêtre, le script fonctionne nickel! Autre idée???


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    <?php
    ignore_user_abort();
    set_time_limit(0);
    error_reporting(0);
     
    function creerImage(){
    	/**
    	 * Get the width and height of the destination image
    	 * from the POST variables and convert them into
    	 * integer values
    	 */
    	$w = (int)$_POST['width'];
    	$h = (int)$_POST['height'];
     
    	// create the image with desired width and height
     
    	$img = imagecreatetruecolor($w, $h);
     
    	// now fill the image with blank color
    	// do you remember i wont pass the 0xFFFFFF pixels 
    	// from flash?
    	imagefill($img, 0, 0, 0xFFFFFF);
     
    	$rows = 0;
    	$cols = 0;
     
    	// now process every POST variable which
    	// contains a pixel color
    	for($rows = 0; $rows < $h; $rows++){
    		// convert the string into an array of n elements
    		$c_row = explode(",", $_POST['px' . $rows]);
    		for($cols = 0; $cols < $w; $cols++){
    			// get the single pixel color value
    			$value = $c_row[$cols];
    			// if value is not empty (empty values are the blank pixels)
    			if($value != ""){
    				// get the hexadecimal string (must be 6 chars length)
    				// so add the missing chars if needed
    				$hex = $value;
    				while(strlen($hex) < 6){
    					$hex = "0" . $hex;
    				}
    				// convert value from HEX to RGB
    				$r = hexdec(substr($hex, 0, 2));
    				$g = hexdec(substr($hex, 2, 2));
    				$b = hexdec(substr($hex, 4, 2));
    				// allocate the new color
    				// N.B. teorically if a color was already allocated 
    				// we dont need to allocate another time
    				// but this is only an example
    				$test = imagecolorallocate($img, $r, $g, $b);
    				// and paste that color into the image
    				// at the correct position
    				imagesetpixel($img, $cols, $rows, $test);
    			}
    		}
    	}
     
    	// print out the correct header to the browser
    	header("Content-type:image/jpeg");
    	// display the image
    	imagejpeg($img, "images/pixel.jpg", 50);
    }
     
    creerImage();
    ?>

  18. #18
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    essayes plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error_reporting( E_ALL ); 
    ignore_user_abort( true );
    set_time_limit( 600 );
    Je vois deux possibilités :
    1) le ignore_user_abort est refusé (à cause du SAFE_MODE, ou autre)
    2) tu fais STOP dans ton navigateur avant que les données ne soient complètement envoyées... dans ce cas là, rien à faire, le seul moyen d'éviter ça est de fortement diminuer le volument de données à transfèrer (en compressant par exemple).

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Par défaut
    J'ai essayé en modifiant les 3 premières lignes...nada

    En fait, dans l'url, rien ne s'affiche quand la page PHP contenant le script s'ouvre. L'adresse apparaît beaucoup plus tard! (c'est donc bien possible que toutes les données ne soient pas encore transférées...)

    Concernant la compression, cela est malheureusement impossible pour l'instant...il y a bien une solution, mais nécessite AS3 et FlashPlayer 8.5 (qui n'est encore qu'en version alpha...)

    Vivement qu'elle sorte que je puisse optimiser ce temps d'exécution!!! C'est bien beau les nouvelles classes de Flash 8, mais faudrait qu'ils prévoient d'autres trucs chez Macromédia maintenant qu'on puisse s'en servir plus simplement!!!!

    @+! Samy

Discussions similaires

  1. Laisser le temps à un fichier .wav de s'exécuter jusqu'au bout
    Par pelerin98 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/08/2014, 15h55
  2. Script assez long bloque les gif animés de la page
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/07/2008, 16h53
  3. Réponses: 7
    Dernier message: 26/03/2007, 12h17
  4. Réponses: 25
    Dernier message: 24/05/2006, 14h35
  5. Réponses: 1
    Dernier message: 15/02/2006, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo