it-swarm.com.de

$ _SERVER ['DOCUMENT_ROOT'] funktioniert nicht im PHP-Skript, das durch cron läuft 

Ich verwende $ _SERVER ['DOCUMENT_ROOT']. "/ Lib/sft_required.php"; um die 'sft_required' Datei in ein PHP Skript aufzunehmen. Wenn ich diese Datei mit einem Browser starte, funktioniert sie einwandfrei, aber wenn ich sie als Cron-Job ausführen, funktioniert sie nicht. Es scheint, dass die Datei nicht enthalten ist, wenn wir das Skript über cron ausführen.

24
phpian

Angenommen, Sie führen das Skript direkt über cron aus (im Gegensatz zu einem Webserver, auf den durch eine HTTP-Anforderung (z. B. durch cron running wget) eine HTTP-Anforderung aufgerufen wird), dann funktioniert es natürlich nicht. 

Es gibt keinen Server, daher ist $_SERVER nicht gesetzt.

23
Quentin

sie könnten den $ _SERVER ['DOCUMENT_ROOT'] selbst befüllen

$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);

wenn sich die Cron-Datei im Dokumentenstamm befindet

$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__));

wenn die Cron-Datei ein Verzeichnis über dem Dokumentstamm ist

62
Gabriel Solomon

Es kann nicht erwartet werden, dass $_SERVER einen der normalen Werte enthält, wenn ein PHP-Skript mit dem CLI-Interpreter ausgeführt wird. Fügen Sie den Pfad entweder in eine Umgebungsvariable ein oder übergeben Sie ihn als Befehlszeilenargument an das Skript.

Ich habe eine ähnliche Frage hier beantwortet. Wie bereits erwähnt wurde, ist der Superglobus $ _SERVER in CLI-Situationen nicht definiert. In der Verknüpfung befindet sich eine (bisher) narrensichere Methode zum Abrufen der DOCUMENT_ROOT-Position. Ich hoffe es ist nützlich.

define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));

Dadurch erhalten Sie dieselben Daten wie $_SERVER['DOCUMENT_ROOT'] für Cronjobs.

1
Destralak

Beispiel 1:
/var/www/site.com/- DOCUMENT_ROOT;
/var/www/site.com / cron / script.php - CRON PHP script;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../');
?>

Beispiel 2:
/var/www/site.com/- DOCUMENT_ROOT;
/var/www/site.com / Unterverzeichnis/cron / script.php - CRON PHP script;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../');
?>

Ich hatte dasselbe Problem .. Und Lösungen, die ich im Internet gefunden habe, funktionierten nicht mit meinem Webserver-Cron, also musste ich einen anderen Weg finden, um diesen Pfad leicht zu ändern.

Und es ist meistens kein großes Problem, wenn Sie 1-2 Cron-Dateien haben (kann den Dateipfad bei Bedarf problemlos bearbeiten), aber ich hatte 20 Cron-Dateien und wenn ich Server oder Pfad ändern oder SMT ändern muss, muss ich all diese Dateien ändern , Dateipfad ändern ...

Also habe ich mindestens FOR ME ausgezeichnete Lösungen gefunden: I eine Datei path.php im cron-Ordner gespeichert und bc den gleichen Ordner mit cron-Dateien, dann können Sie sie einschließen ohne fehler.

Und in path.php habe ich $path = '/server/root/path';

Und dann ich füge diese path.php in meine Cron-Dateien ein (ich habe 20 Cron-Dateien oder so)

Und jetzt verwende ich diesen $ -Pfad für meine Cron-Dateien wie folgt:

include 'path.php';
include $path.'/includes/db.php';

Wenn ich jetzt den Pfad ändern muss, dann öffne ich nur die Datei path.php , ändere sie und alles funktioniert.

Hoffe, ich habe jemandem geholfen, bc, dass Lösungen mein Leben viel einfacher verändert haben! Es ist immer noch nicht perfekt, bc perfekt wäre, wenn alles automatisch funktioniert, aber für mich ist das viel einfacher als das vorherige System, also habe ich gelehrt, dass ich meine Erfahrungen teilen werde, Mabe, ich kann jemandem helfen :)!

0
aimar