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 :

Continuer script meme si fermeture de la page


Sujet :

Langage PHP

  1. #1
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut Continuer script meme si fermeture de la page
    Bonjour, peut on en php forcer l'execution d'un script meme si le visiteur ferme la page ?

    En faisant des recherches je suis tombée dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set_time_limit(6); 
    ignore_user_abort( true );
    si quelqu'un pouvait m'en dire davantage, merci d'avance.

    Mon but : Rediriger l'utilisateur vers une autre page et appliquer ce bout de code 10 seconde après la redirection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sleep(10);
     
    if (!copy($newfile, $file)) {
    	exit;
    }

  2. #2
    Membre éprouvé Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Points : 1 174
    Points
    1 174
    Par défaut
    Le plus simple dans ton cas est un appel ajax sur ta page.

    Exemple : Si ta page renvoi "non" alors tu ne redirige pas, autrement si.
    Agence web Dim'Solution, créateur de solutions numériques
    Sites internet, ecommerce, logiciels, applications mobiles, référencement (SEO), plugin Prestashop, Magento, WordPress, Joomla!...

    Cours de trading gratuit | Envoyer des sms gratuitement | Envoyer des fax gratuitement | Plateforme de Fax à l'international

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    J'ai l'impression que tu cherches à faire tourner un script même quand il n'y a pas d'utilisateur. Le mieux dans ce cas ce serait de configurer un cron pour lancer des scripts à intervalles réguliers. Un certain nombre d'hébergeurs permettent de faire ça, par exemple OVH.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Non,
    1) je souhaite rediriger le visiteur vers une autre page
    2) 10 seconde après cette redirection je souhaite appliquer ce script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!copy($newfile, $file)) {
    	exit;
    }

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Une chose importante à savoir. Visualise l'architecture client-serveur classique : le client demande, le serveur répond. Avec un serveur Apache (comme le tien, je suppose), chaque requête est gérée par un thread du serveur. De plus, chaque requête utilise une connexion TCP. Tu vas avoir un problème avec ce sleep(10) car, pendant ces dix secondes, la connexion TCP est toujours ouverte (et ça se voit sur la navigateur par l'indicateur de chargement) et le thread serveur est toujours occupé. Si tu es sur un hébergement mutualisé, tu peux recevoir des alertes du style « votre site monopolise trop de ressources » avec éventuellement des sanctions à la clé.

    À quoi sert ce exit ? Le script doit-il continuer si la copie de fichier réussit ? S'il n'a pas besoin de continuer, tu peux lancer un programme en arrière-plan avec la commande exec.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Dans ce cas quel solution me propose tu ?

    Je veut que le visiteur soit rediriger vers une autre pas
    10 seconde après cette redirection je lance la copie
    C'est tout.

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bon, je sais pas exactement comment faire ça, mais on va trouver une solution ensemble. Pour commencer, tu dois déterminer si le safe mode est activé, et si oui, dans quel dossier tu as le droit d'exécuter des commandes. Essaye ce script :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    header('Content-Type: text/plain');
     
    echo 'safe_mode = ';
    var_dump(ini_get('safe_mode'));
     
    echo 'safe_mode_exe_dir = ';
    var_dump(ini_get('safe_mode_exec_dir'));
     
    ?>

    Et dis-moi ce que ça dit. Dis-moi aussi sur quel type de serveur tu es :
    • mutualisé / dédié / personnel ?
    • Apache / Nginx / autre ?
    • Linux / Windows / BSD ?

    Tu as moyen de trouver ces infos grâce à la fonction phpinfo().

    Il y a sans doute moyen de faire lancer le script PHP de copie dans un autre processus, ce qui a l'avantage de libérer la connexion TCP. Pour la question du temps de processeur, je suppose que sleep repose sur les signaux donc ça devrait régler le problème aussi. Si quelqu'un peut confirmer ça serait gentil

    Autre chose, j'ai l'impression que spawner un processus PHP prend pas mal de temps (il faut démarrer une nouvelle instance de PHP). Il sera sans doute plus léger d'utiliser un script shell.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Moi je confirme que c'est une mauvaise idée de procéder comme ceci ^^

    Ce que je ferai, c'est que dès l'arrivée dans le script (ou 10 secondes avant la redirection), tu exécutes directement la tâche qui elle attendra 10 secondes avant de se lancer.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  9. #9
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Je suis sur un serveur mutualisée, il fonctionne sous Linux et c'est un serveur apache.
    Je suis donc limitée par du php, javascript ou du sql

    Voila ce que ton script m'affiche :


    safe_mode = bool(false)
    safe_mode_exe_dir = bool(false)

  10. #10
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Je suis sur un serveur dédiée, il fonctionne sous Linux et c'est un serveur apache.
    Je suis donc limitée par du php, javascript ou du sql

    Etre sous un serveur dédié ne signifie absolument pas que tu es limité à ce que tu as indiqué au dessus.

    Essaye juste ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec('ls',$output);
    var_dump($output);
    Si $output donne bine le résultat attendu, tu peux exécuter des commandes systèmes via php.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  11. #11
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Non je me suis trompé (j'ai confondue les 2), je suis sur un mutualisée.

    T'a commande m'affiche l'arborescense de la racine (les pages et les dossiers, exemple :
    [19]=> string(9) "robot.txt" [20]=> string(10) "script.php"...

  12. #12
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Salut sazearte,

    où en es-tu dans tes recherches ? J'ai trouvé une solution de mon côté, je l'ai testée sur un serveur mutualisé chez OVH. Je ne sais pas si ça marchera chez toi. Le truc qui me manquait c'était de grouper les instructions avec des parenthèses. En faisant comme ça on n'a même pas besoin d'un script shell, et c'est tant mieux pour moi car je ne suis pas à l'aise avec le shell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $from = 'fichier-a-copier';
    $to = 'copie';
    $delay = 10;
     
    exec("(sleep $delay ; cp '$from' '$to') > /dev/null &");
    Ça marche tant que les fichiers sont dans le même dossier que le script. Sinon il y a des confusions entre chemin virtuel (accessible par le Web) et chemin physique (le système de fichiers du serveur). Il y a une bidouille à faire avec $_SERVER['DOCUMENT_ROOT'], je suis en train de plancher dessus.

    L'inconvénient de cette méthode est qu'on n'a pas de retour immédiat pour savoir si la copie a marché ou pas. Il faut attendre que le délai soit écoulé et regarder si le fichier copié est présent. Il faut donc prendre ses précautions en amont dans le script PHP, et contrôler les causes possibles d'échec : fichier/dossier introuvable, problème de permissions.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    J'ai déjà tentée cela, le problème c'est que je souhaite rediriger l'utilisateur vers une autre page avant la copie.

    Si je place ce code au début de page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header ("Refresh: 2;URL=index.php");
    En reprenant ton code, je suis forcer d'attendre 10 seconde et pas 2....

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par sazearte Voir le message
    J'ai déjà tentée cela
    Tu aurais pu le dire

    En reprenant ton code, je suis forcer d'attendre 10 seconde et pas 2....
    Qu'est-ce qui t'empêche de modifier $delay ?

    Tu peux même utiliser une constante à la place pour avoir la même valeur dans le sleep et dans le Refresh.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    define('DELAY', 2);
    header('Refresh: ' . DELAY . '; URL=index.php');
     
    // déclaration de $from et $to...
     
    // contrôles avant copie...
     
    exec('exec("(sleep ' . DELAY . ' ; cp '$from' '$to') > /dev/null &");');
    Ainsi tu n'as qu'une seule ligne à modifier dans ton code quand tu veux changer le délai.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Je me suis mal exprimée,

    Je veut que au bout 2 seconde l'utilisateur soit rediriger de script.php vers index.php
    Au bout de 10 seconde je veut que le fichier test.txt soit copié.

    Seulement je veut pas mettre le code pour copier dans index.php, mais dans script.php.

  16. #16
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    header('Refresh: 2; URL=index.php');
     
    ...
     
    exec("(sleep 10 ; cp '$from' '$to') > /dev/null &");
    devrait convenir. Ou alors on s'est mal compris.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  17. #17
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Excusez moi, oui effectivement sa marche (j'avais oubliée d'appuyée sur f5 dans filezilla)

    Voici le code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    header('Refresh: 2; URL=index.php');
     
    $from = 'test.txt';
    $to = 'test1.txt';
     
    exec("(sleep 5 ; cp '$from' '$to') > /dev/null &");
    ?>

  18. #18
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Pour ma part je n'ai aucun soucis entre les chemins virtuel ou physique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $from = '../test.txt';
    $to = 'temp/test1.txt';

  19. #19
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ok, tant mieux si ça te convient. Le problème ne survient qu'avec les chemins absolus.

    Encore deux remarques :
    • N'oublie pas de contrôler les causes possibles d'erreur de cp, car, comme je l'ai dit, tu n'as pas de retour en cas de problème. Mieux vaut prévenir que guérir.
    • L'entête refresh est ignoré par le navigateur sous certaines conditions, par exemple sous Firefox quand la préférence « Prévenir lorsque des sites Web tentent de rediriger ou de recharger la page » est activée. Il est de coutume de rajouter un lien du genre « cliquez ici si la redirection automatique ne se fait pas » comme tu peux le voir sur certains sites de téléchargement de fichiers.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fermeture d'une page
    Par zorba49 dans le forum VBScript
    Réponses: 1
    Dernier message: 31/07/2006, 15h49
  2. [Javascript] Fermeture d'une page fille et reactualisation de la page mère
    Par tchoukapi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/07/2006, 19h26
  3. fermeture d'une page
    Par kenny49 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/06/2006, 14h38
  4. Message d'erreur à la fermeture d'une page web
    Par WELCOMSMAIL dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 26/04/2006, 17h12
  5. Réponses: 9
    Dernier message: 29/03/2006, 21h41

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