• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

PHP-Skript im Hintergrund ablaufen lassen

Themenstarter #1
Hallo Forum,

welche Voraussetzungen mus ein PHP-Skript bieten, damit es speziell unter FreeBSD im Hintergrund ablaufen kann?
Ich benutze PHP aus ganz bestimmten Gründen.

Beste Grüße
JueDan
 

CommanderZed

OpenBSD User
Mitarbeiter
#2
Ich kann mir nicht vorstellen das es da große Unterschiede gegenüber Linux & Co gibt.

Was hast du denn vor, das Script per "Cron" aufrufen oder so? Oder soll das so eine art "Daemon" sein? "Im Hintergrund" ist ja kein ganz so fester begriff.
 
Themenstarter #3
Das PHP-Skript läuft als Daemon im Hintergrund und wartet auf Events ( pgsqlGetNotify() ), die von einem PostgreSQL-Trigger ( pg_notify ) geschickt werden.

Hier der Code:
PHP-Skript:
PHP:
$dbh = Datenbank_anmelden("homepage");
if (isset($dbh)) {
    $dbh->exec('LISTEN "wetterdienst_event"');
    while (1) {
        $notify = "";
        $notify = $dbh->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);
        if ($notify !== false) {
            $event = $notify["message"];
        }
    }
}
PostgreSQL-Trigger
SQL:
CREATE FUNCTION public.trwarnzelle()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        PERFORM pg_notify('wetterdienst_event', 'DELETE|' || OLD.warncellid || '|' || OLD.sent || '|' || OLD.identifier || '|' || OLD.effective || '|' || OLD.headline);
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        PERFORM pg_notify('wetterdienst_event', 'UPDATE|' || NEW.warncellid || '|' || NEW.sent || '|' || NEW.identifier || '|' || OLD.identifier || '|' || NEW.ii || '|' || OLD.ii || '|' || NEW.effective || '|' || OLD.effective || '|' || NEW.expires|| '|' || OLD.expires);
        RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        PERFORM pg_notify('wetterdienst_event', 'CREATE|' || NEW.warncellid || '|' || NEW.sent || '|' || NEW.identifier);
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$BODY$;
Da ich echt im Nebel stochere, warum das Skript ohne Fehler abschmiert, habe ich die Frage auch im PostgreSQL-Forum gepostet. Vielleicht liegt es am Trigger, am Skript oder an FreeBSD oder, oder, oder...
 

Athaba

Libellenliebhaber
#4
Was meinst du mit "abschmiert"? Lässt du dir Fehler (db->errorInfo()) irgendwo ausgeben? Findest du in der PostgreSQL Log etwas? Du kannst auch das Logging raufdrehen und in der Trigger Function was mitloggen.
 
Themenstarter #5
In den Logs steht nix. Ich habe so langsam den Verdacht, dass sich PHP beendet, wenn eine bestimmte Zeitspanne überschritten wird und dass man den Wert nicht ändern kann.

Ich habe das jetzt mal nach Perl portiert, um zu sehen, ob der Effekt da auftritt.
 
Themenstarter #7
Danke an alle, die sich mit mir den Kopf zerbrochen haben.

Der Fehler ist gefunden: es war eine nicht defnierte und initialisierte Variable.
Die 1:1-Portierung des Skripts nach Perl hat es an den Tag gebracht. "Jetzat lafts wira Gleckal"

Danke nochmal an alle

JueDan
 

SolarCatcher

Well-Known Member
#8
Ich habe so langsam den Verdacht, dass sich PHP beendet, wenn eine bestimmte Zeitspanne überschritten wird und dass man den Wert nicht ändern kann.
Ich weiß, das Problem ist bereits gelöst. Nur der Vollständigkeit halber: Die Zeitspanne, die ein Skript laufen darf, wird mit der Ini-Variable max_execution_time eingestellt. Allerdings ist diese für die CLI (gilt also auch für Cron-Jobs) standardmäßig auf 0 gesetzt und damit nicht aktiv. Sprich: Auf der CLI kann das Skript normalerweise so lange laufen, wie es will. Näheres dazu in der PHP Doku zu max_execution_time.