53 Stimmen

Relativer Pfad funktioniert nicht im Cron-PHP-Skript

Wenn ein PHP-Skript als Cron-Skript ausgeführt wird, schlagen die Includes oft fehl, wenn relative Pfade verwendet werden. Zum Beispiel, wenn Sie

require_once('foo.php');

die Datei foo.php wird gefunden, wenn sie auf der Kommandozeile ausgeführt wird, aber nicht, wenn sie von einem Cron-Skript ausgeführt wird.

Ein typischer Workaround hierfür ist, zunächst mit chdir in das Arbeitsverzeichnis zu wechseln oder absolute Pfade zu verwenden. Ich würde jedoch gerne wissen, was der Unterschied zwischen Cron und Shell ist, der dieses Verhalten verursacht. Warum schlägt es fehl, wenn relative Pfade in einem Cron-Skript verwendet werden?

111voto

Ändern Sie das Arbeitsverzeichnis in den Pfad der laufenden Datei. Verwenden Sie einfach

chdir(dirname(__FILE__));
include_once '../your_file_name.php'; //we can use relative path after changing directory

in der laufenden Datei. Dann müssen Sie nicht auf jeder Seite alle relativen Pfade in absolute Pfade umwandeln.

14voto

Sjoerd Punkte 71416

Das Arbeitsverzeichnis des Skripts kann sich ändern, wenn es von einem Cron ausgeführt wird. Darüber hinaus gab es einige Verwirrung über PHPs require() und include(), was zu Verwirrung darüber führte, ob das Arbeitsverzeichnis wirklich das Problem ist:

include('foo.php') // searches for foo.php in the same directory as the current script
include('./foo.php') // searches for foo.php in the current working directory
include('foo/bar.php') // searches for foo/bar.php, relative to the directory of the current script
include('../bar.php') // searches for bar.php, in the parent directory of the current working directory

7voto

jansch Punkte 71

Die einzige Möglichkeit, "require_once" gleichzeitig mit Cron und Apache zum Laufen zu bringen, war

require_once(dirname(__FILE__) . '/../setup.php');

6voto

aequalsb Punkte 3345

Denn das "aktuelle Arbeitsverzeichnis" für Cron-Aufträge ist das Verzeichnis, in dem sich Ihre crontab-Datei befindet - daher sind alle relativen Pfade relativ zu DIESEM Verzeichnis.

Der einfachste Weg, dies zu erreichen, ist mit dirname() Funktion und PHP __FILE__ konstant. Andernfalls müssen Sie die Datei mit neuen absoluten Pfaden bearbeiten, wenn Sie die Datei in ein anderes Verzeichnis oder auf einen Server mit einer anderen Dateistruktur verschieben.

dirname( __FILE__ )

__FILE__ ist eine von PHP definierte Konstante, die den vollständigen Pfad zu der Datei angibt, von der aus sie aufgerufen wird. Auch wenn die Datei eingebunden ist, __FILE__ bezieht sich IMMER auf den vollständigen Pfad der Datei selbst - nicht auf die Datei, die die Einbindung vornimmt.

Also dirname( __FILE__ ) gibt den vollständigen Verzeichnispfad zu dem Verzeichnis zurück, das die Datei enthält - unabhängig davon, von wo aus sie eingebunden wurde und basename( __FILE__ ) gibt den Dateinamen selbst zurück.

Beispiel: Nehmen wir an, "/home/user/public_html/index.php" enthält "/home/user/public_html/ihr_verzeichnis/ihre_php_datei.php".

Wenn Sie anrufen dirname( __FILE__ ) in "your_php_file.php" würden Sie "/home/user/public_html/your_directory" zurückerhalten, obwohl sich das aktive Skript in "/home/user/public_html" befindet (beachten Sie das Fehlen des nachgestellten Schrägstrichs).

Wenn Sie das Verzeichnis der INCLUDING-Datei benötigen, verwenden Sie: dirname( $_SERVER['PHP_SELF'] ) was "/home/user/public_html" zurückgibt und dasselbe ist wie der Aufruf von dirname( __FILE__ ) in der Datei "index.php", da die relativen Pfade die gleichen sind.

Verwendungsbeispiele:

@include dirname( __FILE__ ) . '/your_include_directory/your_include_file.php';

@require dirname( __FILE__ ) . '/../your_include_directory/your_include_file.php';

3voto

John Parker Punkte 53226

Eine andere Möglichkeit ist, dass die CLI-Version eine andere php.ini-Datei verwendet. (Standardmäßig wird die Datei php-cli.ini verwendet und auf die standardmäßige php.ini zurückgegriffen)

Wenn Sie außerdem .htaccess-Dateien verwenden, um den Pfad zu Ihrer Bibliothek usw. festzulegen, wird dies natürlich nicht über den Client funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X