web-dev-qa-db-fra.com

php /var/www/html/*.php ne fonctionne pas dans le terminal ouvert à partir du menu php * .php fonctionne dans le terminal ouvert dans le dossier de maintien de php

Je veux exécuter un script PHP à partir de cron. J'ai installé cron avec:

*/1 * * * * php  /var/www/html/cron/cron_job.php

Et je peux le voir dans crontab -u root -l, mais le travail n'est pas exécuté. Cela ne fonctionne pas non plus lorsque j'exécute la commande directement à partir de la ligne de commande, comme ceci:

<?php  /var/www/html/cron/cron_job.php

J'ai essayé beaucoup de réponses liées à cron mais rien n'a fonctionné. Par exemple:

/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
Sudo php -f /var/www/html/cron/cron_job.php

Le script de test php (cron_job.php) est:

php file_put_contents  ('test.txt',"test content\n",FILE_APPEND);  

Les autorisations sur les fichiers sont correctes et fonctionnent lorsqu’elles sont exécutées dans le navigateur ou lorsqu’on ouvre un terminal dans /var/www/html/cron/ et qu’on exécute php cron_job.php.

Comme demandé dans les commentaires, si j'ajoute 2> /tmp/php.log à php /var/www/html/cron/cron_job.php, j'utilise un script avec une erreur de syntaxe et tente d'exécuter (php /var/www/html/cron/cron_job.php 2> /tmp/php.log) à partir du terminal de menu, le journal des erreurs reçoit alors le message d'erreur .

4
Naga

Votre script est presque certainement en cours d'exécution et crée votre fichier. Ce n'est tout simplement pas le créer où vous vous attendez. Vous n'utilisez aucun chemin dans votre script, vous utilisez simplement un nom de fichier. Cela signifie que le fichier sera créé dans le répertoire dans lequel le script est exécuté.

C'est pourquoi, lorsque vous accédez à un répertoire spécifique et exécutez le script à cet emplacement, vous pensez que cela fonctionne. Parce que le fichier est créé dans le répertoire dans lequel vous l'avez exécuté, vous pouvez le voir. Par défaut, cron est exécuté dans le répertoire de base de l'utilisateur qui l'exécute. Comme il s'agit de la crontab de root (ce qui est d'ailleurs une mauvaise idée), le fichier sera créé dans /root. Alors, allez vérifier:

Sudo ls /root/test.txt

Alors, la prochaine fois, donnez à votre script un chemin complet au lieu d’un nom de fichier:

<?php file_put_contents  ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>

Maintenant, le fichier sera créé dans /path/to.

11
terdon

Par défaut, les travaux Cron sont exécutés dans le répertoire de base de l'utilisateur. Bien que dans votre script ne soit pas fourni le chemin dans lequel le fichier de sortie doit être enregistré, il sera enregistré dans le répertoire où le script est exécuté.

Dans votre PHP script, le chemin d'accès au fichier test.txt est manquant. Vous pouvez le définir en tant que valeur absolue, comme décrit dans @ terdon's answer , ou vous pouvez le fournir sous forme de chemin relatif (avec l'origine correcte). Par exemple, si test.txt devrait être situé dans le même répertoire que cron_job.php, le contenu de votre script devrait ressembler à ceci:

<?php 
    $path = realpath(dirname(__FILE__)); 
    file_put_contents  ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>

Si vous ne souhaitez pas modifier le script, vous pouvez également modifier le travail Cron de la manière suivante:

*/1 * * * * cd /var/www/html/cron/ && php cron_job.php
6
pa4080