Stefan E: Probleme beim ausführen von Scripten in der Command Line

Hallo Zusammen
Ich benutze PHP 5.1.2 auf einem Windows Server mit Apache. Wenn ich ein Script im Browser öffne funktioniert es normal. Doch wenn ich es in der Command Line öffne funktionieren die includes nicht. Wo könnte hier das Problem sein?

Vielen Dank für eure Hilfe.

gruäss Stefan

  1. Hallo Stefan,

    Ich benutze PHP 5.1.2 auf einem Windows Server mit Apache. Wenn ich ein Script im Browser öffne funktioniert es normal. Doch wenn ich es in der Command Line öffne funktionieren die includes nicht. Wo könnte hier das Problem sein?

    in Deinem Code, den Du uns freundlicherweise vorenthältst. Mir fallen spontan Pfade ein und der Zugriff auf verschiedenes anderes, was nicht vorhanden ist.

    Freundliche Grüße

    Vinzenz

    1. echo $begrüßung;

      Ich benutze PHP 5.1.2 auf einem Windows Server mit Apache. Wenn ich ein Script im Browser öffne funktioniert es normal. Doch wenn ich es in der Command Line öffne funktionieren die includes nicht. Wo könnte hier das Problem sein?

      in Deinem Code, den Du uns freundlicherweise vorenthältst. Mir fallen spontan Pfade ein und der Zugriff auf verschiedenes anderes, was nicht vorhanden ist.

      Ergänzend und mit eingeschaltetem Glaskugelmodus: Die vom CLI verwendete php.ini kann eine andere sein als die vom Apache-Modul. Wenn darin der include_path ...

      echo "$verabschiedung $name";

      1. Sorry ich wusste nicht, was für Informationen ihr für dieses Problem gebraucht. Hier ein paar angaben.

        in Deinem Code, den Du uns freundlicherweise vorenthältst. Mir fallen spontan Pfade ein und der Zugriff auf verschiedenes anderes, was nicht vorhanden ist.

        es ist ein ganz normaler include wie z.B. indclude("../ein_ordner/eine_datei.php);
        Wie gesagt wenn ich es per Browser aufrufe, findet er die Datei wenn ich sie per Command Line aufrufe kommt folgender Fehler:
        "PHP Warning:  include(../ein_ordner/eine_datei.php): failed to open stream: No such file or directory in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"
        und "PHP Warning:  include(): Failed opening '../ein_ordner/eine_datei.php' for inclusion (include_path='.;C:\php5\pear') in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"

        Ergänzend und mit eingeschaltetem Glaskugelmodus: Die vom CLI verwendete php.ini kann eine andere sein als die vom Apache-Modul. Wenn darin der include_path ...

        PHP ist mitels CGI im Apache eingebunden. Es gibt nur eine php.ini Datei welche unter c:\PHP liegt.
        bei include_path habe ich einmal c:\php\pear angegeben hat aber nichts gebracht. Momentan include_path wieder auskommentiert, wie es beim orginal php.ini auch war.

        Kann es an der Option include_path liegen? Was für weitere Informationen benötigt ihr?

        1. Hallo Stefan,

          es ist ein ganz normaler include wie z.B. indclude("../ein_ordner/eine_datei.php);
          Wie gesagt wenn ich es per Browser aufrufe, findet er die Datei wenn ich sie per Command Line aufrufe kommt folgender Fehler:
          "PHP Warning:  include(../ein_ordner/eine_datei.php): failed to open stream: No such file or directory in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"
          und "PHP Warning:  include(): Failed opening '../ein_ordner/eine_datei.php' for inclusion (include_path='.;C:\php5\pear') in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"

          PHP ist mitels CGI im Apache eingebunden. Es gibt nur eine php.ini Datei welche unter c:\PHP liegt.

          es ist möglich, daß dort der "Configuration File (php.ini) Path" tatsächlich ist - jedoch bezweifle ich dies. Er ist standardmäßig das Systemverzeichnis. Rufe also php.exe -i auf und such nach "Configuration File (php.ini) Path" in der Ausgabe.

          bei include_path habe ich einmal c:\php\pear angegeben hat aber nichts gebracht. Momentan include_path wieder auskommentiert, wie es beim orginal php.ini auch war.
          Kann es an der Option include_path liegen? Was für weitere Informationen benötigt ihr?

          Die Vermutung war naheliegend, daß es ein Problem mit include_path gibt, aber in Deinem Fall scheinen andere Gründe vorzuliegen. Versuche es bitte mit absoluten Pfadangaben: include('c:\programme\apache group\Apache2\htdocs\test\ein_ordner\eine_datei.php');

          Gruß aus Berlin!
          eddi

          1. Hallo eddi

            Rufe also php.exe -i auf und such nach "Configuration File (php.ini) Path" in der Ausgabe.

            Ich bekomme folgende ausgabe:
            Configuration File (php.ini) Path => C:\PHP\php.ini
            Somit müsste er die richtige php.ini nehmen. Die ganze Info könnt ihr auch unter 213.180.179.171/info.php anschauen. (ich denke jetzt einmal das php.exe -i das gleiche ergibt wie phpinfo() )

            Die Vermutung war naheliegend, daß es ein Problem mit include_path gibt, aber in Deinem Fall scheinen andere Gründe vorzuliegen. Versuche es bitte mit absoluten Pfadangaben: include('c:\programme\apache group\Apache2\htdocs\test\ein_ordner\eine_datei.php');

            mit dem absoluten Pfad (normale slashes und keine backslashes) klappt es. Doch dass kann es ja nicht sein, dass man es mit absoluten Pfaden programmieren muss. Ich habe das ganze auch auf einem anderen Server mit apache 1.x und php 4.x ausprobiert und dort klappt es auch mit relativen Pfaden ohne probleme.

            Ich erhalte ja als zweite Fehlermeldung jeweils:
            Warning: include() [function.include]: Failed opening '...' for inclusion (include_path='.;C:\php5\pear') in ...
            Was ist mit include_path='.;C:\php5\pear' gemeint? Die pfadangabe stimmt ja so sicher nicht.

            1. Re:

              Rufe also php.exe -i auf und such nach "Configuration File (php.ini) Path" in der Ausgabe.
              Ich bekomme folgende ausgabe:
              Configuration File (php.ini) Path => C:\PHP\php.ini
              Somit müsste er die richtige php.ini nehmen. Die ganze Info könnt ihr auch unter 213.180.179.171/info.php anschauen. (ich denke jetzt einmal das php.exe -i das gleiche ergibt wie phpinfo() )

              Es ist richtig, der Parameter -i gibt ebenfalls die Angaben von phpinfo() aus. Allerdings sollte Dir aufgefallen sein, daß ja offensichtlich ein Unterschied zwischen PHP via Apache und PHP via Komandozeile besteht. Deswegen wäre es um so interessanter gewesen zu sehen, ob hierbei ein Unterschied zu erkennen ist.

              include('c:\programme\apache group\Apache2\htdocs\test\ein_ordner\eine_datei.php');

              mit dem absoluten Pfad (normale slashes und keine backslashes) klappt es. Doch dass kann es ja nicht sein, dass man es mit absoluten Pfaden programmieren muss.

              Schön ist es sicher nicht. Aber an der Komandozeile wird PHP mit anderen Umgebungsvariablen versorgt. So wird ein Script mit folgenden Inhalt aller Voraussicht nach via Apache etwas anderes ergeben, als via Komandozeile: <?php echo [link:http://de3.php.net/manual/de/function.getcwd.php@title=getcwd](); ?>. Da vermute ich den tatsächlichen Knackpunkt. Bei einer Referenzierung über relative Pfadangeben mußt Du natürlich auch an der Komandozeile dafür sorgen, daß vom _selben_ Arbeitsverzeichnis aus auf die Scripte zugegriffen wird.

              Warning: include() [function.include]: Failed opening '...' for inclusion (include_path='.;C:\php5\pear') in ...
              Was ist mit include_path='.;C:\php5\pear' gemeint? Die pfadangabe stimmt ja so sicher nicht.

              Das kann man von außen schwer beurteilen. Prizipiell sind zwei Verzeichnisse semikolongetrennt benannt: "Aktuelles Arbeitsverzeichnis '.'" und "C:\php5\pear".
              http://de3.php.net/manual/de/ini.sect.path-directory.php#ini.include-path

              Gruß aus Berlin!
              eddi

              1. gudn tach!

                Bei einer Referenzierung über relative Pfadangeben mußt Du natürlich auch an der Komandozeile dafür sorgen, daß vom _selben_ Arbeitsverzeichnis aus auf die Scripte zugegriffen wird.

                bei der verwendung von php-cli stimmt das. bei der verwendung von php-cgi wird afaik immer das verzeichnis des scriptes als arbeitsverzeichnis genommen, egal von wo man es das script aufruft.

                um auch mit php-cli "von ueberall" arbeiten zu koennen, kann man das php-script um folgendes ergaenzen:

                  
                $dirname=dirname(__FILE__);  
                include($dirname.'/../foo/bar.php');
                

                prost
                seth

              2. Es ist richtig, der Parameter -i gibt ebenfalls die Angaben von phpinfo() aus. Allerdings sollte Dir aufgefallen sein, daß ja offensichtlich ein Unterschied zwischen PHP via Apache und PHP via Komandozeile besteht. Deswegen wäre es um so interessanter gewesen zu sehen, ob hierbei ein Unterschied zu erkennen ist.

                Mir ist direkt kein Unterschied aufgefallen, welcher etwas mit dem Problem zu tun hat. Aber ihr könnt unter http://213.180.179.171/info.txt die angaben von der Command Line ansehen und unter http://213.180.179.171/info.php das vom Apache.

                Schön ist es sicher nicht. Aber an der Komandozeile wird PHP mit anderen Umgebungsvariablen versorgt. So wird ein Script mit folgenden Inhalt aller Voraussicht nach via Apache etwas anderes ergeben, als via Komandozeile: <?php echo [link:http://de3.php.net/manual/de/function.getcwd.php@title=getcwd](); ?>. Da vermute ich den tatsächlichen Knackpunkt. Bei einer Referenzierung über relative Pfadangeben mußt Du natürlich auch an der Komandozeile dafür sorgen, daß vom _selben_ Arbeitsverzeichnis aus auf die Scripte zugegriffen wird.

                Wenn ich ins Verzeichnis c:\php gehe und dort php -f "c:\programme\apache group\apache\htdocs\getcwd.php" gehe bekomme ich c:\php zurück. per browser bekomme ich C:\Programme\Apache Group\Apache2\htdocs\ Deswegen bin ich in der CommandLine einmal ins Verzeichnis des Scripts gegangen und dort folgenden Befehl ausgeführt. c:\php -f script.php. Damit haben die includes funktioniert.

                Kann man in der php.ini nicht einstellen, dass er das Verzeichnis, indem es liegt, als ausgangsverzeichnis nimmt??

                1. Re:

                  Mir ist direkt kein Unterschied aufgefallen, welcher etwas mit dem Problem zu tun hat. Aber ihr könnt unter http://213.180.179.171/info.txt die angaben von der Command Line ansehen und unter http://213.180.179.171/info.php das vom Apache.

                  Damit ist dann auch der Fall aufgeklärt ;)
                  "Server API => Command Line Interface"
                  Der Aufruf php greift nicht auf di c:\php\php-cgi.exe zu sondern auf das CLI (vermutlich c:\php\php-cli.exe) zu!

                  seth hatte nämlich recht. Das CGI-Programm nimmt immer das aktuelle verzeichnis des Scripts als Arbeitsverzeichnis an; und genau da ist auch der Hund begraben.

                  Wenn ich ins Verzeichnis c:\php gehe und dort php -f "c:\programme\apache group\apache\htdocs\getcwd.php" gehe bekomme ich c:\php zurück. per browser bekomme ich C:\Programme\Apache Group\Apache2\htdocs\ Deswegen bin ich in der CommandLine einmal ins Verzeichnis des Scripts gegangen und dort folgenden Befehl ausgeführt. c:\php -f script.php. Damit haben die includes funktioniert.

                  Es gibt eine Möglichkeit hier mit auto_prepend_file eine Routine vorzuschalten, die mittels

                    
                  if(php_sapi_name() == "cli")  
                     chdir(dirname($_SERVER["argv"][1]));  
                  
                  

                  eine Fallunterscheidung macht.

                  Gruß aus Berlin!
                  eddi

                  1. Damit ist dann auch der Fall aufgeklärt ;)
                    "Server API => Command Line Interface"
                    Der Aufruf php greift nicht auf di c:\php\php-cgi.exe zu sondern auf das CLI (vermutlich c:\php\php-cli.exe) zu!

                    seth hatte nämlich recht. Das CGI-Programm nimmt immer das aktuelle verzeichnis des Scripts als Arbeitsverzeichnis an; und genau da ist auch der Hund begraben.

                    Wenn ich in der CL nicht "php -f <file>" sonder "php-cgi -f <file>" eingebe klappt es wunderbar.

                    Vielen Dank für eure Hilfe

          2. gudn tach!

            Rufe also php.exe -i auf und such nach "Configuration File (php.ini) Path" in der Ausgabe.

            in windows gibt's sowas aehnliches wie grep und nennt sich findstr. und damit klappen solche suchaktionen etwas schneller als manuell (obwohl man ja mehr mit dem auge als mit der hand sucht...):

            php -i | findstr php.ini

            prost
            seth

        2. gudn tach!

          wenn ich sie per Command Line aufrufe kommt folgender Fehler:
          "PHP Warning:  include(../ein_ordner/eine_datei.php): failed to open stream: No such file or directory in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"
          und "PHP Warning:  include(): Failed opening '../ein_ordner/eine_datei.php' for inclusion (include_path='.;C:\php5\pear') in c:\programme\apache group\Apache2\htdocs\test\1\index.php on line 2"

          wenn du das script aus dem richtigen verzeichnis heraus aufrufst, klappt es aber, oder?

          beispiel:
            php ordner\script.php
            -> fehlermeldungen

          cd ordner
            php script.php
            -> keine fehlermeldungen

          oder?

          prost
          seth