web-dev-qa-db-fra.com

$ _SERVER ['DOCUMENT_ROOT'] ne fonctionne pas dans le script php exécuté par cron 

J'utilise $ _SERVER ['DOCUMENT_ROOT']. "/ Lib/sft_required.php"; inclure le fichier 'sft_required' dans un script PHP. Lorsque j'exécute ce fichier à l'aide d'un navigateur, cela fonctionne correctement, mais lorsque je l'exécute en tant que tâche cron, cela ne fonctionne pas. Il semble que le fichier ne soit pas inclus lorsque nous exécutons le script via cron.

24
phpian

En supposant que vous exécutiez le script directement via cron (par opposition à un serveur Web auquel on accède par une requête HTTP déclenchée par un cronjob (par exemple, par cron exécutant wget)), cela ne fonctionne bien entendu pas. 

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

23
Quentin

vous pouvez renseigner vous-même le $ _SERVER ['DOCUMENT_ROOT']

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

si le fichier cron est dans la racine du document

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

si le fichier cron est un répertoire au-dessus de la racine du document

62
Gabriel Solomon

$_SERVER ne devrait contenir aucune des 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 transmettez-le au script en tant qu’argument de ligne de commande.

7

J'ai répondu à une question similaire ici . Comme on l'a déjà mentionné, le superglobal $ _SERVER n'est pas défini dans les situations de ligne de commande. Dans le lien se trouve une méthode (jusqu'à présent) infaillible pour obtenir l'emplacement de DOCUMENT_ROOT. J'espère que cela s'avère utile.

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

Vous obtiendrez les mêmes données que $_SERVER['DOCUMENT_ROOT'] pour les tâches cron.

1
Destralak

Exemple 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__).'/../');
?>

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

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

J'ai eu le même problème .. Et les solutions que j'ai trouvées sur Internet ne fonctionnaient pas avec mon serveur Web cron, j'avais donc besoin de trouver un autre moyen de changer ce chemin facilement ..

Et ce n'est généralement pas un gros problème, quand vous avez 1-2 fichiers cron (vous pouvez facilement éditer le chemin du fichier si nécessaire), mais j'avais 20 fichiers cron et quand j'ai besoin de changer de serveur ou de chemin modifié ou smt, alors je dois changer tous ces fichiers , changez le chemin du fichier sur eux ...

J'ai donc trouvé au moins POUR MEILLEURES solutions excellentes: [ Je ai inséré un fichier path.php dans le dossier cron et bc son même dossier avec les fichiers cron, vous pouvez l'inclure sans erreur.

Et dans path.php j'ai $path = '/server/root/path';

Et puis je inclure ce path.php à mes fichiers cron (j'ai 20 fichiers cron ou plus)

Et maintenant j'utilise ce $ path sur mes fichiers cron comme ci-dessous:

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

Maintenant, si j'ai besoin de changer de chemin, alors je viens d'ouvrir le fichier path.php , le changer et tout fonctionne.

J'espère que j'ai aidé quelqu'un, bc que les solutions ont changé ma vie beaucoup plus facile! Ce n’est pas encore parfait, c’est parfait quand tout fonctionne automatiquement, mais pour moi, c’est beaucoup plus simple que le système précédent, j’ai donc pensé partager mon expérience, mabe, je peux aider quelqu'un :)!

0
aimar