2010-01-20 4 views
22

J'utilise $ _SERVER ['DOCUMENT_ROOT']. "/ Lib/sft_required.php"; inclure le fichier 'sft_required' dans un script PHP. Lorsque j'exécute ce fichier en utilisant un navigateur, cela fonctionne très bien, mais quand je l'exécute comme un travail de travail cron, cela ne fonctionne pas. Il semble que le fichier ne soit pas inclus lorsque nous exécutons le script via cron.

Répondre

23

En supposant que vous exécutez le script directement via cron (par opposition à un serveur Web accédé par une requête HTTP déclenchée par un cronjob (par exemple par cron running wget)), cela ne fonctionne évidemment pas.

Il n'y a pas de serveur, donc $_SERVER n'est pas défini.

+9

En fait, la superglobale '$ _SERVER' est définie, mais elle contient des valeurs différentes. –

+1

"bien sûr"? Pourquoi le serveur "oublierait" ce que "DOCUMENT_ROOT" est? Ce n'est pas si évident (en fait, après quelques années je ne comprends toujours pas pourquoi DOC_ROOT est vide ('REMOTE_ADDR' etc. sont plus évidentes) – Martijn

+0

@Martijn - Le serveur n'oublie rien. le serveur web, il est géré par cron – Quentin

7

$_SERVER ne doit pas contenir les valeurs normales lorsqu'un script PHP est exécuté à l'aide de l'interpréteur CLI. Placez le chemin dans une variable d'environnement ou passez-le au script en tant qu'argument de ligne de commande.

58

vous pouvez remplir le $ _SERVER [ 'DOCUMENT_ROOT'] sur votre propre

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

si le fichier Cron est dans le document racine

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

si le fichier Cron est un répertoire au-dessus du document root

+1

Cette réponse doit être marquée comme acceptée car elle donne une solution pratique à la question de l'OP ... –

4

J'ai répondu à une question similaire here. Comme les gens l'ont mentionné, le $ _SERVER superglobal n'est pas défini dans les situations CLI. Dans le lien est une méthode infaillible (jusqu'à présent) pour obtenir l'emplacement DOCUMENT_ROOT. J'espère que cela sera utile.

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

Ceci vous apportera les mêmes données que $_SERVER['DOCUMENT_ROOT'] pour cronjobs.

+0

Pourquoi -1? Cela fonctionne – alimack

+0

trop de choses pour avoir le même résultat que 'dirname (__FILE __) 'et, ne résolvez pas ... –

1

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

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

Exemple 2:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/ sub_dir/cron /script.php - Script PHP CRON;

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