Bonjour à tous,

Je suis bloqué sur un shell (première fois que je l'utilise) et je n'arrive pas à trouver la solution.

En fait, j'ai une crontab qui exécute mon shell toutes les minutes.
En fonction de l'heure, je dois exécuter une ou plusieurs taches simultanément.

Je fais ça :

class TacheShell extends AppShell
{
    public $uses = array('Model1', 'Model2');
    public function main()
    {
            // je vérifie en fonction du temps
            $this->tache1($arg);
            $this->tache2($arg);
        }
        public function tache1($arg) {
            ma tache 1 longue
        }
        public function tache2($arg) {
            ma tache 2 très longue aussi
        }
}

Le problème c'est qu'il lance d'abord la tache 1... puis longtemps après (car c'est une longue tache), il exécute la tache 2.
Le cherche à pouvoir lancer les 2 taches en même temps mais en n'ayant toujours qu'une seule crontab.

Avez-vous une idée svp ?

Merci d'avance ^^

5 réponses


volovitz
Auteur
Réponse acceptée

Solution trouvée :

Modification d'abord de la fonction main :

public function main() {
    $path = str_replace('/Console/', '', App::path('Console'));

    // mes checks en fonction du temps configuré par tache
    // et si je dois executer des taches, je le fais
    exec('cd '.$path[0].' && Console/cake tache tache1 bla');
    exec('cd '.$path[0].' && Console/cake tache tache1 bloo');
    exec('cd '.$path[0].' && Console/cake tache tache2 blii');
}

Modification de Console/cake :

exec php -q "$CONSOLE"/cake.php -working "$APP" "$@" > /dev/null &

On rajoute en fait : "> /dev/null &"

Et donc il suffit d'appeler en crontab la tache main toutes les minutes :)

Ce n'est pas possible en soi avec PHP (a la différence de javascript, par exemple).
Tu peux regarder du coté de gearman pour du multithreading, ou jeter un oeil ici pour trouver des workaround ...

EDIT: Il y a ca aussi ...

Bonsoir.
Ta deuxième tache ne dépend pas de la première ?
Ce que je veux dire, c'est est-ce que la seconde n'attend pas des arguments de la première ?

volovitz
Auteur

Bonjour,

Merci pour les pistes Vallyan, je vais y jeter un coup d'oeil.
Lartak 11, non la seconde n'attend pas des arguments de la première. Elles sont toutes les deux indépendantes.

volovitz
Auteur

A savoir que sinon, je pense pouvoir gérer cette partie en faisant ceci :

  • une page de cake est appelée toutes les X minutes et c'est elle qui va faire le dispatch :
    url : /moncontroller/crontab
    -> s'il faut lancer des actions :
    exec('cd /..PATH../app && Console/cake tache tache1 bla');
    exec('cd /..PATH../app && Console/cake tache tache2 bla');

Le problème est que lors de la commande exec, la page freeze et il ne fait aucune action de la tache...