CRON OVH ne fonctionennt qu'en manuels

Fermé
beegees Messages postés 83 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 1 janvier 2018 - 31 déc. 2016 à 09:55
 Utilisateur anonyme - 5 janv. 2017 à 09:24
Bonjour,

Nous avons développé un site et nous avons créé des tâches CRON sur OVH.

Le problème est que manuellement, c'est-à-dire en mettant l'adresse monsite/test_cron.php, ça fonctionne ,le mail s'envoie correctement.

Mais automatiquement, ça ne s'envoie pas...

Voici le log d'erreur :

[2016-12-30 19:52:03] ## OVH ## START - 2016-12-30 19:52:03.669028 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/lmw_dev/ristourne2.php
[2016-12-30 19:52:03] <html>
[2016-12-30 19:52:03] <head>
[2016-12-30 19:52:03] <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
[2016-12-30 19:52:03] <title>Test de Cron</title>
[2016-12-30 19:52:03] </head>
[2016-12-30 19:52:03] <body>
[2016-12-30 19:52:03]
[2016-12-30 19:52:03]
[2016-12-30 19:52:03]
[2016-12-30 19:52:03] ## OVH ## END - 2016-12-30 18:52:03.762721 exitcode: 255
[2016-12-30 19:52:03]
[2016-12-30 19:52:03] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.

Comme vous pouvez le voir, nous avons un exitcode 255.

J'ai contacté OVH qui nous a donné cette réponse :

Au niveau des logs CRON de votre hébergement, l'exitcode a pour valeur 255 à
18h12 hier soir.

Cela signifie que l'url d'appel du CRON n'est pas renseignée avec le chemin
absolue et ne parviens par conséquent pas à s'exécuter correctement.

Nous avons pourtant donné un full control 777 au fichier et le nom du path est correct (normalement).

Merci d'avance pour votre aide et bon réveillon pour ce soir.

A voir également:

3 réponses

Bonjour

Je suis utilisateur de cron chez OVH et je reconnais que ce n'est pas forcément évident.
Les scripts sous cron ne s'exécutent pas dans le contexte habituel de la réponse à une requête HTTP. Entre autres conséquences, le chemin courant n'est PAS le document_root habituel, donc les chemins relatifs comme dans
require_once("../vendor/autoload.php");
ne marchent pas. D'une manière générale, tout ce qui est lié à http ne marche pas.
J'utilise actuellement deux techniques selon les crons pour contourner ce problème :
1 - Une savante analyse du chemin du fichier qui contient le script à partir de
dirname(__FILE__);
pour retrouver le chemin absolu.
2 - technique de fainéant : un script minimaliste qui fait juste un 'curl' vers l'url du 'vrai' script. Ce 'vrai' script s'exécute alors dans le contexte habituel, et il n'y a pas de mauvaises surprises.

Remarque 1 : mes crons marchent très bien, mais les logs m'indiquent systématiquement un compte-rendu d'erreur après un premier compte-rendu positif, quelle que soit la technique 1 ou 2 utilisée. exemple :
[2016-11-18 13:50:02] ## OVH ## START - 2016-11-18 13:50:02.741225 executing: /usr/local/php5.6/bin/php /homez.501/wkzwucfv/www/niveau/niveau2.php 
[2016-11-18 13:50:02]
[2016-11-18 13:50:02] ## OVH ## END - 2016-11-18 13:50:03.180433 exitcode: 0
[2016-11-18 13:50:02]
[2016-11-18 13:50:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-11-18 13:50:02] ## OVH ## END - 2016-11-18 13:50:03.186628 exitcode: 255

Remarque 2 : Il y a un '.' avant le www dans le chemin de tes fichiers qu'on peut lire dans ton log. Je suppose que dans la définition du cron, tu as mis ./www/... ; il faut mettre directement www/...

Remarque 3 : es-tu sûr de ton script de mail ? Si tu as le moindre doute, il vaut mieux commencer par quelque chose de plus simple pour tester l'aspect purement cron. Ceci dit, j'envoie des mails avec phpmailer dans mes crons, donc ça peut marcher.
3
Utilisateur anonyme
1 janv. 2017 à 15:23
Complément : technique numéro 2 du fainéant : voici l'intégralité du script avec curl (pas de ?> à la fin, c'est exprès) :
<?php
$cp=curl_init("http://tondomaine.fr/tonscript.php");
curl_setopt($cp,CURLOPT_RETURNTRANSFER,TRUE);
$x=curl_exec($cp);
curl_close($cp);
0
beegees Messages postés 83 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 1 janvier 2018 7 > Utilisateur anonyme
5 janv. 2017 à 06:21
Salut et bonne année à toi,

Je te remercie pour ta réponse.

Finalement, c'était juste un problème de require (il faut utilsier __DIR__).

Merci d'avoir pris le temps de répondre à mon psote et merci pour les détails supplémentaires.
0
Utilisateur anonyme > beegees Messages postés 83 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 1 janvier 2018
5 janv. 2017 à 09:24
De rien :-)

Et merci à toi de me rappeler que je peux utiliser __DIR__, qui est la même chose que le dirname(__FILE__) que j'utilise, mais en plus simple.
Ce n'est pas un problème de require, c'est un problème dont tu te rends compte en utilisant require, ce qui est très différent. require fonctionne tout à fait normalement, seulement le répertoire par défaut change avec le contexte d'exécution du cron.
0
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
31 déc. 2016 à 12:15
Bonjour
Ton script contient quoi ?
Tu y appeles d'autres fichiers ? En chemin relatifs (et donc non absolu...) peut être. ..
1
beegees Messages postés 83 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 1 janvier 2018 7
31 déc. 2016 à 12:22
Bonjour Jordane,

Merci pour ta réponse.

Voici le code du script :


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test de Cron</title>
</head>
<body>


<?PHP
require_once("../vendor/autoload.php");
require_once ('../config/ConnexionDB.php');
$managerFacture = new ManagerFacture($pdo);
/*$req = "SELECT pro.email FROM facture fac, professionnel pro WHERE fac.num_confidentiel_pro = pro.code_confidentiel "
. "and fac.date <= DATE_SUB( NOW(), INTERVAL 1 Hour) and pro.id_professionnel = 34 and `visible` = 0` ";*/
$req ="SELECT pro.email, fac.nom_client, fac.prenom_client,fac.montant_htva, fac.mail_client, fac.date, fac.num_confidentiel_pro
FROM facture fac, professionnel pro
WHERE fac.num_confidentiel_pro = pro.code_confidentiel
and TO_DAYS(NOW()) - TO_DAYS(fac.date) = 3
and fac.visible = 0 ";
$resultats=$pdo->query($req);
$resultats->setFetchMode(PDO::FETCH_OBJ);

while( $resultat = $resultats->fetch() )
{

$email = $resultat->email;
/* echo $email ;*/
//On crée une instance de la classe PHPMailer.
$mail = new PHPMailer();
//On change le charset.
$mail->CharSet = 'UTF-8';
//On précise que le contenu sera du code html.
$mail->IsHtml(true);
//On précise de qui vient l'email.
$mail->setFrom("LikeMyWork@noreply.be", "LikeMyWork");
//On change le sujet du mail.
$mail->Subject = "1er rappel d'acceptation de formulaire de ristourne.";
//On modifie son contenu avec l'adresse mail du client ainsi que le contenu du message du client.
$mail->Body = '
<div style="position: relative; border-bottom-width: 20px ;border-right-width: 20px ;border-left-width: 20px ;border-top-width: 65px ; border-style: solid; border-color: #555; border-radius: 10px; padding: 20px 30px 60px 30px; margin:auto; max-width: 800px; width: 100%; box-sizing: border-box; background: #EEE">
<img style="position: absolute; left: 25px; top: -60px" src=""quot;http://likemywork.be/images/logo.png" width="150" height="52"/><br/>

<h1 style="text-align: center; color: #3FA9F5; font-weight: bold">Rappel 1</h1><br/>

<p>Nous constatons que vous ne vous êtes pas encore manifesté suite à la demande de confirmation
du formulaire de ristourne de votre client '.$resultat->nom_client.' '.$resultat->prenom_client.'.</p>
<p>Merci de donner suite à ce mail en vous connectant sur lmw afin de confirmer vos demande de ristourne.</p>


<hr>
<div style="text-align: center; color: #3FA9F5">
<p><b><a href="http://likemywork.be/" rel="nofollow noopener noreferrer" target="_blank">www.likemywork.be</a></b></p>
</div>
</div>';

$mail->AddAddress($email);
$mail->send();
}
?>
</body>
</html>


Tu crois que c'est à cause des require donc ?

J'ai un autre script que voici et qui ne passe également pas :

<?php
// the message
$msg = "Le CRON fonctionne";

// send email
mail("monmail@gmail.com","COOOOOOOLLLLL",$msg);
?>


Encore merci pour ton aide et bon réveillon pour ce soir.
0