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 :

Lancer des scripts les uns après les autres [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 53
    Points
    53
    Par défaut Lancer des scripts les uns après les autres
    Bonjour,

    Je suis sous 1and1 mutualisé sans SSH ni tâches CRON possibles.
    J'ai un script qui créé des fichiers pdf (via html2pdf) mais ce script prend trop de mémoire sur le serveur et j'ai une erreur (memory limit). J'ai augmenté la mémoire via un php.ini au maximum autorisé. Cela ne suffit pas.

    Je souhaite donc créer plusieurs script exécuté l'un après l'autre qui crééront chacun une page (pas de pb de mémoire pour une seule page).

    L'utilisateur clic sur créér le pdf. Le premier script créé la page 1, libère la mémoire du serveur, passe la main au second script qui créé la page 2, libère la mémoire etc...

    Je n'ai aucune idée de quelles fonctions utiliser.

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu devrais faire ça avec Ajax, lancer les scripts de manière synchrone les uns après les autres ne va rien arranger.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 53
    Points
    53
    Par défaut
    As tu une piste pour l'ajax ? Car le faire en asynchrone (Ajax je crois) ne me diras pas quand le précédent script est terminé.

    Comment s'y prendre en Ajax pour exécuter le script script.php toutes les minutes 20 fois (avec un paramètre passé) par exemples suite au clic d'un seul bouton ?

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    L'idée serait de générer le document page par page comme tu le suggère et de piloter ordonnancement des traitements avec JavaScript (quand une page est fini, on déclenche le trigger de la page suivante et ainsi de suite), on peut même afficher une barre de progression dans ce cas.

    En revanche, ça me parait difficile d'émuler un cronjob de cette façon.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 53
    Points
    53
    Par défaut
    Tu dis: "Lancer les scripts de manière synchrone les uns après les autres ne va rien arranger." Peux tu m'expliquer cela ? La mémoire n'est pas libérée entre chaque script ?

    Ta solution sous entend que la personne doit rester devant son ordi et sur le site pendant la génération des pages. C'est assez pénalisant car si la personne se déconnecte.
    L'idéal serait que les pdfs soient générés puis de les envoyer par email.

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu dis: "Lancer les scripts de manière synchrone les uns après les autres ne va rien arranger." Peux tu m'expliquer cela ? La mémoire n'est pas libérée entre chaque script ?
    Si en effet, en revanche les temps d'exécution seront identiques et le chargement de la page sera bloqué le temps de compléter la génération du document. Ce qui ne sera pas le cas avec Ajax.

    En fait ton problème s'apparente à la création d'une queue de traitements en PHP capable d'être démarée de manière asynchrone. J'ai trouvé un article sur la question mais je doute que tu puisse le mettre en place techniquement car - comme beaucoup de solution de ce genre - il nécessite la mise en place de PCNTL...
    Bref, tu peux toujours jeter un oeil: http://www.shapeshifter.se/2008/08/0...tion-with-php/

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 53
    Points
    53
    Par défaut
    Le problème ne vient pas du temps d’exécution mais des 32Mo de mémoire maximum.
    Si je lance 20 script en Ajax l'un après l'autre directement sans attendre le retour du précédent, cela devrait passer (chaque script prend 10Mo mais je pense que la limite est de 32Mo par script et non sur le serveur ... ?

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    A voir si tous les balancer d'un coup va fonctionner

    Sinon, tu pourra toujours les lancer séquentiellement, même en Ajax: il suffit de mettre dans la callback "success" le lancement du suivant.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Et en mettant des unset() régulièrement dans ton script ?

  10. #10
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ce n'est pas certain, unset ne libère pas immédiatement la mémoire, c'est le garbage collector qui s'en occupe (mais il n'est présent qu'a partir de PHP 5.3).

    A lire sur le manuel:
    unset() does just what it's name says - unset a variable. It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first.

    If you are doing $whatever = null; then you are rewriting variable's data. You might get memory freed / shrunk faster, but it may steal CPU cycles from the code that truly needs them sooner, resulting in a longer overall execution time.
    Mais il y a sans doute de la mémoire à gagner par ce biais.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Ok, merci de ces précisions intéressantes, mais est-ce que tu pourrais s'il te plais traduire précisément ce que tu as mis en anglais car j'ai peur de ne pas saisir toutes les finesses. Merci

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    ça roule
    unset() does just what it's name says - unset a variable. It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first.

    If you are doing $whatever = null; then you are rewriting variable's data. You might get memory freed / shrunk faster, but it may steal CPU cycles from the code that truly needs them sooner, resulting in a longer overall execution time.
    unset() ne fait que ce que son nom suppose - il détruit une variable. Il ne force pas immédiatement une libération mémoire. Le ramasse-miettes (si si, c'est bien le nom français) de PHP le fera quand il pourra - aussitôt que les cycles CPU ne seront plus demandés ou tardivement quand le script n'aura plus beaucoup de mémoire, ou ce qui arrive en premier.

    Si vous faites $peuimporte = null; alors vous réécrivez les données de la variable. Vous obtenez la libération mémoire plus vite mais cela prends des cycles CPU au code qui en à vraiment besoin et rallonge le temps d'exécution du script.
    En clair:
    - unset() > rapide mais libération mémoire aléatoire
    - = null > lent mais libération mémoire immédiate

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Merci

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 53
    Points
    53
    Par défaut
    J'utilise Ajax pour appeler les créations de pages une à une dès que la précédente est finie. Le serveur ne surcharge plus !

    Et à la fin je concatène le fichier toujours en Ajax

    Merci pour les informations

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

Discussions similaires

  1. [Batch] Exécuter des .bat les uns après les autres
    Par devilsnake88 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 14/09/2022, 19h28
  2. Réponses: 4
    Dernier message: 04/02/2014, 16h38
  3. Réponses: 3
    Dernier message: 17/12/2007, 18h54
  4. Réponses: 32
    Dernier message: 28/08/2007, 19h57
  5. Lancer plusieurs batch les uns apres les autres
    Par n8ken dans le forum Administration système
    Réponses: 4
    Dernier message: 04/01/2007, 07h59

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