Travail en cours d'exécution en arrière-plan à partir de Perl SANS attendre de retour

L'Avertissement

Tout d'abord, je sais que cette question (ou des variantes) a été demandé un millier de fois. J'ai vraiment passé quelques heures à la recherche de l'évidence et qui n'est pas si évident endroits, mais il y a peut être quelque chose de petit, je suis absent.

Le Contexte

Permettez-moi de définir le problème plus clairement: je suis la rédaction d'un bulletin application dans laquelle je veux le réel de l'envoi de processus asynchrone. Comme dans, l'utilisateur clique sur "envoyer", la requête renvoie immédiatement et puis, ils peuvent vérifier l'état d'avancement dans une page spécifique (via AJAX, par exemple). Il est écrit dans votre traditionnelle de LAMPE de la pile.

Dans l'hôte particulier, je suis à l'aide, PHP exec() et system() sont désactivées pour des raisons de sécurité, mais en Perl fonctions du système (exec, le système et les backticks) ne le sont pas. Donc, mon solution la solution a été de créer un "déclencheur" de script en Perl qui appelle l'expéditeur réel via la CLI PHP, et redirige vers la page en cours.

Où je suis Coincé

La très la ligne les appels de l'expéditeur est, dès maintenant:

system("php -q sender.php &");

Problème, c'est de ne pas retourner immédiatement, mais l'attente pour le script à la fin. Je voulez qu'il fonctionne dans le fond et que l'appel système lui-même de retour tout de suite. J'ai aussi essayé de lancer un script similaire dans mon terminal Linux, et, en fait, l'invite n'apparaît pas jusqu'à ce que, une fois le script terminé, même si mon test de sortie ne fonctionne pas, indiquant qu'il est vraiment en cours d'exécution en arrière-plan.

Ce que j'ai déjà essayé

  • Perl fonction exec () - même résultat de system().
  • La modification de la commande: "php -q sender.php | à maintenant"), en espérant que le "au" démon allait revenir et que le processus PHP lui-même ne pas être attaché à Perl.
  • De l'exécution de la commande "indirectement": "/bin/sh-c 'php -q sender.php & "" - attend encore jusqu'à ce que sender.php est la fin de l'envoi.
  • fork()'ing le processus et de l'exécution de l'appel système à l'enfant (espérons-le processus détaché) - le même résultat que ci-dessus

Mon environnement de test

Juste pour être sûr que je ne suis pas manque rien d'évident, j'ai créé un sleeper.php script qui dort juste cinq secondes avant de sortir. Et un test.script cgi qui est comme ça, mot à mot:

#!/usr/local/bin/perl
system("php sleeper.php &");
print "Content-type: text/html\n\ndone";

Que dois-je essayer maintenant?

OriginalL'auteur Rafael Almeida | 2010-04-15