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

PHP & Base de données Discussion :

Script asynchrone avec possibilité de le contrôler


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 74
    Par défaut Script asynchrone avec possibilité de le contrôler
    Bonjour,

    A partir d'un script X, je souhaiterai lancer un script Y qui contiendrait un envoi de mails avec un sleep entre deux envois.
    Pendant l'exécution du script Y, je souhaiterais pouvoir contrôler l'envoi grâce à un bouton "Arrêter" par exemple.

    Que me conseillez vous ?
    Dois-je plutôt chercher du côté d'un script php asynchrone ? Ou bien l'appel doit-il être effectué en ajax ?

    Je ne demande biensur pas de script juste des petits tuyaux pour savoir par où commencer.

    Je vous remercie pour votre aide.
    Adrien

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Il n'y a que deux façon d'implémenter parfaitement ce que tu veux faire avec PHP, seule la troisième fonctionne.

    Je vais néanmoins exposer deux solutions envisageables.

    Solution 1: utiliser l'extension PCNTL et un daemon

    L'idée est de créer un daemon responsable de l'exécution de la tâche, il pourra pour cela lancer plusieurs threads de traitement qu'il contrôle avec les signaux POSIX. On peut par ailleurs envoyer des signaux au daemon pour, par exemple, déclencher l'envoi des mails ou l'arrêter.

    Dans ton cas, le daemon est un service écrit en PHP qui tourne continuellement sur la machine (comme n'importe quel daemon). Il est possible de le démarrer, de l'arrêter et d'obtenir son statut n'importe quand depuis la ligne de commande. Lors que le daemon reçoit le signal pour traiter un lot d'emails à envoyer, il crée un fork qui se charge de faire les envois et les sleeps, le daemon peut à tout moment contrôler l’exécution du processus fils pour par exemple l'arrêter. Il n'est pas exclu que le daemon fasse du pooling sur une ressource (par exemple, regarder sur la DB s'il y a des mails à envoyer) pour savoir s'il à des éléments à traiter.

    Voici un article qui décrit comment faire: http://devlog.info/2010/03/07/creating-daemons-in-php/
    Et un autre qui propose en sus une libraire pour fabriquer des daemons: http://kevin.vanzonneveld.net/techbl...aemons_in_php/
    Prérequis: PHP 5.3 Minimum (pour avoir le garbage collector) et l'extension PCNTL

    Avantages:
    • tourne à 100% coté serveur
    • écrit à 100% en PHP

    Inconvénient:
    • passablement complexe (surtout si on a jamais fait un fork de sa vie)
    • PHP est aussi approprié pour la création de daemons qu'une cuillère à soupe pour démonter un pneu


    Solution 2: utiliser JavaScript / Ajax

    L'idée est de créer un script JS qui provoque les déclenchement et contrôle l'ordonnancement d'exécution des scripts PHP destinés aux envois.

    Dans ton cas, il s'agit d'une application JS qui va obtenir auprès d'un premier script la liste des mails à traiter et qui lance itérativement des requêtes XHR pour déclencher les envois par PHP (en mode 1 requête = 1 mail à envoyer). Il peut à tout moment interrompre son travail et même afficher un barre de progression.

    Pour ça, le mieux est de passer par jQuery ou Prototype qui facilitent grandement la mise en place de requêtes Ajax.

    Avantage:
    • assez simple à écrire (pour peu qu'on connaisse JavaScript et Ajax)
    • permet d'afficher un UI sexy et dynamique (la barre de progression c'est trop cool)

    Inconvénient:
    • requiert un onglet du navigateur ouvert pendant toute la durée du traitement
    • solution totalement orientée coté client > donc problématique de sécurité accrue
    • est difficilement envisageable si le nombre de mails à envoyer est important


    Selon moi, le dameon est la solution la plus intéressante car ça représente un défi technique et surtout parce que faire contrôler des traitements PHP par du JS ça ressemble plus à du bricolage qu'autre chose. Cette solution n'est d'ailleurs par incompatible avec la seconde car il suffit d'utiliser un script pour faire dialoguer JS et le dameon PHP pour obtenir une UI sympa et une belle barre de progression tout en conservant le fait que le travail continue si le navigateur est fermé.

    A toi de jouer

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 16
    Par défaut
    Bonjour,
    J'ai réalisé +ou- la 2ème solution préconisée par Benjamin Delespierre
    Je viens de "moderniser" le code en utilisant la classe mysqli_stmt.
    J'ai mis à disposition un test sur une table contenant un nombre limité de destinataires.
    La difficulté est d'adapter le code à la structure de votre base de données.
    J'ai actuellement testé avec un nombre d'envois limité à 20. Les scripts sont placés dans un répertoire protégé d'un serveur OVH mutualisé.
    J'aimerais avoir des retours concernant la difficulté d'adaptation à votre base de données et la réaction sur un nombre d'envois plus important de la part du serveur de l'hébergeur.
    A noter qu'entre chaque envoi, il est assez facile d'adapter le code afin de placer un retardement (code javascript à réaliser avec un setTimeout)

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    La difficulté est d'adapter le code à la structure de votre base de données.
    T'as pas prévu d'adapteurs ?

    Ah, aurais-je oublié de mentionné que les hébergeurs mutualisés limitent les envois à 50 mails/j ? Si ton objectif est de lancer des campagnes, oriente-toi vers des boites dont c'est la spécialité comme Mail Chimp.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 16
    Par défaut
    Bonjour,
    Pour un adaptateur, je réfléchis actuellement sur ce problème (j'aimerais avoir des retours de test).
    Pour les quotas sur OVH en site perso : 500 mails/jour et en pro 1000 mails/jour (c'est mon cas)
    Voir les infos :
    http://forum.ovh.com/showthread.php?t=31770
    Merci pour les conseils.

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    pourquoi PCNTL est nécessaire? il suffit de consulter une "base de registre" avant chaque envois. le registre étant une table de base de donnée plein de drapeaux.

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Citation Envoyé par gene69 Voir le message
    pourquoi PCNTL est nécessaire? il suffit de consulter une "base de registre" avant chaque envois. le registre étant une table de base de donnée plein de drapeaux.
    La solution était basée sur la réalisation propre d'un daemon, pas sur un bricolage avec la base de données.

    Pour ne citer que les désagrément les plus flagrants de l'usage d'une bdd pour contrôler des processus:
    • pooling
    • absence de synchro (on peut s'asseoir sur le temps réel)
    • absence de contrôle (impossible d'arrêter un processus fils, d'ailleurs, sans PCNTL la création de threads c'est de la vraie bidouille)
    • usage outrageusement impropre d'une base de données (à moins que tu n'arrive à me décrire comment une série de drapeaux destinés aux applications constitue un modèle)


    Donc, pourquoi utiliser PCNTL ? Pour faire les choses correctement.

Discussions similaires

  1. [Blog] Recherche script de Blog PHP avec possibilité avancées de mise en page du forum
    Par Furius dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 13/11/2006, 09h55
  2. script login avec telnet
    Par olive_le_malin dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 14/10/2005, 15h37
  3. Réponses: 6
    Dernier message: 23/05/2005, 08h33
  4. Script SQL avec des EXIT SQL.SQLCODE
    Par fidififouille dans le forum Oracle
    Réponses: 14
    Dernier message: 23/04/2004, 16h45
  5. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 13h57

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