problème d'accès cron avec php/mysql

Gaulois

Nouveau WRInaute
Bonjour

Je suis en train de faire une requête cron pour pour lancer un fichier php et dedans j'ai une connexion à une base de données qui doit ce faire.
Mais j'ai 2 messages d'erreurs :
PHP Warning: mysql_query(): Access denied for user 'test'@'localhost' (using password: NO)
PHP Warning: mysql_query(): A link to the server could not be established

Pourtant lorsque je lance le fichier directement sans passer par une tâche cron, tout se passe sans problème.
Donc ma connexion a ma BDD est bonne.
Je pense donc que c'est cron qui me pose un problème d'accès mais je ne vois pas comment.

Si je lance juste une tâche cron avec un phpinfo() dedans, tout se passe bien.

J'ai un serveur avec un administration sous Plesk.

J'attends vos solutions avec impatience.

Gaulois
 

Robinson

WRInaute passionné
Bonjour,

Et dans ton fichier de configuration, tu te connectes à mysql avec le login "test" et sans mot de passe ?
Sinon via les tâches cron, le répertoire d'inclusion apache n'est pas pris en compte et peut donc poser des soucis si tu as un fichier de connexion à côté du script.
 

Gaulois

Nouveau WRInaute
C'est cela qui est étrange, j'ai bien l'utilisateur test avec un mot de passe.
Alors que là, on me dit l'inverse.
 

NxtGen

WRInaute impliqué
Il peut y avoir plusieurs causes :
- Vérifie le chemin des includes si tu en as, et met l'adresse absolue (/home/tonsite/www/includes.php par exemple)
- Vérifie que l'utilisateur qui exécute le cron ait bien les droits d'accès aux fichiers que tu veux lui faire lire.
 

Gaulois

Nouveau WRInaute
Je mets bien l'adresse absolue.
Et par contre je vérifie comment que l'utilisateur qui exécute le cron ait bien les droits? dans le fichier sudoers?

Merci de vos réponses :)
 

Robinson

WRInaute passionné
Pourtant lorsque je lance le fichier directement sans passer par une tâche cron, tout se passe sans problème.
Quand tu lances toi-même la ligne de commande figurant dans ton cron, cette erreur apparaît ? quelle est cette ligne ?

Je doute que l'utilisateur cron ai une quelconque importance, c'est mysql qui n'accepte pas la connexion faute de mot de passe. D'ailleurs mysql ne se préoccupe que du serveur effectuant la demande, du login et du mot de passe. (utilisateur test bien déclaré en localhost ?)
 

Gaulois

Nouveau WRInaute
Ma tâche cron appel juste un fichier PHP où dedans j'appel une BDD.
Donc je lance mon fichier directement sur mon serveur.
Et là, pas de problème, les données sont inscrits dans ma BDD, aucune erreur.

Et comme tu le dis, ce qui est étonnant c'est que la tâche cron n'accepte pas la connexion alors que tout se passe bien lorsque je le lance sur mon serveur.
 

Robinson

WRInaute passionné
Pour bien se comprendre, quand tu dis "je lance mon fichier directement sur mon serveur", cela n'est pas via un navigateur internet mais bien en ligne de commande ?
Tu travailles en ligne de commande ou via une interface d'administration ?
 

Gaulois

Nouveau WRInaute
Non c'est bien dans mon navigateur que je lance mon fichier.
C'est un fichier php tout ce qu'il y a de plus basique.
Je veux utiliser cron puisque ce fichier doit être lancer tous les jours.
Je fais ma tâche cron avec une administration sous Plesk.
 

Gaulois

Nouveau WRInaute
Je pense donc que mon utilisateur n'a pas les droits dans cron.
J'ai un accès en SSH mais je n'ai pas encore trouvé l'endroit ou je peux voir si mon utilisateur a suffisamment de droits pour effectuer cette tâche cron.

Gaulois a dit:
Si je lance juste une tâche cron avec un phpinfo() dedans, tout se passe bien.
 

Robinson

WRInaute passionné
Ce type d'erreur apparait seulement quand tu n'as pas effectué la connexion à ta base de données au préalable.
Si la connexion avait échoué, cela aurait été :
Warning: mysql_connect(): Access denied for user 'test'@'localhost' (using password: NO)

Donc le soucis se trouve bien dans l'include de ton fichier de connexion.
Vérifie les droits de ce fichier également, il y a de fortes chances que le soucis soit ici.
 

Gaulois

Nouveau WRInaute
Robinson a dit:
Donc le soucis se trouve bien dans l'include de ton fichier de connexion.
Vérifie les droits de ce fichier également, il y a de fortes chances que le soucis soit ici.

Je n'ai pas fait de fichiers différents pour ma connexion, toutes les informations se trouvent directement dans le fichier que j'appel.

ps : regarde j'ai remis un post juste avant que tu réponds
 

Robinson

WRInaute passionné
Il y a bien un soucis dans ton fichier ^^
Il n'y a pas d'appel à mysql_connect sauf si tu masques les erreurs...

Peut-on avoir un aperçu de ta connexion (met des étoiles à la place du mot de passe ^^)
 

Gaulois

Nouveau WRInaute
Si j'ai bien un appel à ma base avec mysql_connect

Code:
$connexion_sql = mysql_connect("localhost", "root", "") or die ('Erreur de connexion à MySQL '.mysql_error()); // Connexion à MySQL
$bdd_sql = mysql_select_db("test") or die ('Erreur de connexion à la base de données '.mysql_error()); // Sélection de la base

ps : j'ai mis ma connexion en local mais comme je te l'ai dis ce n'est pas ma connexion à la base qui déconne pour moi c'est mon utilisateur sous cron
 

Robinson

WRInaute passionné
Euuuuuuh là ton login à ta BDD, c'est "root", dans l'erreur c'est écrit "test", y'a déjà un soucis quelque part ^^.
D'ailleurs comment obtiens-tu ces erreurs générées via cron ? dans les logs ? Il n'y a rien d'autre qui précède ?

Je ne peux t'aider davantage ce soir, au lit !
 

Gaulois

Nouveau WRInaute
Robinson a dit:
Euuuuuuh là ton login à ta BDD, c'est "root", dans l'erreur c'est écrit "test", y'a déjà un soucis quelque part ^^.

test correspond au nom de l'utilisateur qui fait la tâche cron alors que root correspond au nom d'utilisateur qui effectue la BDD.
C'est donc normal que cela ne soit pas les même car ils sont totalement indépendant.

Robinson a dit:
D'ailleurs comment obtiens-tu ces erreurs générées via cron ? dans les logs ? Il n'y a rien d'autre qui précède ?
Lorsque je génère une crontab, je reçois un mail avec les erreurs.

Je viens de faire des tests, c'est pour cela que je suis aussi long à te répondre ;)
ET je pense que j'ai trouvé la cause à mon problème.

Code:
if(isset($_SERVER['SERVER_NAME'])) 
    {
        $nom_serveur = $_SERVER['SERVER_NAME'];
    }

    if($nom_serveur == "localhost")
    {
        $connexion_sql = mysql_connect("localhost", "root", "") or die ('Erreur de connexion à MySQL '.mysql_error()); // Connexion à MySQL
        $bdd_sql = mysql_select_db("nom_base") or die ('Erreur de connexion à la base de données '.mysql_error()); // Sélection de la base
    }
    else if($nom_serveur == "www.site.com")
    {
        $connexion_sql = mysql_connect("site.com", "user", "pwd") or die ('Erreur de connexion à MySQL '.mysql_error()); // Connexion à MySQL
        $bdd_sql = mysql_select_db("nom_base")or die ('Erreur de connexion à la base de données '.mysql_error()); // Sélection de la base
    }
    else
    {
        echo "erreur";
    }

Je fais donc un test pour identifier si je suis en local ou sur mon serveur.
Et lorsque je lance une tâche cron, j'obtiens le message "erreur".
Et $nom_serveur est vide.
Je pense donc que avec cron, on n'obtient pas le nom du serveur.

La nouvelle question est donc : comment faire pour l'obtenir même en lançant une tâche cron.
 

Robinson

WRInaute passionné
C'est normal, cela n'est pas défini via cron mais je doute que cela soit ça qui génère le soucis.

Cependant une solution pour ceci, mettre au préalable :

Code:
if (isset($_SERVER['SHELL'])) { //si exécuté via cron
$_SERVER["SERVER_NAME"] = "localhost";
}
 

Gaulois

Nouveau WRInaute
Salut

Je viens de tester ton "$_SERVER['SHELL']" et çà marche. Il détecte bien qu'il est lancé par cron.
Par contre je ne connais pas du tout cette option de $_SERVER, même sur le site officiel je ne trouve rien, tu as trouvé cela ou?
En connais tu d'autres qui ne marchent que en shell?
Car j'aimerais quand même pouvoir détecter sur quel serveur je suis.

merci de tes réponses tu me fais bien avancé :)

Gaulois
 

Gaulois

Nouveau WRInaute
Merci du lien mais je suis déjà aller voir et on ne parle pas de $_SERVER['SHELL'] à part une petite ligne dans les exemples.
 

Gaulois

Nouveau WRInaute
Je viens de voir et de tester par contre une autre variable dans les exmples : $_SERVER["PWD"].
Elle me donne un chemin : var/www/vhosts/nomsite.com. ce qui est donc ce que je recherche.
Mais pour moi PWD veut dire password alors pourquoi je me retrouve avec le chemin de mon site?
 

ortolojf

WRInaute accro
Sous toutes réserves...

Si tu lances ton script php en mode cli ( c'est-à-dire sans l'appeler à distance par un programme type curl ou wget ), à ce moment-là le répertoire par défaut n'est pas pris en compte, à moins de spécifier dans le script php en amont, de l'include ( si l'include est en relatif ), avec la commande chdir() le répertoire du script php.

C'est indiqué noir sur blanc sur le site du PHP Manual.

Donc, si tacommandes cron est du type: 'php gnangnan /chemin_absolu/script.php', le gnangnan pouvant être le paramètre -f je crois, ou bien si ton script a comme première ligne: #!/bin/php ou /bin/ est le chemin de l'interpréteur php mode cli, le problème semblerait être tel que je l'indique.

Amicalement.

Jean-François Ortolo
 

ortolojf

WRInaute accro
Gaulois a dit:
Robinson a dit:
Je fais donc un test pour identifier si je suis en local ou sur mon serveur.
Et lorsque je lance une tâche cron, j'obtiens le message "erreur".
Et $nom_serveur est vide.
Je pense donc que avec cron, on n'obtient pas le nom du serveur.

La nouvelle question est donc : comment faire pour l'obtenir même en lançant une tâche cron.


Je vous demande pardon ;)

Je n'avais pas lu les récents messages.

Pour avoir le nom du serveur alimenté correctement, ce qui semble obligatoire dans ton cas, il suffit de simuler un accès à distance, avec de préférence la commande curl

Donc... Tu vires la première ligne de ton script php : #!/bin/php ou équivalent si elle existe, puis tu met comme commande cron:

'/chemin_absolu/curl -L http://www.ndd/chemin/script.php'

Le paramètre -L est pour permettre si besoin, jusqu'à 50 redirections de curl ( pas besoin à priori ).

Le mieux est encore de mettre cette ligne dans un script en Bourne Shell:

#!/bin/sh
/chemin_absolu/curl - L "http://www.ndd/chemin/script.php"


En effet, il me semble que des apostrophes sont nécessaires, pour entourer l'url appelée.

Amicalement.

Jean-François Ortolo
 

ortolojf

WRInaute accro
Gaulois a dit:
Je viens de voir et de tester par contre une autre variable dans les exmples : $_SERVER["PWD"].
Elle me donne un chemin : var/www/vhosts/nomsite.com. ce qui est donc ce que je recherche.
Mais pour moi PWD veut dire password alors pourquoi je me retrouve avec le chemin de mon site?


Bonjour

La commande Shell sous Linux pour visualiser le répertoire courant, est: pwd

C'est très simple.

Amicalement.

Jean-François Ortolo
 

Gaulois

Nouveau WRInaute
Je ne vois pas d'endroit ou je peux modifier mon post pour mettre résolu, je peux le faire?

Merci à tous ceux qui m'ont aidé.
 

Discussions similaires

Haut