2009-06-17 4 views
2

Je me moque de démons, et je me demandais comment faisable (en termes de mémoire et de l'utilisation du processeur, et la fiabilité) c'est de le faire en utilisant PHP:Comment est-ce qu'un démon est écrit en PHP, using ignore_user abort et set_time_limit (0)

<?php 
// Ignore user aborts and allow the script 
// to run forever 
ignore_user_abort(true); 
set_time_limit(0); 

$fp = fopen('loop.log', 'w'); 
fwrite($fp, date('Y-m-d H:i:s') . ' Started' . PHP_EOL); 
while(1) { 
    fwrite($fp, date('Y-m-d H:i:s') . ' Looped' . PHP_EOL); 
    if (file_exists('loop.stop')) { 
     break; 
    } 
    // Sleep for 100 seconds 
    sleep(100); 
} 
fwrite($fp, date('Y-m-d H:i:s') . ' Stopped' . PHP_EOL); 
fclose($fp); 

Cet exemple simple (adapté du manuel PHP pour ignore_user_abort) est juste le script du conteneur. La fonctionnalité réelle sera placée à l'intérieur de la boucle while.

J'ai ce script en cours d'exécution sur mon ordinateur portable depuis 7 heures maintenant, et ça a l'air bien, mais ça ne fait pas grand-chose. Est-ce que quelqu'un d'autre a essayé cela?

Répondre

3

J'aurais tendance à mettre la boucle dans un script BASH, de sorte que toutes les ressources PHP soient régulièrement nettoyées.

#!/bin/bash 
clear 
date 

php -f doChecksAndAct.php 
sleep 100 
# rerun myself 
exec $0 

Si vous étiez en train de faire des tâches particulièrement lourdes à l'installation dans le script PHP, vous pouvez aussi mettre un petit (ish) boucle là-dedans (par exemple 50-100 itérations, si elles ne sont pas mise en pause de plusieurs secondes entre eux) pour réduire le temps total entre les passages.

Addition: J'ai blogué sur un Bash/PHP (ou autre langue) appariement afin que vous puissiez boucle très facilement dans le script PHP, puis la sortie pour redémarrer immédiatement, ou faire une pause pendant un certain temps - Doing the work elsewhere -- Sidebar running the worker.

1

Je le déconseille.

Il y a un bug ouvert il y a 4 ans qui dit Memory allocated for objects created in object methods is not released.

Les développeurs considèrent cela comme une demande de fonctionnalité mais il est très difficile de contourner ce problème lors de l'utilisation de processus de longue durée. J'ai essayé mais j'étais extrêmement soulagé quand j'ai pu retirer l'application.