Start einer Funktion ohne auf beendigung zu warten

Hallo zusammen,

ich bin auf der Suche nach einer Möglichkeit aus php herraus eine Postgres Funktion aufzurufen ohne im php Script auf das Ergebnis dieser Funktion zu warten. Es werden viele langwiedrige berechnungen gemacht die im Hintergrund in der Datenbank geschehen sollen. Wenn ich pg_query benutze bleibt die php-Seite solange beschäftigt bis ich das Ergebnis habe. Wenn ich es asynchron versuche, also mit pg_send_query dann bleibt meine php-Seite zwar nicht stehen und die Berechnungen werden ausgeführt, dafür stürzt mit aber der Apache ab :frowning:
Wenn ich versuche die Funktion nicht aus php aufzurufen sondern mit einem Trigger starten will den ich auf eine Tabelle lege wo ich mit der php-Seite was hineinschreibe, dann wartet meine php-Seite trotzdem bis zur vollständigen beendigung des inserts und des triggers (egal ob nun BEFOR oder AFTER Trigger).
Mir gehen nun langsam die Ideen aus, ich wollts nich mit nem Crontab machen daher suche ich nach einer Möglichkeit das noch anders umzusatzen :wink:

Lange Rede kurzer Sinn, hab ich grad mal wieder nen Brett vorm Kopf und es geht doch so einfach oder habt auch ihr keine Ideen?

Vielen Dank im vorraus
Mr.Noname

Warum untersuchst Du nicht, warum das passiert?

Wenn ich versuche die Funktion nicht aus php aufzurufen sondern mit einem Trigger starten will den ich auf eine Tabelle lege wo ich mit der php-Seite was hineinschreibe, dann wartet meine php-Seite trotzdem bis zur vollständigen beendigung des inserts und des triggers (egal ob nun BEFOR oder AFTER Trigger).

Normal. Der INSERT ist ja auch nicht abgeschlossen.

Mir gehen nun langsam die Ideen aus, ich wollts nich mit nem Crontab machen daher suche ich nach einer Möglichkeit das noch anders umzusatzen > :wink: >

Lange Rede kurzer Sinn, hab ich grad mal wieder nen Brett vorm Kopf und es geht doch so einfach oder habt auch ihr keine Ideen?

Vielen Dank im vorraus
Mr.Noname

Mit PHP und exec() psql aufrufen und in den Hintergrund schicken? Ich unterstelle mal ein *NIX-System.


Andreas

Du könntest ein extra Script schreiben, das du mit system() oder so aufrufst und dass das HUP Signal ignoriert.

Vielen dank für die schnellen Antworten.

@Andreas

Warum untersuchst Du nicht, warum das passiert?

Ich habe mir die Apache logs angeschaut und herrausgefunden das ein Childprocess mit dem Fehler 3221225477 restartet wurde. Zu dem Problem hab ich schon einige Seiten durch, ob es am ZendOptimizer oder an ner Endlosschleife lag etc. Habe das meiste auch Probiert aber nichts funktionierte. Ich denke mal das er die Anfrage abschickt und dann komtm irgendwann unpassend der Resourcehandler zurück in ner anderen Anfrage oder so, weiß nur nicht warum er dann gleich abstürzen soll ^^

Normal. Der INSERT ist ja auch nicht abgeschlossen.

Nen Versuch wars wert :wink:

Mit PHP und exec() psql aufrufen und in den Hintergrund schicken? Ich unterstelle mal ein *NIX-System.

Dazu habe ich bei php.net nur gefunden:
“pg_execute — Fordert den Datenankserver auf, eine vorbereitete Anfrage mit den angegebenen Parametern auszuführen und wartet auf das Ergebnis.” Also wartet auch diese Funktion auf nen Ergebnis. Ich habs noch nicht getestet weil es so dastand :slight_smile:

exec() != pg_execute().

Schreibt man anders, tut was anderes. Beachte aber ads seinen Hinweis bzgl. HUP-Signal.

Andreas

Oh und ne zweite Antwort gleich, danke auch dir ads.

Zu system() steht bei php.net “Führt ein externes Programm aus und zeigt dessen Ausgabe an.”. Weiß nicht ob es geht wenn das Programm noch rechnet ( das wird es ne weile :wink: ) das ich einfach die aufrufende Seite schließe, abern en Versuch ist es wert.

exec() != pg_execute().

Schreibt man anders, tut was anderes.

Wie rufe ich dieses exec() in postgres aus php her auf? Mit einem pg_query oder bin ich schonwieder vollkommen wirr? Somit ist das exec zwar das in postgres beschriebene aber der aufruf wartet noch immer. Oder? wusel dusel

Beachte aber ads seinen Hinweis bzgl. HUP-Signal.

Werd mich gleich mal dazu belesen, danke.

Ja. Es ist eine PHP-Funktion. Und als solche ruft man sie, richtig, aus PHP auf. Im Prinzip dasselbe Verfahren wie auch von ads vorgeschlagen.

Andreas

Alles, was du nach exec() brauchst, hat eigentlich erst mal nichts mit der Datenbank zu tun:

Entweder du startest das Script mit & im Hintergrund (funktioniert nur unter Unix) oder du rufst einmal fork() auf und entkoppelst dich damit von deinem aufrufendem Programm (funktioniert auch nur unter Unix :smiley: ).

Ja. Es ist eine PHP-Funktion. Und als solche ruft man sie, richtig, aus PHP auf. Im Prinzip dasselbe Verfahren wie auch von ads vorgeschlagen.

vom Schlauch geht Keine Ahnung warum, aber bei deinem exec() kam ich immer auf das Execute von Postgres, dachte du wolltest auf das hinaus dabeit meinst du, wie du schon sagtest, das gleiche Prinzip wie ads nur mit einem anderen aufrufendne Befehl.

Entweder du startest das Script mit & im Hintergrund (funktioniert nur unter Unix) oder du rufst einmal fork() auf und entkoppelst dich damit von deinem aufrufendem Programm (funktioniert auch nur unter Unix > :smiley: > ).

Leider bin ich hier grad nich auf nem Unix System hm, aber danke. Ich werd noch ein wenig schauen ob ich das Problem mit dem Apache lösen kann, wenn nicht entweder die von euch vorgeschlagene Variante (dann eben erst später wenns auf dem System is wo es laufen soll) oder nen Crontab/Task der öfter am Tag startet.