PHP script après le lancement, en arrière-plan se termine?
-
19-09-2019 - |
Question
Je suis en train de convertir un fichier PDF avec PDF2SWF et de l'indexation avec XPDF .. avec exec .. que cela nécessite le temps d'exécution d'être très élevé.
Est-il possible de l'utiliser comme processus d'arrière-plan, puis lancer un script quand il est fait la conversion?
La solution
en général, php ne met pas en œuvre threads.
Mais il y a une ZF-classe qui peut convenir pour vous:
http://framework.zend.com /manual/en/zendx.console.process.unix.overview.html
ZendX_Console_Process_Unix permet les développeurs pour frayer un objet en tant que nouveau processus, et ainsi effectuer des tâches multiples dans en parallèle sur les milieux de la console. Grâce à sa spécificité, il est travailler uniquement sur les systèmes nix comme Linux, Solaris, Mac / OSx et tel. De plus, le shmop _ , pcntl_ * et posix_ * modules sont requis pour ce composant à exécuter. Si l'un des les exigences ne sont pas remplies, il va jeter une exception après l'instanciation composant.
exemple approprié:
class MyProcess extends ZendX_Console_Process_Unix
{
protected function _run()
{
// doing pdf and flash stuff
}
}
$process1 = new MyProcess();
$process1->start();
while ($process1->isRunning()) {
sleep(1);
}
echo 'Process completed';
.
Autres conseils
Essayez d'utiliser popen () au lieu de exec ().
Ce hack fonctionne sur toute installation de PHP standard, même sous Windows, pas de bibliothèques supplémentaires nécessaires. Yo ne peut pas vraiment contrôler tous les aspects des processus vous frayer cette façon, mais parfois cela suffit:
$p1 = popen("/bin/bash ./some_shell_script.sh argument_1","r");
$p2 = popen("/bin/bash ./some_other_shell_script.sh argument_2","r");
$p2 = popen("/bin/bash ./yet_other_shell_script.sh argument_3","r");
Les trois scripts shell donné naissance fonctionneront simultanément, et aussi longtemps que vous ne faites pas un pclose ($ p1) (ou p2 ou p3 $ $) ou d'essayer de lire l'un de ces tuyaux, ils ne seront pas bloquer votre exécution PHP.
Lorsque vous avez terminé avec vos autres choses (celui que vous faites avec votre script PHP), vous pouvez appeler pclose () sur les tuyaux, et que vous arrêterez votre exécution du script jusqu'à ce que le processus que vous finitions pclosing. Ensuite, votre script peut faire autre chose.
Notez que votre PHP ne conclura pas ou mourir () jusqu'à ce que ces scripts ont terminé. Atteindre la fin du script ou d'appeler die () va faire attendre.
Si vous exécutez depuis la ligne de commande, vous pouvez bifurquer un processus PHP en utilisant http://pear.php.net/package/System_Daemon
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
//We are the parent, exit
exit();
} else {
// We are the child, do something interesting then call the script at the end.
}