Chemin relatif ne fonctionne pas dans le cron script PHP
Si un script PHP est exécuté comme un programme cron, le comprend souvent échouer si les chemins relatifs sont utilisés. Par exemple, si vous avez
require_once('foo.php');
le fichier foo.php sera trouvé lors de l'exécution sur la ligne de commande, mais pas lorsqu'il est exécuté à partir d'un script cron.
Typique de solution de contournement pour ce problème consiste à chdir pour le répertoire de travail, ou utiliser des chemins absolus. Je voudrais savoir, cependant, ce qui est différent entre cron et shell qui provoque ce comportement. Pourquoi est-il échouer lorsque vous utilisez des chemins relatifs dans un script cron?
- C'est une grande ressource ainsi: stackoverflow.com/questions/2857712/...
- Ne changez pas vos fichiers PHP juste pour les faire travailler à partir d'une tâche cron, au lieu de changer de répertoire sur la tâche cron ligne. Vérifier ma réponse ici.
Vous devez vous connecter pour publier un commentaire.
Changer le répertoire de travail pour l'exécution de chemin d'accès au fichier. Utilisez simplement
en exécutant le fichier. Ensuite, vous n'aurez pas besoin de changer tous les chemins d'accès relatifs à des chemins absolus dans chaque page.
chdir(__DIR__);
qui est un peu plus concis.chdir()
dans votre environnement.include/require dirname( __FILE__ )
est beaucoup plus fiable.Le répertoire de travail du script peut être différent lorsqu'il est exécuté à partir d'un cron. De plus, il y a une certaine confusion à propos de PHPs require() et include(), ce qui a causé de la confusion sur le répertoire de travail vraiment le problème:
La seule chance que j'ai obtenu "require_once" de travailler avec cron et apache dans le même temps a été
Parce que le "répertoire de travail" pour des tâches cron sera le répertoire où votre fichier crontab existe -- donc toute relative des chemins avec les être par rapport à ce répertoire.
La façon la plus simple de poignée avec
dirname()
fonction et PHP__FILE__
constante. Sinon, vous devrez modifier le fichier avec de nouveaux chemins d'accès absolus chaque fois que vous déplacez le fichier vers un autre répertoire ou sur un serveur avec une autre structure de fichiers.__FILE__
est une constante définie par PHP comme le chemin d'accès complet au fichier à partir de laquelle il est appelé. Même si le fichier est inclus,__FILE__
va TOUJOURS se référer au chemin d'accès complet du fichier lui-même et non pas le fichier en faisant l', y compris.Donc
dirname( __FILE__ )
retourne le chemin complet du répertoire dans le répertoire contenant le fichier -- peu importe où il est inclus à partir de etbasename( __FILE__ )
retourne le nom du fichier lui-même.exemple:
Imaginons "/home/user/public_html/index.php" comprend "/home/user/public_html/your_directory/your_php_file.php".
Si vous appelez
dirname( __FILE__ )
dans "your_php_file.php" vous obtenez "/home/user/public_html/your_directory" retournée, même si le script actif se trouve dans "/home/user/public_html" (notez l'absence de la barre oblique).Si vous avez besoin du répertoire de l', y COMPRIS l'utilisation du fichier:
dirname( $_SERVER['PHP_SELF'] )
qui sera de retour "/home/user/public_html" et est le même que l'appel à ladirname( __FILE__ )
dans l' "index.php" fichier depuis les chemins relatifs sont les mêmes.exemple d'utilisation:
Une autre possibilité est que la version CLI est en utilisant un autre php.fichier ini. (Par défaut, il va utiliser php-cli.ini et de secours de la standard php.ini)
Aussi, si vous êtes en utilisant .htaccess pour définir votre chemin de la bibliothèque, etc. de toute évidence, cela ne fonctionne pas via l'interface cli.
En plus acceptée dans la réponse ci-dessus, vous pouvez également utiliser:
chdir()
dans l'environnement dans lequel vous êtesLorsqu'il est exécuté par le biais d'une tâche cron de votre script PHP probablement s'exécute dans un contexte différent que si vous démarrez manuellement à partir du shell. Si vos chemins relatifs ne sont pas dirigées vers le droit chemin.
dirname( __FILE__ )
La DIR marche bien qu'il ne fonctionne pas sur mon localhost, comme il a un chemin d'accès différent de mon serveur de site. J'ai utilisé ce pour corriger.
dirname( __FILE__ )