2017-04-05 16 views
0

Je souhaite exécuter un processus en arrière-plan, qui est orphelin, avec le composant Symfony Process. Je ne peux pas utiliser l'événement kernel.terminate. C'est ce que j'ai essayé de le faire:Processus Symfony - Tâches d'arrière-plan

Ce processus est que je voudrais courir:

// script.php 
$f = fopen('test'.uniqid().'.txt', 'w'); 
for ($i = 0; $i < 1000; $i++) { 
    fwrite($f, "Line $i \n"); 
    sleep(2); 
} 
fclose ($f); 

Et c'est le script que je voudrais lancer mon processus:

// test.php 
$command = "php script.php > /dev/null 2>&1 &"; 

$p = new \Symfony\Component\Process\Process($command); 
$p->start(); 
echo $p->getPid()."\n"; 

Le problème est que, après la fin test.php, script.php ne fonctionne pas. La fin du script principal tue tous les sous-processus. Est-il possible d'avoir des processus orphelins fonctionnant avec Symfony Process? manière

+1

Qu'est-ce que vous essayez d'atteindre avant de répondre à cette question – Augwa

Répondre

1

Easiest, ne pas utiliser le composant de processus et revenir à php exec:

http://php.net/manual/de/function.exec.php

exec('php script.php > /dev/null 2>&1 &'); 

Pour une solution plus solide considérer quelque chose comme un calendrier et une commande crontab exécuté pour démarrer le processus quand il faut commencer.

+0

Je suis à peu près certain que cela fera la même chose que l'OP est déjà en train de faire. – Augwa

+1

Ce n'est pas le cas. Le composant de processus utilise proc_open qui renvoie une ressource pour la sortie surveillée par le composant Process. exec fonctionne différemment c'est le feu et oublie (donné le dernier '&' à la fin de la commande exécutée) – Joe

+0

Confirmé :) Merci appris quelque chose de nouveau. – Augwa

0

Vous pouvez utiliser at (atd) ou cron avec une file d'attente personnalisée. PHP appelle la commande synchrone qui met en file d'attente la commande souhaitée pour une exécution ultérieure. Le at est un composant assez puissant et standard des systèmes Unix. Vous exécutez simplement at now + 10 min et les commandes push à son stdin, puis le démon atd exécutera vos commandes dans 10 minutes.

Si vous souhaitez exécuter votre commande directement depuis PHP, essayez d'ajouter un shell: new Process('/bin/sh -c "php script.php &"'). Je ne sais pas exactement comment la classe Process appelle la commande, mais si & ne fonctionne pas, un autre shell intermédiaire fera l'affaire (c'est ce que fait exec()).