Tâches automatiques (cron) - Mon CRON ne fonctionne pas
... / Mon CRON ne fonctionne pas
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
Frage

Mon CRON ne fonctionne pas

Von
KevinD
Erstellungsdatum 2016-10-20 21:18:22 (edited on 2024-09-04 12:13:21) in Tâches automatiques (cron)

Bonjour,

Nous avons créé des tâches CRON sur OVH, mais les mails n'arrivent pas :

Voici les logs d'erreur OVH du CRON :

[QUOTE][2016-12-29 18:12:02] ## OVH ## START - 2016-12-29 18:12:02.903724 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/www/tacheCron/ristourne.php
[2016-12-29 18:12:02]
[2016-12-29 18:12:02]
[2016-12-29 18:12:02]
[2016-12-29 18:12:02] Test de Cron
[2016-12-29 18:12:02]
[2016-12-29 18:12:02]
[2016-12-29 18:12:02]
[2016-12-29 18:12:02] ## OVH ## END - 2016-12-29 18:12:03.009896 exitcode: 255
[2016-12-29 18:12:02]
[2016-12-29 18:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 18:12:02] ## OVH ## END - 2016-12-29 18:12:03.010710 exitcode: 255
[2016-12-29 19:12:02] ## OVH ## START - 2016-12-29 19:12:02.707878 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/tacheCron/ristourne.php
[2016-12-29 19:12:02]
[2016-12-29 19:12:02]
[2016-12-29 19:12:02]
[2016-12-29 19:12:02] Test de Cron
[2016-12-29 19:12:02]
[2016-12-29 19:12:02]
[2016-12-29 19:12:02]
[2016-12-29 19:12:02] ## OVH ## END - 2016-12-29 19:12:02.756471 exitcode: 255
[2016-12-29 19:12:02]
[2016-12-29 19:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 19:12:02] ## OVH ## END - 2016-12-29 19:12:02.757204 exitcode: 255
[2016-12-29 20:12:02] ## OVH ## START - 2016-12-29 20:12:02.755897 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/tacheCron/ristourne.php
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02] Test de Cron
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02]
[2016-12-29 20:12:02] ## OVH ## END - 2016-12-29 20:12:03.224268 exitcode: 255
[2016-12-29 20:12:02]
[2016-12-29 20:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 20:12:02] ## OVH ## END - 2016-12-29 20:12:03.225044 exitcode: 255
[2016-12-29 21:12:02] ## OVH ## START - 2016-12-29 21:12:02.616244 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/tacheCron/ristourne.php
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02] Test de Cron
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02]
[2016-12-29 21:12:02] ## OVH ## END - 2016-12-29 21:12:02.669607 exitcode: 255
[2016-12-29 21:12:02]
[2016-12-29 21:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 21:12:02] ## OVH ## END - 2016-12-29 21:12:02.670369 exitcode: 255
[2016-12-29 22:12:02] ## OVH ## START - 2016-12-29 22:12:02.683366 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/tacheCron/ristourne.php
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02] Test de Cron
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02]
[2016-12-29 22:12:02] ## OVH ## END - 2016-12-29 22:12:02.734003 exitcode: 255
[2016-12-29 22:12:02]
[2016-12-29 22:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 22:12:02] ## OVH ## END - 2016-12-29 22:12:02.734771 exitcode: 255
[2016-12-29 23:12:02] ## OVH ## START - 2016-12-29 23:12:02.661073 executing: /usr/local/php7.0/bin/php /homez.2193/likemywora/./www/tacheCron/ristourne.php
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02] Test de Cron
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02]
[2016-12-29 23:12:02] ## OVH ## END - 2016-12-29 23:12:02.733093 exitcode: 255
[2016-12-29 23:12:02]
[2016-12-29 23:12:02] ## OVH ## Your job could not be initiated for an unknown reason. Please contact customer support for more information.
[2016-12-29 23:12:02] ## OVH ## END - 2016-12-29 23:12:02.733828 exitcode: 255
[/QUOTE]

Et voici le code du fichier PHP qui est censé s'exécuter :

[CODE]


Test de Cron




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.code_evaluation, 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) = 10
and fac.visible = 1";
$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 = '


image


Rappel de payement




Voici le 1er rappel de payement concernant la demande de ristourne de votre client '.$resultat->nom_client.' '.$resultat->prenom_client.'.


Veuillez noter que dès réception de votre payement, nous rétribuerons 2 % à '.$resultat->prenom_client.' pour avoir contribué à l’évolution de votre profil.


Les 3% à verser à LikeMyWork : ' . number_format($troisPoucentAvecTva, 2, ',', '.') . ' EUR TVAC,
Les 2% pour le client : ' . number_format($deuxPourcentPourClient, 2, ',', '.') . ' EUR,
Ce qui fait un total de : ' . number_format($pourcentageTotal, 2, ',', '.') . ' EUR sur un montant de '.number_format($resultat->montant_htva, 2, ',', '.').' EUR


Communication à mentionner sur le virement: '.$resultat->code_evaluation.'



Compte en banque de LikeMyWork: BE70-3770-8002-3825




L\'équipe LikeMyWork











';

$mail->AddAddress($email);
$mail->send();
}
?>

[/CODE]

Voici le contenu du fichier .ovhconfig :

[CODE]; pour plus d'informations sur ce fichier:
; http://www.ovh.com/fr/g1175.format_du_point_ovhconfig

app.engine=php
app.engine.version=7.0
http.firewall=none
environment=production
[/CODE]

Auriez-vous une idée svp ?

Merci d'avance et bonnes fêtes.


11 Antworten ( Latest reply on 2017-01-07 17:58:49 Von
BorisM
)

Mauvaise idée les chemins relatifs.

```
require_once("../vendor/autoload.php");
require_once ('../config/ConnexionDB.php');
```

A tout hasard, et avec :
```
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../config/ConnexionDB.php');
```
? (quelqu'un disait que le répertoire courant aurait été changé en cli/cron)

Mais je suppose que, si ça vient de ça, l'autoload, va foirer aussi de la même façon. Dans ce cas, c'est plutôt un `chdir(__DIR__);` qu'il faudrait ajouter avant les require.

Je dirais carrément /home/[user]/vendor/autoload.php

Comme le dit @Daniel60 et la doc : https://docs.ovh.com/fr/fr/web/hosting/mutualise-taches-automatisees-cron/#utilisation-de-chemins-absolus

il faut utiliser les chemins absolus.

Puisque tu utilises php 7.0 je te conseille de passer aussi en environnement stable
https://docs.ovh.com/fr/fr/web/hosting/modifier-lenvironnement-dexecution-de-mon-hebergement-web/


'/../vendor/autoload.php'

On peut toujours prendre le risque d'utiliser des chemins relatifs, mais celui-là ne marchera sûrement pas car tu vas chercher un répertoire qui est à coté de ton niveau le plus élevé, donc pas chez toi. Donc "../" peut-être que ça marche, bien que déconseillé, mais sûrement pas "/../"


On peut toujours prendre le risque d'utiliser des chemins relatifs


Non, car les crons ne sont pas exécutés sur l'hébergement, mais sur un serveur à part, donc si on met un chemin relatifs, les robots ne vont rien trouver.

Quitte à me citer, ce serait bien de reprendre le `__DIR__` concaténé devant : ce n'est pas cherché à remonter plus haut que la racine (à moins vraiment d'un chroot sur le répertoire du script) et le chemin n'est plus vraiment relatif. Enfin si mais plus par rapport au répertoire courant qu'on hérite de cron mais à ce qui est concaténé devant, le répertoire même du script (ie, si mon script est /home/toto/www/foo/bar.php, `__DIR__` vaut `/home/toto/www/foo` donc `__DIR__ . '/../config/db.php'` équivaut à `/home/toto/www/foo/../config/db.php` soit `/home/toto/www/config/db.php`).

Pourquoi hardcoder un chemin quand on peut le retrouver dynamiquement (via `__DIR__`) ? Pas mieux pour rendre son code portable/réutilisable. En plus c'est la solution donnée dans le doc OVH (aux 2 `_` manquants près - c'est `__DIR__`, non `_DIR_`).

Quitte à insister :smiling_imp:
Tout dépend de ce contient la variable `__DIR__` . En CRON rien ne te dit qu'elle correspond au répertoire du script.
Si tu regarde les logs tu verras que l’exécution va chercher ton script par une adresse absolue.
Donc il faut coder en dur, tant pis pour les paranos.

Ce n'est pas une variable mais une constante et elle est gérée par PHP lui-même.

> En CRON rien ne te dit qu'elle correspond au répertoire du script.

Parce qu'elle pourrait valoir quoi alors selon toi pour être fausse ? Dans quelles circonstances ?

> Si tu regarde les logs tu verras que l’exécution va chercher ton script par une adresse absolue.

Peu importe, ça n'a strictement aucune influence sur `__DIR__` : PHP résoudra quoi qu'il arrive le chemin du script en chemin absolu. (au même titre que `__FILE__`)

Lesdits robots ne sont quand même pas des parseurs PHP minimaux qui extraient (copient) les scripts des (require|include)(_once)? et ne savent gérer que des chemins absolus ? Dès lors tout autoload en serait inutilisable en cron (le chemin de l'inclusion étant dynamique). Pas non plus de chroot sur ce qui correspondrait à `__DIR__`, empêchant ainsi d'aller chercher des scripts situés plus haut ou dans un répertoire parallèle/frère ?


Parce qu'elle pourrait valoir quoi alors selon toi pour être fausse ? Dans quelles circonstances ?


Parce que c'est une constante... variable :laughing:

Le comportement actuel des scripts en CRON n'a pas toujours été le même à ce sujet et il a fallu que je les révise en passant en stable si j'ai bonne mémoire.
Maintenant rien ne t'empêche :
- de tester le retour de ` __DIR__`
- d'émettre un vœu pour un traitement conforme à tes désirs (vœu auquel je souscris volontiers)
Bonne continuation.


Tout dépend de ce contient la variable \_\_DIR\_\_ . En CRON rien ne te dit qu'elle correspond au répertoire du script.

la constante php \_\_FILE\_\_ contient le chemin absolu du fichier dans lequel elle est appelée
la constante php \_\_DIR\_\_ est un équivalent de dirname(\_\_FILE\_\_)

la façon de faire que propose toto fonctionnera toujours.

Antworten sind derzeit für diese Frage deaktiviert.