2009-06-17 10 views
2

Ich bin mit Daemons herumalbern, und fragte mich, wie machbar (in Bezug auf Speicher-und CPU-Nutzung und Zuverlässigkeit) ist es dies zu tun PHP:Wie machbar ist ein Daemon in PHP geschrieben, mit ignore_user abort und 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); 

Dieses einfache Beispiel (aus dem PHP-Handbuch angepasst für ignore_user_abort) ist nur der Container-Skript. Die eigentliche Funktionalität wird innerhalb der while Schleife platziert.

Ich habe dieses Skript seit 7 Stunden auf meinem Laptop laufen, und es sieht gut aus, aber es tut nicht viel. Hat jemand anderes das versucht?

Antwort

3

Ich würde neigen, die Schleife in ein BASH-Skript zu legen, so dass alle PHP-Ressourcen regelmäßig bereinigt werden.

#!/bin/bash 
clear 
date 

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

Wenn Sie besonders schwer zu Setup-Aufgaben im PHP-Skript taten, können Sie auch eine kleine (ish) Schleife in dort (etwa 50 bis 100 Iterationen setzen könnte, wenn sie mehrere Sekunden nicht pausiert wurden zwischen ihnen), um die gesamte Overhead-Zeit zwischen den Läufen zu reduzieren.

Zusatz: ich auf einem Bash/PHP (oder eine anderen Sprache) Paarung gebloggt habe, so dass Sie in der PHP-Skript sehr leicht Schleife können, Ausgang dann sofort neu zu starten, oder für eine Weile pausieren - Doing the work elsewhere -- Sidebar running the worker.

1

empfehle ich dagegen.

Es ist ein Bug geöffnet vor 4 Jahren, der Memory allocated for objects created in object methods is not released sagt.

Die Entwickler betrachten dies als Feature-Anforderung, aber es ist sehr schwer, um es zu umgehen, wenn lang laufende Prozesse verwendet werden. Ich versuchte es, war aber extrem erleichtert, als ich die Bewerbung zurückziehen konnte.