Baba: "Welche" cmd benutzt PHP exec()? Bzw. wie kann ich sie ändern.

WINDOWS (2008 Server)!

Liebe Mitmenschen,

ich bin fast verzweifelt, aber nur fast. Ich konnte das Problem identifizieren, warum ein Befehl über exec() auf dem Server nicht ausgeführt wird, wohl aber, wenn ich den exakt gleichen Befehl auf dem Server eingebe: eine nötige Umgebungsvariable in %PATH% fehlt. Daher muss es wohl zwei cmd's geben, eine die ich in einer Remotedesktopverbindung öffnen kann (die hat die EnvVar) und jene, die php's exec() benutzt (dort fehlt die EnvVar). Wie kann die Umgebungsvariable für php zur Verfügung stellen?

Vielen Dank für diesen Tipp.

Cheers,
Baba

  1. Tach!

    Ich konnte das Problem identifizieren, warum ein Befehl über exec() auf dem Server nicht ausgeführt wird, wohl aber, wenn ich den exakt gleichen Befehl auf dem Server eingebe: eine nötige Umgebungsvariable in %PATH% fehlt.

    Deswegen gibt man für automatisierte Prozesse üblicherweise den Pfad zur ausführbaren Datei an und verlässt sich nicht auf die Pfad-Konfiguration, die meist für alles was keine Shell ist eingeschränkt ist.

    Daher muss es wohl zwei cmd's geben, eine die ich in einer Remotedesktopverbindung öffnen kann (die hat die EnvVar) und jene, die php's exec() benutzt (dort fehlt die EnvVar). Wie kann die Umgebungsvariable für php zur Verfügung stellen?

    Mit absolutem Pfad für die ausführbare Datei ist die Path-Variable nur noch für nachzuladende DLLs interessant, die nicht im aktuellen Verzeichnis liegen. Ansonsten dürfte PHP in Abhängigkeit vom Webserver laufen (welcher das ist und wie PHP darin eingebunden ist, ist auch entscheidend). Schau also mal nach, welchen PATH der Webserver bekommt und wie man den gegebenenfalls beinflussen kann, oder was davon er durchzureichen gewillt ist.

    dedlfix.

    1. Deswegen gibt man für automatisierte Prozesse üblicherweise den Pfad zur ausführbaren Datei an und verlässt sich nicht auf die Pfad-Konfiguration, die meist für alles was keine Shell ist eingeschränkt ist.

      Es ist etwas anderes. Ich rufe eine .exe auf, die aus Matlab heraus kompiliert wird. Damit die ganzen Bibliotheken von Matlab verfügbar sind, also damit das alles funktioniert, gibt es eine Matlab Runtime Environment. Der Pfad zu dieser befindet sich in PATH. Es gibt keine Möglichkeit diesen Pfad der .exe zu geben. Jedenfalls nicht soweit ich davon weiß.

      Mit absolutem Pfad für die ausführbare Datei ist die Path-Variable nur noch für nachzuladende DLLs interessant, die nicht im aktuellen Verzeichnis liegen.

      Das haben wir hier.

      Ansonsten dürfte PHP in Abhängigkeit vom Webserver laufen (welcher das ist und wie PHP darin eingebunden ist, ist auch entscheidend). Schau also mal nach, welchen PATH der Webserver bekommt und wie man den gegebenenfalls beinflussen kann, oder was davon er durchzureichen gewillt ist.

      Ich bin gerade darauf gestoßen. Versuche es mal mit putenv()

      Vielen Dank erstmal:

      dedlfix.

      Cheers,
      Baba

      1. Tach!

        Ich rufe eine .exe auf, die aus Matlab heraus kompiliert wird. Damit die ganzen Bibliotheken von Matlab verfügbar sind, also damit das alles funktioniert, gibt es eine Matlab Runtime Environment. Der Pfad zu dieser befindet sich in PATH. Es gibt keine Möglichkeit diesen Pfad der .exe zu geben. Jedenfalls nicht soweit ich davon weiß.
        Ich bin gerade darauf gestoßen. Versuche es mal mit putenv()

        Wenn du weißt, wie du den Pfad setzen musst, damit die .exe arbeiten kann, dann wäre das Selber-Setzen der Umgebungsvariable auch meine nächste Empfehlung gewesen.

        dedlfix.

        1. Wenn du weißt, wie du den Pfad setzen musst, damit die .exe arbeiten kann, dann wäre das Selber-Setzen der Umgebungsvariable auch meine nächste Empfehlung gewesen.

          Hurrraaaaaaa! Es klappt, mit putenv() setze ich PATH neu und es läuft. Das hat mich jetzt schon zwei Tage beschäftigt.

          Vielen Dank für die Hilfe

          Cheers,
          Baba

          1. Unter Windows gibt es "Benutzerumgebungsvariablen" und "Systemumgebungsvariablen".
            Den entsprechenden Pfad wirst du vermutlich in deinen Benutzerumgebungsvariablen gesetzt haben. Damit ist der Pfad verfügbar, wenn du den Befehl eingibst. Der Webserver wird aber vom User "System" gestartet und hat dann diesen Pfad nicht zur Verfügung.
            Wenn du also den Pfad in der PATH-Variablen unter System einträgst, sollte eigentlich alles funtionieren.

            1. Wenn du also den Pfad in der PATH-Variablen unter System einträgst, sollte eigentlich alles funtionieren.

              Wie geht das? Ich mache es momentan mit putenv() in php. Dies muss aber natürlich in jedem Script stehen, da lt. Dokumentation die Umgebungsvariablen bei Beendigung wieder auf den Ursprungswert gesetzt werden.

              Cheers,
              Baba

              1. Hallo,

                Wenn du also den Pfad in der PATH-Variablen unter System einträgst, sollte eigentlich alles funtionieren.
                Wie geht das?

                Windows? Ja, klar. Eigenschaften von 'System', Registerkarte 'Erweitert', Button 'Umgebungsvariablen' unten (Windows XP, bei Windows 7 ist es vermutlich umständlicher). Da findest du im oberen Teil die benutzerspezifischen Umgebungsvariablen, unten die systemweiten (globalen).

                Ich mache es momentan mit putenv() in php. Dies muss aber natürlich in jedem Script stehen, da lt. Dokumentation die Umgebungsvariablen bei Beendigung wieder auf den Ursprungswert gesetzt werden.

                Das ist nicht ganz richtig; sie werden nicht auf den Ursprungswert gesetzt, sondern das Environment des Kind-Prozesses wird mit dem Prozess zusammen entsorgt. Der Effekt ist natürlich derselbe.

                Ciao,
                 Martin

                --
                Schildkröten können mehr über den Weg berichten als Hasen.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            2. Den entsprechenden Pfad wirst du vermutlich in deinen Benutzerumgebungsvariablen gesetzt haben. Damit ist der Pfad verfügbar, wenn du den Befehl eingibst. Der Webserver wird aber vom User "System" gestartet und hat dann diesen Pfad nicht zur Verfügung.

              Man kann auch in der Registry herumpfuschen.

              Ganz ehrlich, das ist beides keine gute Idee, weil bei einem Neuaufsetzen des Servers diese Informationen vermutlich verloren gehen. Eben weil diese zu versteckt sind. Ich würde sogar so weit gehen, dass ich für die aufzurufenden Programme eine batch-Datei als "Wrapper" schreibe. In der kann ich die Such-Pfade neu setzen.

              Für hoch belastete Apache-Server ist Windows ohnehin eine fragwürdige Arbeitsumgebung. Auf eine ultimative Performance-Optimierung muss man da also wohl eher keine Rücksicht nehmen.

              Fred

              1. Ganz ehrlich, das ist beides keine gute Idee, weil bei einem Neuaufsetzen des Servers diese Informationen vermutlich verloren gehen. Eben weil diese zu versteckt sind.

                *Hust*, Umgebungsvariablen setzen ist keine gute Idee?
                Vielleicht für Lischen Müller, die abends mal eine Runde Solitär spielt und weiss, wo sie die Wettervorhersage unter Favoriten findet. Aber jemand der einen Webserver aufsetzt sollte schon wissen, wo man die Umgebungsvariablen für sein System setzen kann.

                1. ... weil bei einem Neuaufsetzen des Servers diese Informationen  vermutlich verloren gehen.
                  ... weil diese zu versteckt sind.
                  *Hust*, Umgebungsvariablen setzen ist keine gute Idee?

                  Die Umgebungsvariablen sind in den "Wrapper-Skripten" zu setzen.

                  Bitte denke noch mal über meine Begründung nach. Die steht in zwei Teilen jeweils hinter "weil". Ich habe genug Erfahrung mit "historisch gewachsener" IT in Unternehmen um derlei Vorhersagen machen zu können.

                  Fred

                2. (...), weil bei einem Neuaufsetzen des Servers diese Informationen vermutlich verloren gehen. Eben weil diese zu versteckt sind.

                  Aber jemand der einen Webserver aufsetzt sollte schon wissen, wo man die Umgebungsvariablen für sein System setzen kann.

                  Ich weiß es, aber wenn das System an andere Stelle verpflanzt wird, und es nicht geht, weiß keiner mehr, warum. Also werde ich es so machen, dass die Umgebungsvariablen in der batch, die es sowieso schon gibt, gesetzt werden.

                  Vielen Dank für alle Hilfe.

                  Cheers,
                  Baba

                  1. aber wenn das System an andere Stelle verpflanzt wird, und es nicht geht, weiß keiner mehr, warum.

                    Und wenn du eine weitere Matlab-Anwendung starten willst, und es nicht geht, weiss keiner mehr, warum.

                    Also werde ich es so machen, dass die Umgebungsvariablen in der batch, die es sowieso schon gibt, gesetzt werden.

                    Also anstelle einmal die Ursache des Problems zu beheben willst du lieber jedesmal eine Umgehungsmöglichkeit suchen?
                    Entweder hast du Matlab "Nur für den aktuellen Nutzer" installiert und solltest es beim nächsten mal für alle installieren, oder Matlab macht bei der Installation einen Fehler, dann würde ich diesen melden und erstmal beheben.