steve!: Hintergrundprozess strarten?

Hallo!

Ich entwickle grade eine App, die u.a. vom aktuellen Standort aus gesehen Restaurants in der Nähe ausgeben soll. Die Berechnung der Entfernung vom Standort aus habe ich per Mapquest-Api realisiert, da ich echte Fußkilometer und nicht die Luftlinie ausgeben möchte.

Das Problem ist, dass die Api zur Berechnung aller Entfernungen (aktuell sind 70 Restaurants erfasst) sehr lange braucht und die App dann in einen Timeout läuft.

Erste Idee war, in der App etwas zu realisieren, dass immer nur 10 Restaurants angezeigt werden und dann beim scrollen 10 weitere nachgeladen werden.

Eine andere Idee ist, schon beim Starten der App einen Hintergrundprozess zu starten, der die Berechnung übernimmt und dann beim Anwählen des Menüpunkts "Zeige Restaurants" schon die fertig erstellte Liste zur Ausgabe zur Verfügung steht.

Zweiteres scheint mir eleganter und weniger aufwändig. Nur wie realisiere ich dies? Tipps, nach welchen Befehlen/ Stichworten ich suchen muss? Habe schon mal nach Multithreading gesucht, aber da ist wohl PHP nicht so das richtige dafür bzw. unterstützt das nicht?!

Vielen Dank,
Steve

  1. Das Problem ist bekannt.

    Eine Lösung wäre:

    mit [x]inetd wird ein Hintergrundprozess gestartet, der auf Anforderung die Daten vorausberechnet und als temporäre Dateien so ablegt, dass diese (bei Dir wohl in Abhängigkeit vom Standort) abrufbar sind. Der Prozess signalisiert nur, ob er berechnen muss oder sendet die Daten - falls er schon Daten hat. In Abhängigkeit davon werden dem Client dann die Daten geschickt oder ein http-header, der ihn dazu auffordert in einigen Sekunden den Request erneut zu versuchen.

    Ein weiterer Hintergrundprozess (z.b: mit crond gestartet] sorgt dann dafür, dass längere Zeit nicht gelesene Daten gelöscht werden. Sonst wird die Platte voll werden.

    Das Problem ist, dass die Api zur Berechnung aller Entfernungen (aktuell sind 70 Restaurants erfasst) sehr lange braucht und die App dann in einen Timeout läuft.

    Im Übrigen solltest Du genau da ansetzen... ich halte das Problem für ein methodisches. Nicht alle Probleme kann man ausbügeln in dem man einen wrapper drum herum baut.

    Jörg Reinholz

  2. Tach!

    Das Problem ist, dass die Api zur Berechnung aller Entfernungen (aktuell sind 70 Restaurants erfasst) sehr lange braucht und die App dann in einen Timeout läuft.

    Dieser App (was auch immer das konkret ist) kannst du den Timeout nicht einstellen? Abgesehen davon ist es vermutlich für den Anwender weniger schön, wenn er erst lange warten muss, bis er ein Ergebnis bekommt. Die meisten sind bereit, länger zu warten, wenn sich was tut/ein Fortschritt zu sehen ist.

    Erste Idee war, in der App etwas zu realisieren, dass immer nur 10 Restaurants angezeigt werden und dann beim scrollen 10 weitere nachgeladen werden.
    Eine andere Idee ist, schon beim Starten der App einen Hintergrundprozess zu starten, der die Berechnung übernimmt und dann beim Anwählen des Menüpunkts "Zeige Restaurants" schon die fertig erstellte Liste zur Ausgabe zur Verfügung steht.

    Wie genau kommuniziert denn die App mit PHP? Gibt sie dem System, in dem sie programmiert ist, einen HTTP-Request-Auftrag? Ist es HTML und kann Ajax verwenden?

    Zweiteres scheint mir eleganter und weniger aufwändig. Nur wie realisiere ich dies? Tipps, nach welchen Befehlen/ Stichworten ich suchen muss?

    Ohne die Möglichkeiten des Systems zu kennen, kann man nur allgemeine Vorschläge bringen. Und du solltest dabei auch den Anwender nicht außer Betracht lassen. Das heißt, der will bei Laune gehalten werden, wofür ein drehendes Dings zwar üblich ist, auf lange Zeit aber langweilt. Ich würde in Betracht ziehen:

    • Eine Verbindung zum Server dauerhaft offen zu halten. Der Server berechnet was zu tun ist und sendet nach jedem Schritt einen kleinen Statusbericht.
    • Die Schritte in einzelnen Requests absenden, wodurch sich der Fortschritt sich durch einen (weiteren) abgearbeiteten Request bemerkbar macht.

    Ersteres ist besser, weil der Request-Overhead wegfällt. Aber es ist auch anfälliger für Timeouts und Verbindungsabbrüche, wofür du dir Lösungen erarbeiten solltest. Bei den Einzelschritten kann man den misslungenen Request einfach noch einmal neu senden.

    Habe schon mal nach Multithreading gesucht, aber da ist wohl PHP nicht so das richtige dafür bzw. unterstützt das nicht?!

    Dafür ist es nicht ausgelegt. Es arbeitet üblicherweise Requests gradlinig ab und muss dabei keine parallele Aufgaben ausführen. Um die Parallelität kümmert sich der Webserver.

    dedlfix.