shell_exec unter Windows im Hintergrund ausführen geht nicht ...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • shell_exec unter Windows im Hintergrund ausführen geht nicht ...

    Hallo zusammen,

    ich habe folgendes Problem:

    ------------------------------------------------------------------------------------------------
    Mein System:
    ------------------------------------------------------------------------------------------------
    - Windows XP Pro
    - XAMPP für Windows Version 1.6.8
    - Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.6

    Safe_mod = Off (php.ini)
    -----------------------------------------------------------------------------------------------


    Ich habe einen Skript in PHP geschrieben. In diesem Skript lasse ich per Shell_exec eine EXE mit entsprechenden Parametern der EXE ausführen. Shell geht wunderbar durch und die Anwendung erzeugt Dateien wie es sein sollte.

    Mein Problem ist, daß die Generierung der Dateien etwas länger dauert und deshalb wird der Rest des Skripts nicht eher ausgeführt bis die shell_exec() ganz durch ist und somit wird die Seite erst danach aufgebaut.
    Deshalb würde ich gerne die Shell_exec() im Hintergrund ausführen, so daß der Skript ohne Verzögerung weiter ausgeführt wird und nicht auf das Ergebnis vom Shell_exec() wartet.

    Dazu habe ich viel im Internet und auch hier im Forum recherchiert aber leider keine Antwort gefunden, die mein Problem lösen konnte.

    Meine Versuche:
    Ich habe bisher folgendes versucht ohne Erfolg:
    PHP-Code:
    shell_exec("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"); 
    Das ganze habe ich auch mit exec() und System() versucht - leider ohne Erfolg.
    Da ich in den Foren gelesen habe, daß man mit "&" und Umleitung von Shell_exec Ergebnis in eine Datei den Prozess in den Hintergrund schieben kann, habe ich auch folgendes versucht - aber wie immer ohn Erfolg:
    PHP-Code:
    shell_exec("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf > test.txt &"); 
    Hat damit jemand Erfahrung unter Windows gemacht? Wie könnte man denn dieses Problem lösen?

    Danke vorab für jede Hilfe

    Gruß
    Otto

  • #2
    Mit den proc_* -Funktionen kannst du Prozesse parallel laufen lassen. Einfach mal im Manual blättern.

    Kommentar


    • #3
      Da ich in den Foren gelesen habe, daß man mit "&" und Umleitung von Shell_exec Ergebnis in eine Datei den Prozess in den Hintergrund schieben kann, habe ich auch folgendes versucht - aber wie immer ohn Erfolg:
      Weil du nur halb gelesen hast..
      Das gilt für eine Linux/Unix Shell. Und die gibts eben unter Win nur selten.

      Wenn du unter Win Prozesse in den Hintergrund schieben willst, verwende "start". Was aber bestimmte Rechte voraussetzt. Und das Beenden des Prozeses kann ein Problem werden. "start" hinterläßt keinen Haken, mit dem man den Prozess später noch aus PHP erreichen könnte.

      Grundsätzlich:
      Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. Es greifen einfach zu viele Timeouts. Diese alle abzuschalten/verlängern ist meist am falschen Ende angefangen. Auch die Rechte des Webservers so weit auszudehnen ist relativ unklug.

      Bau dir ein Kommandozeilen Programm oder Dienst, welches den Job erledigt.
      Wir werden alle sterben

      Kommentar


      • #4
        Hallo zusammen,

        danke erstmal für die Tipps.

        @PHP-Desaster
        Ich habe mir die proc_* -Funktionen kurz angeschaut, sie scheinen mir etwas komplizierter zu sein, aber ich werde mich damit näher beschäftigen und dann melde ich mich nochmal.

        Original geschrieben von combie
        Grundsätzlich:
        Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. ...
        Mein Vorhaben kurz beschrieben ist folgendes: Ich möchte im Intranet eine Seite aufbauen, wo Besucher dieser Seite sich bestimmte Daten zusammenstellen und anschließend daraus eine PDF generieren - also die PDF soll dynamisch zur Laufzeit vom Anwender selbst generiert werden. Wie es auch im Internet bei vielen Seiten der Fall ist.

        Wie soll ich es denn vom Webserverumfeld loslösen?

        Original geschrieben von combie
        Bau dir ein Kommandozeilen Programm oder Dienst, welches den Job erledigt.
        Da gibt es doch schon das Kommandozeilen Programm "ibex" (PDF Generator), das ich in meinem PHP-Code über shell_exec() bediene. Oder meinst du was anderes?

        Wie gesagt, ich muss den Anwendern über Web die Möglichkeit geben, sich Daten zusammenzustellen und daraus PDF zu generieren.

        Habt ihr evtl. Tipps und Rat für mich?

        Danke nochmal
        Gruß
        Otto

        Kommentar


        • #5
          Hast du es denn schon mit "start" probiert?
          Wir werden alle sterben

          Kommentar


          • #6
            Ok, wenn du den Prozess lediglich anstoßen willst, ohne auf die Beendigung zu warten, dann sind die proc_*-Funktionen vielleicht doch nicht so richtig. Dann doch mit & unter Unix bzw. mit start unter Windows.
            Die proc_*-Funktionen sind mehr, als ein einfaches anstoßen von Prozessen, bieten unter anderem aber auch die Möglichkeit, den angestoßenen Prozess parallel laufen zu lassen.

            Kommentar


            • #7
              Hallo,

              @combie
              entschuldige bitte, daß ich es vergessen habe auf "start" einzugehen.
              Wie verwende ich denn "start"?
              Im Internet finde ich nix darüber. Selbst im SelfPHP und im PHP.net finde ich keine derartige Funktion. Da gibt es "stat" aber nicht "start"!

              Ich habe es blind so versucht und bekomme Fehlermeldung.
              1. Versuch:
              PHP-Code:
              start "ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"
              Code:
              Parse error: syntax error, unexpected T_VARIABLE in ....
              2. Versuch:
              PHP-Code:
              start ("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"); 
              Code:
              Fatal error: Call to undefined function start()
              @PHP-Desaster
              proc_* Funktionen werde ich auch mal auf jeden Fall testen, um sie einfach näher kennen zu lernen.

              [EDIT]
              Ok. Ich denke "start" habe ich jetzt verstanden. "start" soll vor dem DOS-Befehl platziert werden.
              PHP-Code:
              shell_exec("start ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"
              Gruß
              Otto
              Zuletzt geändert von otto-mueller; 08.11.2008, 19:13.

              Kommentar


              • #8
                Hallo nochmal,

                so jetzt habe ich auch start getestet:
                Mein shell_exec() geht mit "start" nicht durch - das Aktualisierungssymbol von Firefox dreht sich die ganze Zeit aber es passiert nichts.
                Kann es mit den angesprochenen "besonderen Rechten" zu tun haben?
                Wenn ja, wo und was soll man ändern?

                Gruß
                Otto

                Kommentar


                • #9
                  Hallo zusammen,

                  so - jetzt geht "start" durch, aber ich stelle keine Verbesserung gegenüber von ohne "start". Der Code geht erst durch, wenn shell_exec() oder exec() oder system() durch ist.

                  Habt ihr eine andere Lösung für mich oder soll ich mich mit proc_* Funktionen beschäftigen?

                  Danke nochmal

                  Gruß
                  Otto

                  Kommentar


                  • #10
                    Original geschrieben von otto-mueller
                    Wie soll ich es denn vom Webserverumfeld loslösen?
                    Wie wäre es mit der PDFLib?
                    gruss Chris

                    [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                    Kommentar


                    • #11
                      Hallo,

                      PDFLib und fpdf habe ich mir auch angeschaut - die muss man doch auch in PHP einbinden.
                      Ich verstehe immer noch nicht, wie ich die PDF-Generierung vom Webserverumfeld abkuppeln soll

                      Meine ursprüngliche Frage ist leider immer noch offen: wie kann ich denn den Prozess in den Hintergrund schieben, so daß PHP weiter läuft und nicht auf das Ende des (shell_exec o. a. ) Prozesses wartet.

                      Gruß
                      Otto

                      Kommentar


                      • #12
                        hatte das mal das gleiche Problem, da hat leider nichts geholfen, hab es im Enddefekt so gelöst, dass ich einfach nen Ajax-Request gestartet habe, der ne PHP Datei aufruft, die wiederrum das exec startet.
                        Ist recht quick and dirty aber es funktioniert..

                        Kommentar


                        • #13
                          Original geschrieben von otto-mueller

                          Meine ursprüngliche Frage ist leider immer noch offen: wie kann ich denn den Prozess in den Hintergrund schieben, so daß PHP weiter läuft und nicht auf das Ende des (shell_exec o. a. ) Prozesses wartet.
                          PDFLib ist recht schnell, ich glaube nicht, dass es solange braucht, versuch doch mal.

                          Oder du schreibst einen Windowsdienst, der ein Verzeichnis überwacht, und sobald du von PHP irgendwas darein schiebst, fängt der Dienst an PDF zu erzeugen und in ein Zielverzeichnis ablegt. Der Dienst kann ohne weiteres ibex.exe aufrufen und sogar auf das Ende von ibex.exe warten und ggf. killen, wenn es mal sein muss. Somit hast du überhaupt keine Sorgen über Leichen im Taskmanager.

                          Kommentar


                          • #14
                            Hallo zusammen,

                            @krel
                            ich werde das mit Ajax-Request probieren, aber wie du es auch bereits erwähnt hast, ist die Lösung doch etwas krückenhaft. Aber wenn es funktioniert ist es auch wunderbar.

                            @asp2php
                            Das hört sich sehr genial an, ich wäre nicht drauf gekommen. Wahrscheinlich meinte "combie" auch dasselbe mit "Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. ..."

                            Ich danke euch allen bisher vielmals. Die bisherigen Tipps und Ansätze werde ich mal in aller Ruhe studieren und versuche sie umzusetzen, dann werde ich mich nochmal melden.

                            Bis dann

                            Gruß
                            Otto

                            Kommentar


                            • #15
                              Unter .NET C# ist so ein Dienst ein Kinderspiel; das ist in weniger als einer Stunde geschrieben und für deinen Zweck am ehesten geeignet.

                              Kommentar

                              Lädt...
                              X