8791 sujets

Développement web côté serveur, CMS

Bonjour

Mon script s’exécute impeccablement depuis un navigateur sur mon PC, sans émettre de message d’erreur et en produisant bien le résultat attendu.

Quand je fais exécuter ce même script par le CRON de mon hébergeur, j’ai ce message d’erreur :

script : nom invalidebr /
bWarning/b:  unlink(/homez.444/toto/www/) [a href='function.unlink'function.unlink/a]: Is a directory in b/homez.444/toto/www/tete/tfH.php/b on line b86/bbr /
br /

dans le log fourni, que je n’arrive pas à comprendre.

L’ordre unlink() mentionné par le message :

unlink ( $fichierCible );

s’exécute bien en lancement manuel comme le reste du script, le fichier nommé dans $fichierCible existe, …

Merci par avance de vos conseils.

Francois
Un problème qui ne se manifesterait pas en exécution manuelle mais qui apparaîtrait en exécution CRON?

C'est possible?

Francois
mmm pardon j'avais mal lu.
Je ne sais pas trop en fait d'où peut venir ton pb.

Mais ton message d'erreur affiche "unlink(/homez.444/toto/www/)" et t'indique que c'est un dossier et non un fichier. Ta variable est mal interprétée à priori.
Merci, cette indication oriente mes recherches.

J'ai pourtant vérifié soigneusement les noms de fichier et de dossier.

Je continue à chercher.

Francois
bonjour

Je crois avoir compris la cause mais je n'ai pas le correctif.

Au début de mon script, je recherche l'identification du site sur lequel s'exécute le script avec:

$siteId = $_SERVER['HTTP_HOST'];


Mon impression est que cet ordre Php qui fonctionne correctement en lancement manuel, une certitude, ne fonctionne pas en lancement par le Cron.

Comment faire en exécution Cron pour identifier le site?

Par avance merci de votre aide.

Francois
Bonjour,

Pour moi le problème est "relatif". Essaie de mettre ton lien en absolu. Car le cron est lancé de plus haut je suppose.

Pour identifier le site, passe un paramètre à ton cron ?
bonjour

Dans mon script, toutes les adresses sont en absolu, naturellement.

Comme j'utilise ce script dans plusieurs de mes sites, j'essaie de généraliser le code pour n'en avoir qu'un seul, d'où cette tentative d'identification du site sur lequel le script est exécuté.

Je ne suis pas familier avec le Cron, je continue à chercher.

Francois
bonjour

Je suis en train de comprendre que l'exécution Cron est en Linux et qu'il n'y a pas de serveur Apache, donc aucune des variables SERVER habituelles.

Si je dois passer par wget(), que je ne connais pas, y aurait-il un exemple dont je pourrais m'inspirer?

Merci de votre aide.

Francois
Modifié par francoisch (28 Mar 2014 - 09:54)
bonjour

Mon script a besoin d'identifier le site sur lequel il s'exécute, raison pour laquelle j'utilise $_SERVER['HTTP_HOST'] en Php.

Je viens de lire des posts pour essayer de comprendre l'utilisation de wget; cet ordre permet en particulier de lire un fichier sur un autre site en connaissant son Url.

Je n'arrive pas à faire la jonction entre le fonctionnement de wget et le besoin que j'ai.

Merci par avance de votre aide.

Francois
Bonjour,

comme tu l'as remarqué l'exécution d'un de tes scripts php via une CronTab fait qu'aucune variable de $_SERVER existe car apache ne traite pas la requête : le système utilise directement l'interpréteur Php.

Le conseil Lothindil est d'utiliser la commande wget afin de "mimer" le comportement d'un internaute qui taperait manuellement l'url vers ton fichier cron afin d'y accéder (tout comme tu l'as fait pour ton test)

C'est donc Apache qui traitera cette demande pour la distribuer à PHP par la suite, tes variables attendues dans $_SERVER seront présentes.

Cela devrait résoudre ton soucis cependant soit prudent, si le script est accessible "au public" (via un navigateur) n'importe qui pourrait tenter d'y accéder (voir un robot ?) et lancer ta tâche cron.

Je ne sais pas si ton script est "sensible" (traitements lourds, purge de données sensibles) mais fais attention Smiley cligne
bonjour Hixe et merci de ta réponse.

Oui, mon script est sensible, suffisamment pour que je préfère ne pas expliquer ce qu'il fait.

Quel serait ton conseil pour supprimer le risque d'une exécution par un néfaste? Qu'il ne soit exécutable qu'en Cron? Est ce possible?

Au sujet de Wget, tu m'apportes un complément d'information qui me tente mais je n'en sais pas assez pour m'en servir, tout débutant en Cron que je suis.

Suffit-il que je crée un script à exécuter sous Cron qui fasse wget (http://www.monsite.com) en lui indiquant l'Url de mon script actuel?
Si c'est, à peu près, comme ça, qu'est ce qui pourrait éviter que mon script actuel puisse être exécuté depuis un navigateur?

Merci de ton aide.

Francois
----------------------------------------------------------------------------------------
Pour sécuriser, je viens de trouver ça:

wget -q -O /dev/nul http://www.example.com/cron/scriptA.php

<Directory /cron>
Order deny,allow
Deny from all
Allow from localhost
</Directory>

Si je comprend, mettre mon script Php dans un répertoire et en restreindre l'accès dans le Htaccess du site; ça parait bien?

Francois
Modifié par francoisch (31 Mar 2014 - 22:24)
bonjour

J'essaie de mettre au point un appel par Wget de mon script Php qui utilise des variables $_SERVER.

Je dois utiliser le planificateur de mon hébergeur (OVH) pour lancer le Wget; je lui indique l'Url du script d'appel: www/test1.php

Dans test1.php, j'ai codé:

#!/usr/local/bin/php
wget q  http://www.fctest1.fr/tete/test2.php  > /dev/null 2>&1

où test2.php est le script avec les variables $_SERVER.

Merci de m'indiquer les erreurs que j'ai pu commettre en ignorant complet de l'univers Linux.

Francois
Modifié par francoisch (12 Apr 2014 - 21:11)
bonjour
Service de tâche cron Parfois externe comme https://www.easycron.com construit avec de nombreuses fonctionnalités améliorées est pratique pour utiliser et puissant aussi.
Modifié par Madison (01 Mar 2015 - 11:19)