Question

Je suis intéressé par le coup d'envoi des processus après une requête Web, ou bifurquer peut-être un nouveau processus après que le fil initial est terminé.

Je préfère ne pas utiliser un Cron, en raison de la nature des emplois que je vais en cours d'exécution et à quelle fréquence ils doivent être exécutés, dans l'attente d'une minute pour se rafraîchir est pas une option.

J'envisage quelques façons de le faire:

1) Appeler une page en javascript qui démarre le processus et retourne immédiatement, puis exécute des tâches après, par exemple ajax ( '/ run_jobs.php? Emploi = 123) .... vous voyez l'idée

2) duplications un nouveau fil après un filetage est terminé; ie output_page (); nouveau fil (); run_job (123); exit ();

Quelqu'un a des idées sur le sujet ou avoir une expérience avec cela.

Était-ce utile?

La solution

Eh bien cela dépend du travail que vous souhaitez exécuter. Une approche plus complexe mais plus évolutive et contrôlable utilise Gearman pour démarrer et travaux de contrôle. La bonne chose est que vous pouvez distribuer les emplois à d'autres boîtes afin que votre serveur web ne récupérera pas la pleine charge.

L'approche facile utilise exec et nohup comme dans

<?php
exec("nohup /usr/bin/php script.php >/dev/null 2>/dev/null &");
?>

La partie importante qu'il y a à détacher les canaux de sortie provenant du processus de PHP. Pour lire le résultat du processus que vous pouvez stocker dans une base de données.

Autres conseils

Ces jours-ci la manière standard de traiter ce genre de chose est un système de file d'attente de messagerie. A la fin de votre demande, vous envoyez un message dans la file d'attente. Ensuite, il y a une sorte de processus externe en cours d'exécution (crons multiples, par exemple) qui est la lecture des messages constamment en arrière de la file d'attente et l'exécution des travaux qui doivent être exécutés

Zend Queue est un choix populaire pour PHP.

En ce qui concerne vos solutions proposées, vous ne pouvez pas être certain qu'une demande Ajax va terminer (HTTP ne fait aucune garantie quant à la réussite ou l'échec d'une demande), donc si vous êtes comptant sur le fonctionnement du travail. Je l'ai vu genre de travail, mais ce n'est pas le meilleur choix. Forker un processus à la fin de votre demande sera un cauchemar de performance.

Je n'ai pas testé, mais voici une idée.

En utilisant curl, envoyer une demande de manière asynchrone newprocess.php (ou chaque fois que votre nouveau script de processus se trouve.) Vous pouvez regarder la fonction curl_post_async à Comment puis-je faire une demande asynchrone GET en PHP? sur la façon de faire une telle demande.

Vous pouvez faire une authentification pour vous assurer que vous seul pouvez tirer au large newprocess.php ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top