2010-06-25 18 views
19

Ho un lavoro cron che deve includere questo file:PHP: il percorso obbligatorio non funziona per il cron job?

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

tuttavia, quando viene eseguito tramite il lavoro cron (e non il mio test locale), il percorso relativo non funziona. il job cron viene eseguito il seguente file (sul server live):

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

ed ecco l'errore:

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 

utilizzando lo stesso formato in assoluto come il processo di cron, common.php sarebbe situato a

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

vuol dire che devo sostituire la mia linea 2 con:

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

?

grazie!

+0

possibile duplicato del [Percorso relativo non funziona in script PHP cron] (http://stackoverflow.com/questions/1969374/relative-path-not-working-in-cron-php-script) –

+1

prova: chdir (__ DIR__); da: [http: // stackoverflow.com/domande/5254000/php-how-to-set-corrente-working-directory-to-be-same-as-directory-esecuzione-il] [1] [1]: http://stackoverflow.com/questions/5254000/php-how-to-set-current-working-directory-to-be-same-as-directory-executing-the –

risposta

22

Tecnicamente visto lo script php viene eseguito dove si trova cron; ex. Se cron era in/bin/cron, allora questa dichiarazione cercherebbe common.php in /bin/includes/common.php.

Quindi sì, probabilmente dovrete usare fullpaths o utilizzare set_include_path

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

per semplificare il debug, posso dire questo: \t se (file_exists ('/ home/username123/public_html/includes/common.php')) { \t \t set_include_path ('/ home/username123/public_html/includes /'); \t \t richiedono "common.php"; \t} altro \t \t richiedono '../includes/common.php'; o ho bisogno di cambiare manualmente ogni volta e fare questo: \t // DIRETTA \t set_include_path ('/ home/fini7463/public_html/includes /'); \t richiedono 'common.php'; \t // DEBUG \t // require '../includes/common.php'; ? – gsquare567

+0

Suppongo che il primo debba andare bene – Robus

20

nono. devi usare percorsi assoluti su crons.

Quello che faccio è:

// 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

No, non è così ... ma devi tenere conto del fatto che potresti essere in esecuzione in una directory diversa, e con un diverso include_path –

+0

sì, hai ragione, penso che una migliore formulazione potrebbe * essere raccomandata * invece * è necessario *. bene provo sempre a farlo –

+0

Questa dovrebbe essere la risposta accettata – karancan

0

Se il percorso relativo non funziona, allora vuol dire che l'attuale set di directory in cui le operazioni di cron sono in esecuzione non è/home/username123/public_html. In questi casi, puoi utilizzare solo un percorso assoluto.

0

Sembra semplice come solo uno script in esecuzione sta impostando il percorso include e lo script è incluso. utilizzare phpinfo() per verificare l'impostazione globale vs vs_path_path.

0

Un'alternativa alle soluzioni che raccomandano la specifica del percorso assoluto utilizza uno chdir nello script. In questo modo, i percorsi relativi funzioneranno come previsto.

Ad esempio, per passare alla directory dello script:

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

Per passare alla directory superiore dello script:

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

e così via.