2010-06-25 8 views
19

J'ai une tâche cron qui doit inclure ce fichier:PHP: Exiger que le chemin ne fonctionne pas pour le travail cron?

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

cependant, lorsqu'il est exécuté par le travail cron (et non pas mon test local), le chemin relatif ne fonctionne pas. la tâche cron exécute le fichier suivant (sur le serveur en direct):

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

et voici l'erreur:

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 

en utilisant le même format absolu que le travail cron, common.php serait situé à

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

que cela veut dire que je dois remplacer ma ligne 2:

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

?

merci!

+0

double possible de [Chemin relatif ne fonctionne pas dans le script PHP Cron] (http://stackoverflow.com/questions/1969374/relative-path-not-working-in-cron-php-script) –

+1

essayer: chdir (__ DIR__); à partir de: [http: // stackoverflow.com/questions/5254000/php-how-to-set-courant travail-être à répertoire-même que répertoire-exécution-le] [1] [1]: http://stackoverflow.com/questions/5254000/php-how-to-set-current-working-directory-to-be-same-as-directory-executing-the –

Répondre

22

Techniquement vu le script PHP est exécuté où cron est situé; ex. Si cron était dans/bin/cron, alors cette instruction chercherait common.php dans /bin/includes/common.php.

Alors oui, vous devrez probablement utiliser fullpaths ou utiliser set_include_path

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

pour faciliter le débogage, puis-je dire ceci: \t si (file_exists ('/ home/nom_utilisateur123/public_html/includes/common.php')) { \t \t set_include_path ('/ home/nom_utilisateur123/public_html/includes /'); \t \t require 'common.php'; \t} d'autre \t \t require '../includes/common.php'; ou ai-je besoin de le changer manuellement à chaque fois et faire: \t // EN DIRECT \t set_include_path ('/ home/fini7463/public_html/includes /'); \t require 'common.php'; \t // DEBUG \t // nécessite '../includes/common.php'; ? – gsquare567

+0

Im deviner le premier devrait être bien – Robus

20

nono. vous devez utiliser des chemins absolus sur crons.

ce que je fais est:

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

Non vous ne ... mais vous devez tenir compte du fait que vous pourriez courir dans un répertoire différent, et avec un include_path différent –

+0

ouais vous avez raison, je pense que une meilleure formulation pourrait être * son recommandé * à la place * vous avez besoin *. Eh bien, j'essaie toujours de le faire –

+0

Cela devrait être la réponse acceptée – karancan

0

Si le chemin relatif ne fonctionne pas, cela signifie que l'ensemble du répertoire courant lorsque les tâches cron sont en cours d'exécution ne sont pas/home/username123/public_html. Dans ce cas, vous ne pouvez utiliser qu'un chemin absolu.

0

Cela semble aussi simple que juste un script que vous utilisez est en train de définir le include_path et vous incluez ce script. utilisez phpinfo() pour vérifier le paramètre include_path global vs local.

0

Une alternative aux solutions qui recommandent la spécification de chemin absolu consiste à utiliser un chdir dans votre script. De cette façon, vos chemins relatifs fonctionneront comme prévu.

Par exemple, pour changer le répertoire du script:

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

Pour modifier le répertoire parent du script:

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

Et ainsi de suite.

Questions connexes