Hallo!
Momentan spiele ich mit einigen Skripten, die irgendeine Art von Dienst bereitstellen und als daemon laufen sollen. Dazu habe ich eine allgemeine Klasse Service erstellt, die grundlegende Funktionen für alle Dienste bereitstellen soll. Sie ist hier zum einfacheren Verständnis stark vereinfacht.
Service.php
Nun soll es beliebig viele Dienste (i.e. Kindklassen) geben, die von dieser Klasse erben.
test.php
Nun das Problem: Wenn ich test.php ausführe, läuft der Prozess wie gewollt endlos in einer Schleife. Leider reagiert er aber überhaupt gar nicht auf Signale, obwohl der Code, in dem die Signalhandler zugewiesen werden, ausgeführt wird und pcntl_signal auch eine positive Rückgabe liefert.
Hat jemand dafür eine Erklärung?
Momentan spiele ich mit einigen Skripten, die irgendeine Art von Dienst bereitstellen und als daemon laufen sollen. Dazu habe ich eine allgemeine Klasse Service erstellt, die grundlegende Funktionen für alle Dienste bereitstellen soll. Sie ist hier zum einfacheren Verständnis stark vereinfacht.
Service.php
PHP-Code:
<?php
class Service {
protected static $PIDFile = null;
protected static function init($serviceName_param) {
self::$PIDFile = $serviceName_param.".pid";
// @TODO check if process not already started
set_time_limit(0);
declare(ticks = 3);
pcntl_signal(SIGCHLD, 'self::sigControl_handleSignals');
pcntl_signal(SIGTERM, 'self::sigControl_handleSignals');
pcntl_signal(SIGINT, 'self::sigControl_handleSignals');
file_put_contents(self::$PIDFile, getmypid());
register_shutdown_function("self::removePID");
}
protected static function removePID() {
unlink(self::$PIDFile);
}
protected static function sigControl_handleSignals($signal_param) {
echo "WE GOT A SIGNAL: $signal_param";
}
}
?>
test.php
PHP-Code:
<?php
require_once "Service.php";
class test extends Service {
public static function _start() {
self::init("test");
while(true) { sleep(2); }
}
}
test::_start();
?>
Hat jemand dafür eine Erklärung?
Kommentar