2010-06-25 11 views
19

Ich habe einen cron-Job, der diese Datei umfassen muss:PHP: Require Pfad funktioniert nicht für Cron Job?

require '../includes/common.php'; 

jedoch, wenn es über den Cron-Job (und nicht die lokale Prüfung), der relative Pfad funktioniert nicht ausgeführt wird. der Cron-Job die folgende Datei ausgeführt wird (auf dem Live-Server):

/home/username123/public_html/cron/mycronjob.php 

und hier ist der Fehler:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2 

das gleiche absolute Format wie der Cron-Job verwenden, common.php würde

befinden
/home/username123/public_html/includes/common.php 

bedeutet, dass ich meine Linie 2 mit ersetzen:

require '/home/username123/public_html/includes/common.php'; 

?

danke!

+0

möglich Duplikat [Relativer Pfad nicht in cron PHP-Skript arbeiten] (http://stackoverflow.com/questions/1969374/relative-path-not-working-in-cron-php-script) –

+1

Versuch: chdir (__ DIR__); von: [http: // stackoverflow.com/Fragen/5254000/php-how-to-Set-Strom-Arbeitsverzeichnis-to-be-same-as-Verzeichnis-executing the] [1] [1]: http://stackoverflow.com/questions/5254000/php-how-to-set-current-working-directory-to-be-same-as-directory-executing-the –

Antwort

22

Technisch gesehen wird das PHP-Skript ausgeführt, wo cron liegt; Ex. Wenn cron in/bin/cron wäre, würde diese Anweisung nach common.php in /bin/includes/common.php suchen.

Also ja, werden Sie wahrscheinlich fullpaths oder set_include_path

set_include_path('/home/username123/public_html/includes/'); 
require 'common.php'; 
+0

Debugging einfacher zu machen, kann ich das sagen: \t wenn (file_exists ('/ home/username123/public_html/includes/common.php')) { \t \t set_include_path ('/ home/username123/public_html/includes /'); \t \t erfordern 'common.php'; \t} sonst \t \t require '../includes/common.php'; ; \t // LIVE- \t set_include_path ('/ home/fini7463/public_html/includes /'): oder muss ich es manuell dies jedes Mal ändern und tun \t erfordern 'common.php'; \t // DEBUG \t // require '../includes/common.php'; ? – gsquare567

+0

Ich denke, die erste sollte in Ordnung sein – Robus

20

nono verwenden verwenden. Sie müssen absolute Pfade auf Crons verwenden.

, was ich tue, ist:

// supouse your cron is on app/cron and your lib is on app/lib 
$base = dirname(dirname(__FILE__)); // now $base contains "app" 

include_once($base . '/lib/db.inc'); 

// move on 
+1

Nein, Sie nicht ... aber Sie müssen für die Tatsache, dass Sie möglicherweise in einem anderen Verzeichnis ausgeführt werden, und mit einem anderen include_path –

+0

yeah Sie haben Recht, denke ich ein Eine bessere Formulierung könnte * empfohlen * werden * anstatt * Sie * brauchen. Nun, ich versuche immer, das zu tun –

+0

Dies sollte die akzeptierte Antwort sein – karancan

0

Wenn der relative Pfad nicht funktioniert, dann bedeutet es, dass das aktuelle Verzeichnis gesetzt, wenn die Cron-Tasks ausgeführt wird, ist nicht/home/username123/public_html. In solchen Fällen können Sie nur einen absoluten Pfad verwenden.

0

Es klingt so einfach wie nur ein Skript, das Sie gerade ausführen, setzt den include_path und Sie fügen dieses Skript ein. Verwenden Sie phpinfo(), um die globale Einstellung von include_path vs local zu überprüfen.

0

Eine Alternative zu den Lösungen, die absolute Pfadangabe empfehlen, verwenden Sie eine chdir in Ihrem Skript. Auf diese Weise funktionieren Ihre relativen Pfade wie erwartet.

Zum Beispiel in das Verzeichnis des Skripts zu ändern:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir); 

an das übergeordnete Verzeichnis des Skripts zu ändern:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir . "/.."); 

Und so weiter.