Problème avec tâche planifiée Windows [Résolu]

m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 20 juin 2011 à 12:14 - Dernière réponse : cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

18 réponses

cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 22 juin 2011 à 09:47
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 juin 2011 à 13:46
0
Utile
Ce ne serait pas un problème de COMMIT ?
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 20 juin 2011 à 13:52
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 juin 2011 à 14:24
0
Utile
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.
Commenter la réponse de cs_Julien39
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 juin 2011 à 14:27
0
Utile
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.
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 20 juin 2011 à 14:39
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 juin 2011 à 14:48
0
Utile
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 ?
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 20 juin 2011 à 15:45
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 20 juin 2011 à 15:54
0
Utile
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.
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 20 juin 2011 à 20:28
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 21 juin 2011 à 08:52
0
Utile
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.
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 21 juin 2011 à 15:48
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 21 juin 2011 à 16:29
0
Utile
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.
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 21 juin 2011 à 17:23
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 22 juin 2011 à 08:29
0
Utile
Il faut mettre le mysql_query("COMMIT") après que tu ais soumis tes deux requetes pour les valider.
Commenter la réponse de cs_Julien39
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 22 juin 2011 à 09:54
0
Utile
Merci Julien
C'est ok justement je souhaitais garder cette solution.

Merci bcp
Cordialement


Google never dies...
Commenter la réponse de m_abdlmalek
m_abdlmalek 21 Messages postés mardi 16 janvier 2007Date d'inscription 5 septembre 2011 Dernière intervention - 22 juin 2011 à 12:34
0
Utile
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...
Commenter la réponse de m_abdlmalek
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 22 juin 2011 à 12:45
0
Utile
Je suis content que tu ais trouvé une solution.

a+
Commenter la réponse de cs_Julien39

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.