Andreas-Lindig: Script im Hintergrund ausführen

Hallo Forum,

Ich frage zwar viel im Moment, aber das legt sich auch wieder, ich stecke halt im Moment sooo tief in meinem Projekt :-)
Ich hätte also mal noch eine bescheidene Frage:

kann ich von PHP aus ein zweites Script starten, das unabhängig vom ersten Script weiterläuft?

Also es soll so gehen:

  • Aufruf script_1.php
  • in script_1.php:
      - header("location: reply.php");
      - Aufruf script_2.php
      - exit();

jetzt soll sofort zur reply-seite weitergeleitet werden und das script_2.php ungestört weiter ausgeführt werden, bis es fertig ist (es schreibt lauter DB-Kram). Die Konstruktion oben habe ich schon probiert, aber es wird eben erst zur reply.php weitergeleitet, wenn script_2.php fertig ist. Das dauert zu lange.

Das Einzige, was ich im Archiv gefunden habe ist exec(). Aber das sagt mir auch nicht so richtig was. Bin mir weder über die richtige Syntax im klaren, noch, ob das überhaupt der richtige Weg ist.

Gruß, Andreas

--
http://forum.andreas-lindig.de <img src="http://forum.andreas-lindig.de/bilder/logo.png" border="0" alt="">
einfach mal testen und Meinung hinterlassen
  1. Hello und guten Morgen,

    kann ich von PHP aus ein zweites Script starten, das unabhängig vom ersten Script weiterläuft?

    Also es soll so gehen:

    • Aufruf script_1.php
    • in script_1.php:
        - header("location: reply.php");
        - Aufruf script_2.php
        - exit();

    Das Aufrufen von Prozessen für den Hintergrund ist unter Unix möglich. Der Prozess wird dazu ohne Konsole gestaret. Ob das aber auch aus PHP heraus geht, kann ich Dir nicht sagen.

    Und dann könntest Du dich in http://de2.php.net/manual/de/function.pcntl-fork.php & Freunde einlesen.

    Außerdem kann man auch einen Prozess starten, der nach Schließen des Browser-Fensters weiterläuft. Siehe hierzu connection_aborted() http://de2.php.net/manual/de/function.connection-aborted.php und ignore_user_abort() http://de2.php.net/manual/de/function.ignore-user-abort.php und set_time_limit() http://de.php.net/manual/de/function.set-time-limit.php

    Ich habe die Funktionen genau für das Gegenzeil benutzt, nämlich um für meine Demoprogramme zum Thema Locking die Prozesse "in die Länge zu ziehen" und erst durch Schließen des Browserfensters zu beenden.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Guten Morgen,

      set_time_limit() http://de.php.net/manual/de/function.set-time-limit.php

      Wo ich grade set_time_limit() sehe; default_socket_timeout sollte bei einem einfachen Lesezugriff auch einen Abbruch verursachen, der das weitere Ausführen eines Scripts veranlasst, nur habe ich damit noch nicht gearbeitet.

      Gruß aus Berlin!
      eddi

      --
      Manchmal trifft es einen doch ganz unverhofft t86591:
      > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
      Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    2. Guten Morgen,

      http://de2.php.net/manual/de/function.pcntl-fork.php

      ich habe mich bis jetzt nie an diese Funktionen herangetraut und auch jetzt mein PHP ohne --enable-pcntl übersetzt. Der dort beschriebene Weg scheint weitaus Sinnvoller zu sein, als mit socket zu arbeiten.

      Kannst Du erklären (veilleicht anhand eines Beispiels) wie ich weiß, welche Arbeit ich nun im Child abarbeiten lasse?

      Im Archiv war nachzulesen <./archiv/2003/12/67545/#m386455>, es ist nicht möglich dies in einer Serverumgebung nutzbar sein soll. Stimmt dies?

      Gruß aus Berlin!
      eddi

      --
      Manchmal trifft es einen doch ganz unverhofft t86591:
      > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
      Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
      1. Hello,

        Im Archiv war nachzulesen <./archiv/2003/12/67545/#m386455>, es ist nicht möglich dies in einer Serverumgebung nutzbar sein soll. Stimmt dies?

        Hier ging es um ganz andere Sachen. CK hat gemeint, dass man bei einem fsockopen() die Wartezeit nicht beinflussen kann. Entweder ist das inzwischen geändert, oder er hat nicht richtig gelesen. Man kann dem Befehl über den vierten Paramter mitteilen, wann spätestens eine Fehlermeldung ausgelöst erden soll. WEnn die Ressource also auf sich warte lässt, kann man die Wartezeit fürs Öffnen begrenezen und mit secket_set_timeout() dann die Zeit beim Lesen. Außerdem könnte man die Ressource auch nonblocking anfordern, dann würde der entfernte Server sofort, wenn das Teil gesperrt ist, mit Fehler quittieren und nicht solange warten, bis jemand anders fertig ist mit Schreiben oder Lesen.

        Das Abarbeiten im Hintergrund hat also nichts zu tun mit der Wartezeit beim Öffnen, Lesen und Schreiben.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo,

          [...]

          Danke :)

          Bleibt noch die Bitte nach einer verständlichen Erklärung, oder einen Link.
          Wenn ich es doch endlich verstehen würde, was dort vorsich geht, dann hätte ich zwar bei Zeiten einige Projekte zu überarbeiten, aber sie würden technisch sauberer abgearbeitet werden.

          Gruß aus Berlin!
          eddi

          --
          Manchmal trifft es einen doch ganz unverhofft t86591:
          > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
          Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
          1. Hello Eddi,

            Bleibt noch die Bitte nach einer verständlichen Erklärung, oder einen Link.
            Wenn ich es doch endlich verstehen würde, was dort vorsich geht, dann hätte ich zwar bei Zeiten einige Projekte zu überarbeiten, aber sie würden technisch sauberer abgearbeitet werden.

            Bevor Du ins "Multithreading" einsteigst, solltest Du Dich mit Vorgangsverarbeitung beschäftigen. Schließlich kann man ein Script ja auch schon konkurrierend durch mehrere Instanzen des Browsers eines Nutzers / mehrere Fenster einer Instanz / der Browser unterschiedlicher Nutzer aufrufen. Und dabei gibt es schon genügend Konflikte. Die Konflikte zwischen den unterschiedlichen Clients kann man dabie noch relativ schnell lösen, da sie i.d.R. alle unter einer anderen Session laufen. Die Konflikte zwischen zwei Fenstern einer Browseristanz sind dabei die ekligsten. Wenn man noch nicht einmal Mehrfachposts abgefangen hat, wird man erst recht keine Mehrfach-Vorgangseröffnung abgefangen haben.

            Und nun stell Dir vor, dass diese Prozesse auch noch geteilt wrden sollen. Behältst Du da noch den Überblick? Bevor man Chaosprogramme erzeugt, sollte man sich also zumindest mal Gedanken über die Folgen machen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hello Tom,

              [...]

              Und nun stell Dir vor, dass diese Prozesse auch noch geteilt wrden sollen. Behältst Du da noch den Überblick? Bevor man Chaosprogramme erzeugt, sollte man sich also zumindest mal Gedanken über die Folgen machen.

              Ich verstehe Dich nun überhaupt nicht mehr.

              1.)    Anraten zum beschäftigen mit Process Control Support
                     <./?t=88104&m=524854>

              2.)    Nachfrage über weitergehende Informationen in pcntl
                     <./?t=88104&m=524866>

              3.)    Direkt weiterführende Informationen nicht erteilt,
                     sondern Verweis auf Client-Server-Konfilke, was im
                     direkten Widerspruch zu 1. steht
                     <./?t=88104&m=524873>

              Soweit mein Verständnis der Lage.

              Ich bitte doch nur um Informationen um einen Einstieg zu schaffen und zukünftig auch Process Control Support einsetzen zu können. Dein Einwand ist anscheined bereichtig, verschafft mir aber immer noch kein Einblick in die Materie, sondern verweist auf mögliche Auswirkungen des Gerbrauchs von Wissen, was ich noch nicht habe. Daher habe ich doch um erstmal um weiterführende Informationen gebeten.

              Gruß aus Berlin!
              eddi

              --
              Manchmal trifft es einen doch ganz unverhofft t86591:
              > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
              Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
              1. Hello,

                Ich bitte doch nur um Informationen um einen Einstieg zu schaffen und zukünftig auch Process Control Support einsetzen zu können. Dein Einwand ist anscheined bereichtig, verschafft mir aber immer noch kein Einblick in die Materie, sondern verweist auf mögliche Auswirkungen des Gerbrauchs von Wissen, was ich noch nicht habe. Daher habe ich doch um erstmal um weiterführende Informationen gebeten.

                Ich meine das auch überhaupt nicht böse. Tut mir leid, wenn das so rüberkam. Du sollst nur klein anfangen und nicht gleich alles auf einmal versuchen. Außerdem kann ich Dir zu fork nicht mehr sagen. Da müsstest Du mal Google bemühen.

                Ich muss jetzt lieder weg. Mein Vater hat 74 Geburtstag morgen. Da gibts noch was vorzubereiten.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
              2. Holladiewaldfee,

                1.)    Anraten zum beschäftigen mit Process Control Support
                       <./?t=88104&m=524854>

                Jep. Und das wichtigste ist, nicht zu übersehen, daß man PHP als CGI kompilieren und einbinden muß ... hehe. Es hat mich viel Zeit gekostet, das herauszufinden. Außerdem sollte man irgendwo 'ne Linux/Unix-Kiste rumstehen haben, zum Ausprobieren. Funzt nämlich nicht mit Windows.

                Im Manual steht unter http://de3.php.net/manual/en/ref.pcntl.php ja schon ein Haufen Zeug drin, wenn man das mal durchackert bekommt man zumindest mal 'nen ersten Eindruck, wie denn der Hase so läuft.

                Ansonsten darf ich kurz aus obiger Quelle zitieren:

                --
                For detailed information about Unix process control you are encouraged to consult your systems documentation including fork(2), waitpid(2) and signal(2) or a comprehensive reference such as Advanced Programming in the UNIX Environment by W. Richard Stevens (Addison-Wesley).
                --

                Ich habe damals an einem mehr oder minder einfachen CMS gearbeitet, das einen Prozess abspalten sollte, um lästige "Drecksarbeit" zu erledigen: Datenbankeinträge machen, eMails verschicken + diverser anderer Müll, der teilweise recht zeitintensiv war. Das waren allerdings alles Aufgaben, die auf den Fortlauf des anderen Prozesses keinerlei Einfluß hatte. Spätestens wenn die beiden Prozesse aber konkurieren rennt man als unerfahrener (als den ich mich bei diesem Thema durchaus bezeichnen möchte) in eine Menge (!) faustdicker Probleme ...

                Ciao,

                Harry

                --
                  Bald kommt die Waldfee ... (Projektphase: Planung)
                  Bis dahin:
                  http://harry.ilo.de/projekte/berge/
                1. Hallo fee,

                  Jep. Und das wichtigste ist, nicht zu übersehen, daß man PHP als CGI kompilieren und einbinden muß ... hehe. Es hat mich viel Zeit gekostet, das herauszufinden. Außerdem sollte man irgendwo 'ne Linux/Unix-Kiste rumstehen haben, zum Ausprobieren. Funzt nämlich nicht mit Windows.

                  Nach ./configure --help ist zu lesen:

                  --enable-pcntl          Enable experimental pcntl support (CLI/CGI only)

                  Mit CGI arbeite ich überhaubt nicht gerne - aber habe mir immer eine CLI-Version kompilieren lassen. Da ich verschiedenste Sachen gerne automatisiere, andererseits ungerne mit Shellscripten arbeite, gibt es an allen Rechnern, an denen ich arbeite den Befehl "eddi".

                  eddi@linux:~> eddi header harry.ilo.de/projekte/berge/

                  HTTP/1.1 200 OK
                  Date: Wed, 25 Aug 2004 08:49:28 GMT
                  Server: Apache
                  Connection: close
                  Transfer-Encoding: chunked
                  Content-Type: text/html

                  Eine vielzahl von Komandos lasse ich lieber von PHP abarbeiten (wer hat da gelacht?!), als von Shell, da ich PHP erheblich besser kennen als Shellscripte...

                  Wenn pcntl nur auf dieser Ebene Funktionieren sollte, sei mir das auch recht. Und ich denke schon, bevor ich noch kein Prozess geteilt habe, baue ich mir im Fehlerfalle lieber Linux 1000 auf meinem Schmuckstück neu auf, als dumm zu sterben.

                  Im Manual steht unter http://de3.php.net/manual/en/ref.pcntl.php ja schon ein Haufen Zeug drin, wenn man das mal durchackert bekommt man zumindest mal 'nen ersten Eindruck, wie denn der Hase so läuft.

                  [...]

                  Ich habe damals an einem mehr oder minder einfachen CMS gearbeitet, das einen Prozess abspalten sollte, um lästige "Drecksarbeit" zu erledigen: Datenbankeinträge machen, eMails verschicken + diverser anderer Müll, der teilweise recht zeitintensiv war. Das waren allerdings alles Aufgaben, die auf den Fortlauf des anderen Prozesses keinerlei Einfluß hatte. Spätestens wenn die beiden Prozesse aber konkurieren rennt man als unerfahrener (als den ich mich bei diesem Thema durchaus bezeichnen möchte) in eine Menge (!) faustdicker Probleme ...

                  Zu diesen Problemen würde ich gerne erstmal kommen, aber es Fehlt mir der Klaps in die richtige Richtung. Bei mir platzt einfach nicht der Knoten :(
                  Beispiel aus dem Manual http://de3.php.net/manual/de/function.pcntl-fork.php:

                  <?php
                  $pid = pcntl_fork();

                  Wie habe ich mir genau diesen Punkt vorzustellen?

                  Laut Manual wird eine nur in der Prozessnummer ab-

                  weichender identischer Prozess gestartet.

                  Für mein Verständnis führt dies zu einer Endlos-

                  schleife an Kindprozessen, die jeweils eine neuen

                  Kindprozess starten.

                  if ($pid == -1)
                     {
                     die("could not fork");
                     }
                  elseif ($pid)
                     {
                     // we are the parent
                     }
                  else
                     {
                     // we are the child
                     }
                  ?>

                  Genau da drück mir der Schuh.
                  Danke noch mal für Deine Antwort; ich habe Dir eine Mail geschrieben (mit sehr großem jpg-Anhang), da es schade wäre, wenn es für mich immer so aussehen sollte ;)

                  Gruß aus Berlin!
                  eddi

                  --
                  Manchmal trifft es einen doch ganz unverhofft t86591:
                  > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
                  Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
                  1. Holladiewaldfee,

                    Eine vielzahl von Komandos lasse ich lieber von PHP abarbeiten (wer hat da gelacht?!), als von Shell, da ich PHP erheblich besser kennen als Shellscripte...

                    Pssst ... ich mach das auch so ;-)

                    <?php
                    $pid = pcntl_fork();

                    Wie habe ich mir genau diesen Punkt vorzustellen?

                    Ab diesem Punkt wird das gleiche Script von _zwei_ Prozessen statt nur einem abgearbeitet, die Du nur anhand der Variable $pid trennen kannst.

                    if ($pid == -1)
                       {
                       die("could not fork");
                       }
                    elseif ($pid)
                       {
                       // we are the parent
                       }
                    else
                       {
                       // we are the child
                       }
                    ?>

                    Genau da drück mir der Schuh.

                    $pid = -1 bedeutet: Es läuft weiterhin nur ein einziger Prozess, die Aufspaltung ist gescheitert.

                    Ist die Aufspaltung geglückt, hast Du nun zwei Prozesse: Einem, in dem die Variable $pid = 0 ist (der Kindprozess) und einer, in dem die Variable $pid > 0 ist (der ursprüngliche Prozess).

                    Der elseif / else Teil tut nun nichts anderes, als die beiden Prozesse (die ja nun quasi gleichzeitig ablaufen) in unterschiedliche Bahnen zu lenken. Das muß auch sein, ansonsten würden ja beide Prozesse den selber Kladeradatsch abarbeiten, was ja nur in den wenigsten Fällen wünschenswert sein dürfte.

                    Danke noch mal für Deine Antwort; ich habe Dir eine Mail geschrieben (mit sehr großem jpg-Anhang), da es schade wäre, wenn es für mich immer so aussehen sollte ;)

                    Ja, wie gesagt: Wenn ich mal Zeit übrig habe, korrigiere ich's ;-)
                    Danke Dir.

                    Ciao,

                    Harry

                    --
                      Bald kommt die Waldfee ... (Projektphase: Planung)
                      Bis dahin:
                      http://harry.ilo.de/projekte/berge/
                    1. Holla fee,

                      <?php
                      $pid = pcntl_fork();

                      Wie habe ich mir genau diesen Punkt vorzustellen?

                      Ab diesem Punkt wird das gleiche Script von _zwei_ Prozessen statt nur einem abgearbeitet, die Du nur anhand der Variable $pid trennen kannst.

                      Die Prozesse werden dann unterhalb pcntl_fork() abgearbeitet? Aha Danke, ich glaube, dann habe ich es verstanden.

                      if ($pid == -1)
                         {
                         die("could not fork");
                         }
                      elseif ($pid)
                         {
                         // we are the parent
                         }
                      else
                         {
                         // we are the child
                         }
                      ?>

                      [...]
                      [...]
                      Danke Dir.

                      Danke Dir :)))

                      Gruß aus Berlin!
                      eddi

                      --
                      Manchmal trifft es einen doch ganz unverhofft t86591:
                      > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
                      Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
  2. Hallo Andreas,

    vermutlich hast Du einen direkten Lesezugriff bsw. mit file() auf die verarbeitende Datei gemacht.

    Ich hoffe es ist Dir recht, daß ich ein wenig aushole:

    1.
        readfile() und Konsorten stellen von alleine einen formschönen
        HTTP-Request, wenn PHP mit allow_url_fopen On konfiguriert ist, über
        wrapper zusammen. Der Lesezugriff wird dabei automatisch mit einem
        Schema versehen und an den Server zugestellt.
        Jedoch sind diese Funktionen darauf ausgerichtet den Response zu
        verarbeiten.
        Bis zur vollständigen Ableistung des Response wird die Verarbeitung
        des Scripts gestoppt.
        Das macht auch Sinn, da davon auszugehen ist, das die über eine
        X-read()-Funktion eingelesenen Daten verarbeitet werden wollen
        (denken wir an das eigentliche Ziel DB-Daten irgendwann mal zu be-
        kommen).
        Im übrigen auch die Beschränkung mit ini_se('max_execution_time',1)
        bringt NULL Erfolg.

    2.
        Prizipiell hast Du die Möglichkeit alle zu verarbeitende Datein mit
        einem reellen Request der verarbeitungs.php zukommen zu lassen.
        Daher kannst Du über Netzwerkfunktionen Dir einen Request selbst
        zusammen bauen. http://de3.php.net/manual/de/ref.network.php
        Alle zu verarbeitenden Daten mußt Du dabei von Hand anlegen.
        Nur läßt Du NICHT! aus der aufgebauten Verbindung Daten auslesen,
        da Du sonst nicht mehr getan hättest, als readfile() o. ä. zu
        emulieren.

    3.
        In der Praxis ist mir das viel zu mühselig zu programmieren. Daher
        lege ich die zu verarbeitenden Dateien in eine Datei ab und schicke
        nur noch einen Request an die verarbeitungs.php. Diese ist der Abla-
        geort und der Name der Datei bekannt. Das verkürst die exakte
        Ausführung eines Request auf lediglich Drei zu sendende Zeilen.
        Deine beiden Scripte sollten folgendem Prinzip folgen:

    ANFRAGE.PHP

    <?php
    header('Location: http://localhost/');
    $s=fsockopen('localhost',80);
    fputs($s,"GET /verarbeitungs.php HTTP/1.1\r\n");
    fputs($s,"Host: localhost\r\n");
    fputs($s,"Connection: close\r\n\r\n");
    fclose($s);
    ?>

    VERARBEITUNGS.PHP

    <?php
    sleep(60);
    touch('zzzz.txt');
    ?>

    Wobei sleep() die lange Wartezeit simuliert. Die Datei "zzzz.txt" wird irgendwann auch mal erstellt (nur 60 secunden waren es irgendwie nie ;)

    Gruß aus Berlin!
    eddi

    --
    Manchmal trifft es einen doch ganz unverhofft t86591:
    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    1. Hallo eddi,

      ich habe das nicht verstanden. Und zwar verstehe ich die Funktion von fsockopen() nicht. "Socket-Verbindung" wie mich das Manual belehrt, sagt mir, außer daß ich's schon gehört habe, überhaupt nichts.

      ANFRAGE.PHP

      <?php
      header('Location: http://localhost/');
      $s=fsockopen('localhost',80);
      fputs($s,"GET /verarbeitungs.php HTTP/1.1\r\n");
      fputs($s,"Host: localhost\r\n");
      fputs($s,"Connection: close\r\n\r\n");
      fclose($s);
      ?>

      wenn ich richtig sehe, benutzt Du den "Dateihandle", den fsockopen() zurückgibt als Alias für die zu schreibende Datei?

      VERARBEITUNGS.PHP

      <?php
      sleep(60);
      touch('zzzz.txt');
      ?>

      Also, mir ist es nicht gelungen, dieses Script mithilfe des vorigen aufzurufen.

      Davon mal abgesehen: Ich schreibe keine Datei, sondern lese einen Datensatz aus einer DB-Tabelle aus und schreibe ihn zerstückelt in andere Tabellen rein. Ob Deine Methode da auch funktioniert? In dem Verarbeitungsscript brauche ich eigentlich nur die ID des Datensatzes - diese müßte vom aufrufenden Script übergeben werden.

      weitere Hilfe aus Berlin ins darbende Ruhrgebiet wäre nett,
      Gruß, Andreas

      --
      http://forum.andreas-lindig.de <img src="http://forum.andreas-lindig.de/bilder/logo.png" border="0" alt="">
      einfach mal testen und Meinung hinterlassen
      1. Hallo eddi,

        ich habe das nicht verstanden. Und zwar verstehe ich die Funktion von fsockopen() nicht. "Socket-Verbindung" wie mich das Manual belehrt, sagt mir, außer daß ich's schon gehört habe, überhaupt nichts.
        [...]
        wenn ich richtig sehe, benutzt Du den "Dateihandle", den fsockopen() zurückgibt als Alias für die zu schreibende Datei?

        fsockopen() öffnet eine Verbindung; in dem Fall zu Deinem eigenen Server. Der Server verarbeitet eine Anfrage nur, wenn sie ihm mit dem HTTP übergeben wird. HTTP ist aber nur eine Abfolge von Zeilen mit bestimmten Inhalten (dringend konsultieeren: http://www.w3.org/Protocols/rfc2616/rfc2616.html). Du verteilst mit fputs() also nichts anderes als einen Request an der Server.
        Das hat mit Dateien nichts zu tun.

        Weiterführendes Beispiel: http://www.dclp-faq.de/q/q-code-post.html

        [...]

        Also, mir ist es nicht gelungen, dieses Script mithilfe des vorigen aufzurufen.

        Heißt denn der Server localhost?

        Davon mal abgesehen: Ich schreibe keine Datei,

        Das war ein Beispielscript, um zu zeigen(, daß das Script ewig arbeiten kann, die Weiterleitung im Browser davon aber nicht betroffen ist,) was eine Verarbeitung von ca. 60 sec simuliert. Der erfolgreiche Aufruf, läßt sich daran testen, ob nach ca 60 sec nach Aufruf der anfrage.php über den Browser eine Datei namens zzzz.txt in das Arbeitsverzeichnis geschrieben wurde.

        sondern lese einen Datensatz aus einer DB-Tabelle aus und schreibe ihn zerstückelt in andere Tabellen rein. Ob Deine Methode da auch funktioniert?

        Warum nicht? Auf meinem System (SuSE apache 2 php als Handler 4.3.4) kann ich von der verarbeitungs.php Scripte ausführen lassen, welchen auch immer ich will.

        In dem Verarbeitungsscript brauche ich eigentlich nur die ID des Datensatzes - diese müßte vom aufrufenden Script übergeben werden.

        Dann mach einen ordentlichen GET-Request mit dem zugehörigen Querysring und frage in verarbeitungs.php nach $_SERVER['QUERY_STRING'] ab.

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
        1. gestern war dieser Thread noch weg...

          (dringend konsultieeren: http://www.w3.org/Protocols/rfc2616/rfc2616.html).

          tut mir leid, aber das ist mir einfach zu hoch. Und um eine einzige Funktion gebacken zu kriegen, wollte ich jetzt nicht noch ein Informatik-Studium dranhängen ;-)
          Gibt's da nicht was ne Nummer kleiner und vielleicht auf Deutsch?

          Du verteilst mit fputs() also nichts anderes als einen Request an der Server.

          fputs($s,"GET /verarbeitungs.php HTTP/1.1\r\n");
          ...und hiermit rufst Du das Script auf?

          Also, mir ist es nicht gelungen, dieses Script mithilfe des vorigen aufzurufen.
          Heißt denn der Server localhost?

          ja.

          Der erfolgreiche Aufruf, läßt sich daran testen, ob nach ca 60 sec nach Aufruf der anfrage.php über den Browser eine Datei namens zzzz.txt in das Arbeitsverzeichnis geschrieben wurde.

          habe ich schon verstanden, aber es wird nicht. Das Script selbst funktioniert schon, wenn ich es direkt aufrufe.

          In dem Verarbeitungsscript brauche ich eigentlich nur die ID des Datensatzes - diese müßte vom aufrufenden Script übergeben werden.

          Dann mach einen ordentlichen GET-Request mit dem zugehörigen Querysring und frage in verarbeitungs.php nach $_SERVER['QUERY_STRING'] ab.

          nee, dann muß ich doch wieder auf 'verarbeitungs.php' warten, bis es alles bearbeitet hat. Das gibt mir doch vorher nichts zurück.

          Gruß, Andreas

          --
          http://forum.andreas-lindig.de <img src="http://forum.andreas-lindig.de/bilder/logo.png" border="0" alt="">
          einfach mal testen und Meinung hinterlassen
          1. Moin Moin,

            Du verteilst mit fputs() also nichts anderes als einen Request an der Server.

            fputs($s,"GET /verarbeitungs.php HTTP/1.1\r\n");
            ...und hiermit rufst Du das Script auf?

            Genaugenommen rufe ich erst durch das gesammte Konstrukt das Dokument auf (wie in https://forum.selfhtml.org/?t=88104&m=524855 anfrage.php).

            Also, mir ist es nicht gelungen, dieses Script mithilfe des vorigen aufzurufen.
            Heißt denn der Server localhost?

            ja.

            Demnach scheint ein anderer Fehler aufzutreten, den ich von hieraus nicht beurteilen kann.
            Nach fputs arbeite zum debugen doch mal bitte mit echo(fgets()), und ließ nur die erste Zeile aus, Sollte eine Andere Meldung als "HTTP/1.1 200 OK" ausgegeben werden, dann liegt ein Fehler bei der Vergabe des Namens oder der Leserechte auf das Script zugrunde.

            In dem Verarbeitungsscript brauche ich eigentlich nur die ID des Datensatzes - diese müßte vom aufrufenden Script übergeben werden.

            Dann mach einen ordentlichen GET-Request mit dem zugehörigen Querysring und frage in verarbeitungs.php nach $_SERVER['QUERY_STRING'] ab.

            nee, dann muß ich doch wieder auf 'verarbeitungs.php' warten, bis es alles bearbeitet hat. Das gibt mir doch vorher nichts zurück.

            Aber Andreas :(
            Ich kann das Streuben gegen englische Texte schon verstehen, jodoch hätte das Lesen von RFC 2616 Dich vor diesem schmalen Brett bewahrt ;)

            fputs($s,"GET /verarbeitungs.php?was=auch&immer=Du%20willst HTTP/1.1\r\n");

            Gruß aus Berlin!
            eddi

            1. Hallo nochmal,

              nach langer Tortur geht's jetzt doch :-)
              Es war ein Pfadfehler und online auch ein Rechtefehler.
              möchte mich mal herzlich bedanken!

              Gruß, Andreas

              --
              http://forum.andreas-lindig.de <img src="http://forum.andreas-lindig.de/bilder/logo.png" border="0" alt="">
              einfach mal testen und Meinung hinterlassen