PHP: langen Query im Hintergrund starten, Email an Nutzer wenn fertig

Hallo,

wir betreiben einen wissenschaftlichen Datenbankserver, auf dem Benutzer in einer sehr großen PostgreSQL-Datenbank auch solche Anfragen stellen können, die sehr lange dauern (2-8 Minuten).

Da niemand so lange vor dem Browser wartet, möchte ich gerne folgendes für den Suchtyp, der so lange dauert, tun (in PHP):

  • den SQL-Query im Hintergrund starten, und dem User berichten, dass er eine Email bekommt soblad die Ergebnisse fertig sind
  • wenn der Query fertig ist, die Ergebnisse erhalten und daraus eine URL zur Ergebnisseite aufbauen
  • dem User einen Link auf die URL per Email schicken

Der dritte Teil ist trivial, aber hat jemand Vorschläge, wie man die ersten beiden Punkte elegant lösen kann?

Ich habe schonmal per Google gesucht, aber die meisten Ergebnisse schlagen vor, mit AJAX den Query im Hintergrund zu starten und dem User ein Warte-Symbol anzuzeigen. Dann die Ergebnisse in Seite reinschreiben, wenn Query fertig ist. Selbst dafür dauert der Query aber zu lange, und der User macht bestimmt den Browser irgendwann zu. In unserem Wissenschaftsbereich kommen solche langen Queries öfter vor, und das Zusenden von Ergebnissen per Email ist gebräuchlich und wird von Usern daher akzeptiert.

Ein Kollege schlug mir vor, von PHP ein Shellskript zu starten, das den DB-Query macht, und am Ende mit wget wieder ein PHP-Skript aufruft, das als Parameter die Ergebnisse des Queries bekommt und dann die Email schickt.

Die Sache läuft auf einem Unix-Server und das wäre möglich, aber ich würde ungern mit Shellskripten und Cron arbeiten, falls es auch in reinem PHP und etwas eleganter geht.

Vielen Dank für jeden Tipp!

Hallo,

so unelegant finde ich den Weg mit Cronjob und Shellskript überhaupt nicht - ganz im Gegenteil. Das ist der übliche Weg unter Unix und ich habe eine ganze Reihe solcher Skripte laufen, die per Mail Erinnerungen oder Informationen versenden.

VG

Kann PHP denn keine Hintegrund-Threads starten? In Java würde ich einen neuen Thread starten der sich zur DB verbindet, den SQL Befehl ausführt und dann die Email verschickt. Entsprechende Bibliotheken gibt es für Java wie Sand am Meer. Mich würde es wundern wenn es sowas für PHP nicht auch geben würde.

Eine kurze Suche nach “php background worker” findet z.B. diese Bibliotheken: