Planification sous PHP !?

WRInaute accro
Bonjour,

Je souhaiterai pouvoir planifier des tâches sous PHP, mais je n'ai aucune idée de la faisabilité de la chose.
Etant donné que PHP est interprété uniquement lorsqu'une requête est effectué, j'ai un doute...

Est-il possible par exemple, d'envoyer une newsletter à une période donnée ?
 
WRInaute impliqué
Le php est disponible aussi en ligne de commande.

Il y a même une extension dévelopée pour ( CLI : command ligne interface).

Cependant le module CGI convient tout à fait : tu as juste à faire précéder ton code php d'une ligne, qui contient le chemin vers l'interprêteur php

En général sous linux , ça se traduite par mettre :

#!/usr/local/lib/php

Comme c'est le module CGI, il va envoyer des entêtes HTTP que tu peux désactiver avec l'option -q

Ce qui donne :

#!/usr/local/lib/php -q

< ? php

ton code

? >

Après il te suffit de programmer ton script en tâche planifée (sous linux tâche CRON)
 
WRInaute accro
Sinon, tu peux créer un script externe en Perl ou en Python, qui apelle le script PHP à intervalle régulier.

Il y a aussi Webcron et cie, que l'on rappelle souvent sur WRI.
 
WRInaute passionné
C'est marrant, je viens de plancher sur le problème pour mon script de petites annonces, dont la cache et la bd doivent être nettoyés régulièrement pour supprimer les annonces périmées...

Ma solution, qui a la mérite de fonctionner sur un mutu, consiste à commencer par créer manuellement un fichier que j'appelle par exemple "next_mod.php".

Ce fichier contiendra la première date de lancement de ta procédure (dans ton cas, l'envoi de ta newsletter).

Quand je parle de date, je parle en fait du timestamp, qui est le nombre de seconde depuis le 1er janvier 1970, donc un nombre entier plus facile à manipuler qu'une date et que tu obtiens en lancant la fonction time().

Ensuite, tu insère un bout de code, par exemple sur ta page d'acceuil qui peut ressembler à ça :

Code:
<?
//--le fichier contenant la date du prochain lancement
include("next_mod.php"); 
$date_actuelle=time();
if($date_actuelle>=$next_mod)
 {
 //--si la date est dépassée tu lances ici ta procédure.
 ta_procedure();
//--puis tu mets à jour la date du prochain lancement
//--dans mon cas j'ajoute 86400 secondes qui correspond à 24H...
 $next_mod=time()+86400;
 $code="<?";
 $code.="\$next_mod=$next_mod;";
 $code.="?>";
 $adresse="next_mod.php";
 $myfile=fopen($adresse,"w");
 fwrite($myfile,$code);
 fclose($myfile);
 }
?>

Il suffit qu'une personne se connecte à la page sur laquelle se trouve ce script pour que la date de mise à jour soit vérifiée, et la procédure lancée le cas échéant... :wink:
 
WRInaute accro
Cela implique qu'il faille qu'un internaute aille sur le site...
Quels sont les possibilités avec le "cron", est-il possible de le manipuler facilement ? Car je souhaiterai pouvoir planifier pour chaque newsletter une date différente (heures différentes,etc..).

Y a t-il des aides ? Des scripts déjà existant !

Dans le cas contraire j'obterai pour la solution de Fab le Fou (un merci au passage ;) )
 
WRInaute impliqué
Le cron fonctionne sur le principe d'un fichier qui contient les informations suivante :

minute<espace>heure<espace>jourdumois<espace>mois<espace>jourdelasemaine<espace>la commande

Par exemple

25 6 30 12 * /home/users/www/script.php

Exécutera le script le 30/12 à 6h25. Maintenant tu peux faire choses un peu plus poussée

25 6 * 12 1 /home/users/www/script.php

Lancera le script tout les lundi du mois de décembre à 6h25 .

Ou alors:

*/5 6 30 12 * /home/users/www/script.php

Lancera le script toutes les 12 min (60/5) à 6h le 30/12

Ou bien encore

25 6 30 10-12 * /home/users/www/script.php

Lancera le script le 30/10, le 30/11 et le 30/12 à 6h25 .

Pour faire ça en ligne de commande , tu as juste à taper :
crontab -e

Il va t'ouvrir un éditeur de texte, et tu tapes une tâche par ligne.

Sinon, si tu as webmin, c'est encore plus simple, tu as gestionnaire graphique ;)

Et si tu es chez un hébergeur mutualisé, normalement tu lui fourni le nom de tes scripts ainsi que les programmations, et normalement y a pas de souci :)
 
WRInaute accro
Ok j'ai bien compris le principe cela à l'air relativement "simple" !

Mais la tu me dis d'ouvrir un éditeur via une ligne de commande !
Mais si je ne peux accèder directement au serveur.

En fait ce que je souhaite faire, c'est via un script en php activer ou programmer un cron.

exemple:
DEBUT
Je fais ma news indique date et heure à laquel l'envoit doit s'effectuer...
Je valide
Le script récupère les infos (enregistre pour la news, et les infos nécessaire)
Programme (par exemple créer le fichier en question) à la période prévue
FIN

A ce niveau est-il possible de passer des paramètres ?
25 6 * 12 1 /home/users/www/script.php

Le fichier contenant la tâche et la période est supprimer une fois lue ? (bien entendue si cela est périodique il reste, mais le cas contraire ?)

Merci de ton aide.
 
WRInaute occasionnel
il y a pas mal d'hébergeurs qui acceptent de planifier des taches.

Par exemple, j'utilises cette fonctionnalité sur mon site qui est chez OVH (60GP), pour purger ma BD et lancer des inscriptions automatiques la nuit. Il suffit de leur faire un mail en leur indiquant le script php à lancer, l'heure, et la périodicité. :wink:
 
WRInaute impliqué
tu peux le faire via une commande en php comme shell_exec mais il faut que l'utilisateur qui lance le script ait les droits de modification des cron .

Il est tout à fait possible de passer des paramètres au script PHP. Pour l'extension CLI tu aurais du utiliser $_SERVER['argc'] et $_SERVER['argv'], mais avec le module CGI, ça se présente comme si tu tapais l'URL du script dans le navigateur :

script.php?page=prout&id=2

En ligne de commande (et donc dans le cron) :

/chemin/absolu/vers/le/script.php<espace>page=prout<espace>id=2

Le cron permet de programmer des taches cycliques. Si tu veux programmer une tache ponctuelle, tu dois soit :
- virer la ligne une fois la tâche accomplie
- ne pas passer par cron mais par 'at'

Syntaxe de at :

at heure:minute mois/jour/annee tache

Par exemple :

at 6:25 11/12/05 /home/users/script.php

Programmation de la tâche pour le 12 novembre 2005 à 6h25.
 
WRInaute impliqué
Fab le Fou a dit:
Il suffit qu'une personne se connecte à la page sur laquelle se trouve ce script pour que la date de mise à jour soit vérifiée, et la procédure lancée le cas échéant... :wink:
A utiliser avec précaution, car si le traitement que tu souhaite lancer périodiquement est relativement long, et bien le visiteur qui va tomber dessus il va mettre du temps à afficher sa page.
Personnellement pour mes url de maintenance, c'est ma machine chez moi qui les appelle via sa crontab (ca fait pareil que si c'était webcron) en fesant un wget de la bonne url (et j'ai un .htaccess qui sécurise le truc avec un user, mais à la rigueur vu que c'est que des scripts de maintenance qui ne font des purges...)
 
WRInaute passionné
Bah disons que si ton script est long il vaut mieux le mettre en pied de page, mais de toute façon dans mon cas il s'agit d'un script assez rapide (du fait même qu'il est lancé tous les jours).

Ton système sous-entend que ta machine soit connectée 24h/24.

Un de mes buts, c'est que mon script soit complètement portable sur tout serveur supportant le php, donc intégré au code.
 
WRInaute impliqué
cybervince > dans son cas ça pourrait aussi fonctionner sous window avec une tâche planifiée sur son poste.

Mais je ne suis pas trop pour ce genre de méthode car elle n'est pas très "propre", au niveau du débugage et de la conception.
 
Discussions similaires
Haut