[RESOLU] Cron php

Petit nouveau ! | 9 Messages

16 déc. 2015, 11:10

Bonjour à tous,

j'ai dernièrement mis en place un script php qui génère un fichier csv.
ce script fonctionne très bien lorsque je l'appelle dans un navigateur.
J'ai ensuite demandé à ma DSI de programmer un cron : résultat ça ne fonctionne pas !
du coup plusieurs interrogations ? ai je oublié quelque chose dans mon script ?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// la variable qui va contenir les données CSV
$outputCsv = '';

// Nom du fichier final
$fileName = 'villes_'.date('Y_m_d').'.csv';

$requete = "requete")
";
$sql = mysql_query($requete);
if(mysql_num_rows($sql) > 0)
{
$i = 0;

while($Row = mysql_fetch_assoc($sql))
{
$i++;

// Si c'est la 1er boucle, on affiche le nom des champs pour avoir un titre pour chaque colonne
if($i == 1)
{
foreach($Row as $clef => $valeur)
$outputCsv .= trim($clef).';';

$outputCsv = rtrim($outputCsv, ';');
$outputCsv .= "\n";
}

// On parcours $Row et on ajout chaque valeur à cette ligne
foreach($Row as $clef => $valeur)
$outputCsv .= trim($valeur).';';

// Suppression du ; qui traine à la fin
$outputCsv = rtrim($outputCsv, ';');

// Saut de ligne
$outputCsv .= "\n";

}

}
else
exit('Aucune donnée à enregistrer.');

// Entêtes (headers) PHP qui vont bien pour la création d'un fichier Excel CSV
// header("Content-disposition: attachment; filename=".$fileName);
// header("Content-Type: application/force-download");
// header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
// header("Pragma: no-cache");
// header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
// header("Expires: 0");

file_put_contents("FICHIERS/$fileName", $outputCsv);

echo $outputCsv;


exit();
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 déc. 2015, 11:57

Bonjour,

Est-ce que ton script fonctionne :
- quand tu l'appelles via son url dans le navigateur ?
- quand tu l'appelles en ligne de commande (avec l'instruction php), sans passer par le cron ?

Si la réponse est oui à l'une ou l'autre de ces questions, c'est que ton script fonctionne et que le problème se situe dans les droits du script, de l'utilisateur qui l'appel ou dans la tâche cron elle même :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 9 Messages

16 déc. 2015, 12:02

Bonjour,

oui il fonctionne quand je fais appelle à partir du navigateur, par contre je ne peux pas le tester en ligne de commande car je n'ai pas les droits sur le serveur.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 déc. 2015, 13:27

Je pense donc qu'il s'agit bien d'un problème de paramétrage du cron (à voir avec ta DSI ce qu'ils ont paramétré, s'ils ont un message d'erreur lors de l'exécution de la tâche ?) ou bien un problème de droits d'exécution.

En effet, le serveur web qui exécute php a les droits d'exécution et d'écriture pour la génération de ton fichier. Ce n'est pas nécessairement le cas de " l'utilisateur " à partir duquel le cron s'exécute et il est parfois nécessaire d'ajuster ses droits.

As-tu accès où peux tu demander les logs d'erreurs de php ? tu en sauras sans doute d'avantage sur ce qui pose réellement problème :)


Ps : sebastien.lelarge de l'ECE ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 9 Messages

16 déc. 2015, 14:22

merci pour ton retour.

c'est quoi ECE ?

Petit nouveau ! | 9 Messages

12 janv. 2016, 09:58

Bonjour,

Après analyse il s'avère que le CRON fonctionne lorsque je place un lien absolue

exemple :
$filename = '../FICHIERS/villes_'.date('Y_m_d').'.csv'; -----> ne fonctionne pas
$filename = 'var/html/crm/FICHIERS/villes_'.date('Y_m_d').'.csv'; ----> fonctionne

ma dsi prétextant des histoires de sécurité, je dois trouver un solution, quelqu'un aurait une idée ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 janv. 2016, 11:28

Bonjour,

La constante __FILE__ te donne le chemin absolu vers le script exécuté. A l'aide de la fonction dirname() tu peux extraire le répertoire dans lequel se trouve ton script et t'en servir comme base pour ensuite utiliser un chemin relatif :
$filename = dirname(__FILE__) . '/../FICHIERS/villes_' . date('Y_m_d') . '.csv'; 
// faire un echo $filename pour vérifier que le chemin est bon et l'ajuster au besoin :)
Tu peux ainsi utiliser cette méthode sans avoir à spécifier explicitement le chemin absolu dans ton code source (php ira le chercher, même si ton application est déplacée ou renommée), ce qui devrait satisfaire ta dsi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 9 Messages

13 janv. 2016, 12:13

C'est parfait, ca fonctionne, merci beaucoup !!!!
bonne journée