Problème avec tâche planifiée Windows

Résolu
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011 - 20 juin 2011 à 12:14
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 22 juin 2011 à 12:45
Bonjour,

Je souhaite lancer sur mon site un script PHP régulièrement (chaque jour exactement) à 00h00 et en Mode Admin (c'est à dire le lancer par le site lui-même et pas par les utilisateurs).

J'ai donc créé le script PHP, ainsi qu'un fichier .BAT de la manière suivante :

Code Script.BAT :
@echo off
c:\chemin\vers\php.exe c:\chemin\vers\script.php

Code Script.Php :
<?php
$sql='Ma_requete_sql_de_nettoyage';
$req=mysql_query($sql);
?>


Tâche planifiée :
- Entrez un nom pour cette tâche. Ce nom peut être celui du programme :
* Script.BAT
- Tous les jours
- Heure de début 00h00
- Date de début : Date de lancement site
- Nom utilisateur, mot de passe : celui de ma session Admin Windows XP

Résultat:
Pourtant je ne vois pas de résultat.
Normalement la requête devrait supprimer des lignes avec un champ date datant de plus de 24H.

Je vois par contre bien une fenêtre MS-DOS au moment du lancement

SVP help me whats wrong there ????
Merci d'avance

Google never dies...

18 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 juin 2011 à 09:47
Hier, j'ai du lire ton code en diagonale, et finalement, la boucle infinie avec un sleep c'est ce que je te proposait de faire en batch mais en php c'est même mieux.

Par contre, augmente la temporisation pour que ton script soit exécuté moins souvent.

Je pense même que tu n'as pas besoin de bat pour faire tourner ca.

Je ne connais pas de méthode qui permet d'exécuter un script au démarrage du serveur (ca ne veut pas dire qu'il n'en existe pas)
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 juin 2011 à 13:46
Ce ne serait pas un problème de COMMIT ?
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
20 juin 2011 à 13:52
Bonjour,

merci julien pour ta réponse.
Mais pourquoi j'aurais besoin d'un COMMIT je commence tous mes scripts PHP de façon pareille j'ai jamais eu de problème.

Le problème serait donc dans le langage PHP pas dans la requête MySQL ?

Cordialement

Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 juin 2011 à 14:24
Si les requêtes de modification de la base fonctionnent alors tu dois avoir un auto-commit (c'est souvent le cas).

Peux tu nous donner ta requête de nettoyage, c'est elle qui doit poser problème.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 juin 2011 à 14:27
Ce que tu peux faire dans ton fichier bat c'est de mettre des echo %errorlevel% pour voir si tout fonctionne bien et également afficher les erreurs éventuelles.
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
20 juin 2011 à 14:39
Bonjour

Ok la voilà :

<?php
$sql1='DELETE * FROM table_1 WHERE Date > DATE_SUB(NOW(),INTERVAL 24 HOUR)';
$sql2='DELETE * FROM table_2 WHERE Date > DATE_SUB(NOW(),INTERVAL 24 HOUR)';

$req1 = mysql_query($sql1);
$req2 = mysql_query($sql2);
?>

Sincèrement au premier abord aucun problème avec cette requête...Si ?

Merci

Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 juin 2011 à 14:48
A priori non.

Tu as essayé une de ces requêtes dans une invite de commande SQL.

Tu ne l'as pas écrit ici mais tu initialise bien ta connexion à la base de données avant de faire ces requêtes ?
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
20 juin 2011 à 15:45
Oops...:-O :-O :-O :-O :-O
Bien joué Julien !

Quelle bêtise
Je bosse sur ce projet depuis Mars 2011, j'ai jamais fait de SQL sans connexion mysql et là bêtement je l'ai oublié

je teste ce soir en revenant du boulot
C'est sûrement çà

Merci Bcp
Cordialement


Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 juin 2011 à 15:54
Je te l'ai dit mais vraiment je ne croyais pas que c'était ca.

Le pire c'est que c'est tellement simple qu'on y pense pas.
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
20 juin 2011 à 20:28
Re Julien,

Aïaiaie !!!!!!!
C'est çà effectivement puisque maintenant les Pages en .PHP marchent bien et donnent le résultat attendu quand je les lance en Easyphp (depuis Apache)...

Mais quand je demande aux taches de lancer les .BAT contenant les instructions d'ouverture du script PHP avec le php.exe, çà marche pas j'ai pas de résultat...

Pour éviter une erreur je te donne l'intégralité des codes complets, j'ai changé que les noms le principe est le même :

Nettoyage.php
<?php
$base = mysql_connect ('localhost', 'Login', 'Motdepasse');
mysql_select_db ('Nom_de_la_base', $base);
$sql1="DELETE FROM table_1 WHERE Date NOT BETWEEN (NOW( ) - INTERVAL 1 DAY) AND NOW()";
$sql2="DELETE FROM table_2 WHERE Date NOT BETWEEN (NOW( ) - INTERVAL 1 DAY) AND NOW()";

$req1 = mysql_query($sql1);
$req2 = mysql_query($sql2);
mysql_close();
?>


Son rôle est de nettoyer des lignes avec une date datant de plus de 24h.

Miseajour.php
<?php
$base = mysql_connect ('localhost', 'Login', 'Motdepasse');
mysql_select_db ('Nom_base', $base);
$sql001='UPDATE table_3 SET Champ1=Champ1-1, Champ2=Champ2-1';
$req001 = mysql_query($sql001);
mysql_close();
?>


Son rôle est de retirer une unité de 2 champs numériques chaque jour.

Script Miseajour.BAT
@echo off
C:\EasyPHP-5.3.5.0\php\php.exe C:\EasyPHP-5.3.5.0\www\Miseajour.php

Script Nettoyage.BAT
@echo off
C:\EasyPHP-5.3.5.0\php\php.exe C:\EasyPHP-5.3.5.0\www\Nettoyage.php

Et bien sûr 2 taches planifiées qui lancent les .BAT

Stp Julien où est le problème à ton avis

Cordialement

Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 juin 2011 à 08:52
Qu'est ce que tu entends par "çà marche pas" : une erreur ou rien ne se passe ?

Si rien ne se passe essayes de faire mysql_query("COMMIT"); à la fin même si vu ce que tu m'as dit, ca ne va pas changer grand chose mais on ne sait jamais.
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
21 juin 2011 à 15:48
Bonjour,

Oui en fait voilà rien ne se passe...
Une commande MSDOS qui se ferme juste après avoir été ouverte pour chaque .BAT et c'est tout

Sinon je le mets où le mysql_query("COMMIT")à quel niveau exactement ?

Par ailleurs j'ai trouvé un autre truc une sorte de "Script PHP éternel" un bout de code sur le web le reste j'ai adapté, le seul hic c'est qu'il faut le lancer une première fois manuellement au démarrage de EasyPHP mais l'avantage c'est que comme les TP çà ne s'arrête jamais en arrière plan même après avoir fermé la page PHP...

J'ai testé hier même la fermeture de la page c'était pas mal çà a fait la plupart de ce que je demandais.
Si tu peux stp les expertiser s'il y a des inconvénients à cette méthode :

<?php
set_time_limit(0);
ignore_user_abort(1);
while(1){$base = mysql_connect ('localhost', 'login', 'mdp');
mysql_select_db ('mabase', $base);
$sql1="DELETE FROM table1 WHERE Date NOT BETWEEN (NOW( ) - INTERVAL 1 DAY) AND NOW()";
$sql2="DELETE FROM table2 WHERE Date NOT BETWEEN (NOW( ) - INTERVAL 1 DAY) AND NOW()";

$req1 = mysql_query($sql1);
$req2 = mysql_query($sql2);
mysql_close();
sleep(86400);}
?>


<?php
set_time_limit(0);
ignore_user_abort(1);
while(1){$base = mysql_connect ('localhost', 'login', 'mdp');
mysql_select_db ('mabase', $base);
$sql001='UPDATE table3 SET Champ1=Champ1-1, Champ2=Champ2-1';
$req001 = mysql_query($sql001);
mysql_close();
sleep(86400);}?>


Par contre ce serait le TOP s'il y avait moyen de l' "enregistrer" pour forcer EasyPHP à la lancer au démarrage ? (et permettre aussi de la supprimer faudrait pas non plus se la coltiner éternellement sans pouvoir faire évoluer le système...), peut-être la fameuse histoire de register_shutdown_function() ?

Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 juin 2011 à 16:29
Je n'ai pas trop le temps de regarder ce soir, je regarderai demain (poste un message si je ne publie rien avant midi).

Il me semble qu'une boucle infinie c'est pas génial, ca va surcharger inutilement ton serveur. Je me demande si le faire en php c'est une bonne idée, tu peux tout faire avec ton .bat. Et il existe des fonction sleep() à mettre dans ton .bat pour effectuer la tache périodiquement. si tu veux laisser la console windows ouverte tu peux ajoute un pause à la fin de ton script. et place un @echo off au début pour qu'il ne t'imprime pas les commandes.

Je regarde tout ca demain et je te redis ca.
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
21 juin 2011 à 17:23
Ok j'attends donc ta réponse demain

Sinon tu m'as pas dit ou mettre le mysql_query("COMMIT") à quel niveau exactement ?

Et est-ce qu'utiliser un .BAT avec un sleep implique que la commande MSDOS doit rester ouverte en permanence ?

Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 juin 2011 à 08:29
Il faut mettre le mysql_query("COMMIT") après que tu ais soumis tes deux requetes pour les valider.
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
22 juin 2011 à 09:54
Merci Julien
C'est ok justement je souhaitais garder cette solution.

Merci bcp
Cordialement


Google never dies...
0
m_abdlmalek Messages postés 21 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 5 septembre 2011
22 juin 2011 à 12:34
Finalement j'ai fait encore mieux : j'ai associé ces scripts à des boutons input "submit" pour les lancer depuis une Console d'Administration pour éviter de le faire à la volée .

Après clic sur les boutons je ferme juste les pages et ils tournent tous seuls en permanence tant que le serveur est allumé...

Merci pour ta patience c'est une grande réussite
Cordialement


Google never dies...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 juin 2011 à 12:45
Je suis content que tu ais trouvé une solution.

a+
0
Rejoignez-nous