OVH Community

Bienvenue sur votre espace communautaire. Posez des questions, recherchez des informations, publiez du contenu et interagissez avec d’autres membres OVH Community.

Cron avec un hébergement mutualisé


#1

Bonjour,

J'aimerai exécuter un script php qui scan l'API de World of Warcraft et stock ses données dans un fichier JSON sur mon serveur web. Afin que lorsqu'un utilisateur veut consulter l'API ça ne mette pas plusieurs dixaines de secondes pour charger j'appele donc le fichier JSON généré précédemment. Lorsque je vais sur mon navigateur et je pointe vers mon fichier .php il tourne en boucle jusqu'à arriver à un certains temps 504 Timeout, normal. Je passe donc par Cron pour qu'il s’exécute sans limite de temps, sauf que bah ça ne marche pas :(. (Mon fichier .php a les droits d'accès 0755)

Mon fichier de log :
"[2018-08-08 17:34:02] ## OVH ## START - 2018-08-08 17:34:02.521051 executing: /usr/local/php5.6/bin/php /homez.2094/sylrusfrnr/./www/wow-api/getAuctionsByServer.php
[2018-08-08 17:34:02]
[2018-08-08 17:34:02] ## OVH ## END - 2018-08-08 15:34:02.668728 exitcode: 0"

Merci de votre aide !


#2

Je passe donc par Cron pour qu'il s’exécute sans limite de temps

qui a dit ça? moi je parie que non

exitcode: 0

en tout cas le script sort sans erreur, des erreurs sont elles scriptées?


#3

Ah je pensais que grâce à Cron on s'en fichait du timeout et que c'était juste pour les utilisateurs sur le web. Du coup mon script met plusieurs minutes ~10 à s'exécuter je peux faire comment ? Modifier le fichier php.ini ?

Je ne sais pas, où est-ce que je peux voir ça ?


#4

ah non, si je fait l'hypothèse que tu es sur un hébergement mutualisé, tu n'as pas accès au php.ini et ovh ne permet pas de règler le temps d'exécution d'un script php. donc plusieurs minutes, c'est illusoire.

pour le reste, il faut voir avec l'auteur du script, comment c'est programmé.


#5

Je l'ai fait moi même


#6

http://php.net/manual/fr/language.exceptions.php

tu peux aussi logger dans un fichier toutes les étapes, avec leur résultats intermédiaires, mais à priori là le timeout ne fait aucun doute


#7

Sinon actuellement le script est exécuté par php 5.6, si il est compatible avec php 7, le faire tourner sous php 7.1 ou 7.2 (sous environnement stable et pas legacy) peut faire gagner 30 % en temps d'exécution


#8

Ok c'est fait mais bon dans tous les cas il s'arrête au 6ème fichier json sur une 30aine donc :D (Le script manuel pas via Cron, cron marche toujours pas)


#9

Bonjour,

vous avez lu le guide sur les tâches crons ?
Cf : https://docs.ovh.com/fr/hosting/mutualise-taches-automatisees-cron/

Car il faut faire attention aux chemins absolus.

Cordialement, janus57


#10

le ./ correspond à quoi ? Ai-je besoin de mettre /home etc?


#11

le résultat de votre cron dit que le fichier a tourné mais seulement quelques centième de seconde ...
Il n'y aurait pas un IF ou $_GET (ou équivalent moderne) qui ne marche pas dans l'histoire ?


#12
<?php
$serverjson = file_get_contents("json/server-list.json");
$serverjson = json_decode($serverjson, true);
foreach ($serverjson['servers'] as $field => $valueserv) {
$auctions = file_get_contents("https://eu.api.battle.net/wow/auction/data/". $valueserv['name'] ."?locale=fr_FR&apikey=xxxx);
$auctions = json_decode($auctions, true);
foreach ($auctions['files'] as $field => $valuefile) {
  $jsonlink = $valuefile['url'];
}
$jsonlink = file_get_contents($jsonlink);
$jsonlink = json_decode($jsonlink, true);

foreach ($jsonlink['auctions'] as $field => $valueauctions) {
    if (strpos($valueauctions['owner'], '?') === false) {
        $arrayAuctions[$i] = array('owner' => $valueauctions['owner'], 'item' => $valueauctions['item'], 'buyout' => $valueauctions['buyout'], 'quantity' => $valueauctions['quantity']);
        $i++;
    }
}
$formattedData = json_encode(array('auctions' => $arrayAuctions));
$filename = 'json/EU-'.$valueserv['name'].'.json';
$handle = fopen($filename,'w+');
fwrite($handle,$formattedData);
fclose($handle);
}
?>

Voici le code rien de plus compliqué j'ai juste masqué l'api key au cas où ;)


#13

de memoire, il vaut mieux mettre le chemin absolu et pas relatif.


#14

Ah bon ? Car ça marche très bien quand je vais sur mon navigateur, juste ça me timeout au bout de 3 minutes tandis que le cron bah il veut rien savoir :/


#15

Bonjour,

il faut bien comprendre que c'est pas le même environnement si c'est un cron ou si c'est un visiteur qui visite la page, d'où le fait de lire la documentation des crons.

Vu que les crons sont sur des serveur à part les limite de temps sont plus grande, et il y a d’autres spécifications lié à ça.

Cordialement, janus57


#16

plusieurs minutes ~10

cron , 10 mn de temps d'exécution...?

il faut bien se rendre compte que cron exécute un script sans savoir "pour qui il travaille", d'où les chemins absolus indiqués dans ce fil

./ indique un relatif par rapport au répertoire courant, et là justement, cron il sait pas.
imagine qu'il tourne dans /root au lieu de /home/tonCompte/www
il faut donc l'aider


#17

Ok ça fonctionne +/- il y a écrit sur la doc ovh que le cron peut tourner pendant 60 minutes mais ça s'arrête comme en version web c'est-à-dire au bout de 3 minutes, normal ?


#18

pour le moment le cron n'a pas dépassé 1 seconde d'après les logs (surement à cause du chemin relatif)

[2018-08-08 17:34:02] ## OVH ## START - 2018-08-08 17:34:02.521051 executing: /usr/local/php5.6/bin/php /homez.2094/sylrusfrnr/./www/wow-api/getAuctionsByServer.php
[2018-08-08 17:34:02]
[2018-08-08 17:34:02] ## OVH ## END - 2018-08-08 15:34:02.668728 exitcode: 0"

outre le changement de fuseau horaire, le code a tourné 127 millisecondes ...


#19

J'ai ça maintenant :

[2018-08-08 19:49:14] ## OVH ## START - 2018-08-08 19:49:14.714248 executing: /usr/local/php7.2/bin/php /homez.2094/sylrusfrnr/./www/wow-api/getAuctionsByServer.php
[2018-08-08 19:49:14]
[2018-08-08 19:49:14] ## OVH ## END - 2018-08-08 18:04:22.885282 exitcode: 255


#20

le cron a donc tourné pendant 15 min et 8 sec ... (20h04min22s - 19h49m14s)

Après c'est votre script, c'est à vous de savoir ce qu'il a fait pendant ce temps ...