Executer un script PHP chaque 2 heures

Mammouth du PHP | 725 Messages

06 avr. 2013, 15:21

Bonjour,

J'aimerais executer un script PHP chaque 2 heures, je sais qu'il faut recourir au cron, si je ne me trompe pas, on utilise la commande exec, malheureusement cette commande est desactivee sur le server, y a t il un moyen alternatif pour l'effectuer.

Merci

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

06 avr. 2013, 19:15

Salut,

Tu vois a l'envers la tâche cron exécute une commande Shell donc quelque comme php -f lefichieraexecuter


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 571 Messages

06 avr. 2013, 19:24

bonjour,

de mémoire une tâche cron n'est qu'un service sous linux et ne dépend pas de la commande exec. lors de la config de cron tu lui renseignes la commande à exécuter(ex : * */2 * * * php -f scriptAexecuter.php).

Alternative à cron:
Avec mysql tu peux lancer l'exécution d'une tâche avec Event Scheduler. Dans ce cas il faut déporter la logique de ton script dans une procédure stockée mysql qui sera ensuite lancée par Scheduler à l'instant t indiqué.

Mammouth du PHP | 725 Messages

07 avr. 2013, 14:51

@moogli: une option avec script PHP sans passer par le Shell

@yann18: le script comporte des requetes SQL, je vais voir votre lien

Mammouth du PHP | 725 Messages

07 avr. 2013, 15:06

J'ai lu l'article, merci je vais le tester apres, je veux avoir une information sur 2 methodes:

+ Methode 1: Celle donnees par yann18,
+ Methode 2: J'ai un fichier PHP qui se declenche chaque minute a l'aide de jQuery, qui verfier des fichiers, donnees,... je peux integrer le fichier comportant les requetes de verification et le lancer, exemple:
SELECT * FROM articles WHERE heure_view >= l_Heure_Actuelle LIMIT 1
Le code choisit l'article qui a l'heure superieur ou egal a l'heure actuelle.

Lequel de ces 2 methode est convenable: cote bande passante, script gourmand ou pas,...

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

07 avr. 2013, 16:23

C'est quoi le but exactement ?

Parce que la JS c'est a proscrire vue que c'est liée au client c'est le merdier assuré ;)

Si c'est un traitement qui ne concerne que les données du sgbd utiliser le gestionnaire de tâche de mysql est une bonne idée.
Si c'est une action serveur tu n'as pas le choix utilise cron.

Dernière option (si c'est pas trop gourmand en ressource) quand quelqu'un demande une page tu regarde si c'est le moment de le faire, si oui tu le fait, si non ben tu fait rien ;).
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

08 avr. 2013, 02:29

Le script est d'afficher une phrase differente chaque 2 heures choisit d'une SGBD

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

08 avr. 2013, 11:21

comment est sauvegardé ce choix ? (un flag en base ?) si oui utilise la solution mysql.
si dans un fichier ou autre tu n'as pas le choix il faut utiliser cron et donc un script php ou perl ou ce que peux te proposer ton hébergeur.

d'ailleurs je ne vois pas pourquoi ton hébergeur te refuserais d’exécuter un script php s'il te propose des tâches crons ;) (qui exécute une commande shell ...)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

09 avr. 2013, 02:10

si c'est moi l'hebergeur, je dispose d'un serveur, et que le code SGBD est comme suivant:
CREATE TABLE tata
id
categorie
titre
message

INSERT INTO tata VALUES (1, '1', 'titre 1', 'message 1'),
INSERT INTO tata VALUES (2, '1', 'titre 2', 'message 2'),
INSERT INTO tata VALUES (3, '3', 'titre 3', 'message 3'),
INSERT INTO tata VALUES (4, '2', 'titre 4', 'message 4'),
INSERT INTO tata VALUES (5, '3', 'titre 5', 'message 5'),

etc...

INSERT INTO tata VALUES (n, '1', 'titre n', 'message n'),
Le but est d'afficher un message chaque 2 heures a partir d'une requete SELECT

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

09 avr. 2013, 11:35

Comme déjà dit cela dépend de la façon dont tu stock le message retenue.

Perso, vue que cette donnée est relativement statique je ne ferais pas un select en base à chaque affichage.
tu peux stocker cela dans un fichier plat, quitte à le structurer un peu ;)

et donc un fichier php relativement basique
<?php
try {
    // on récupère les données actuelles;
    $data = unserialize(file_get_contents('lefichierquivabien'));
    $pdo = new PDO('le server', 'user', 'password');
    $sql = 'select * from tata where id <> ' . $pdo->quote($data->id, PDO::PARAM_INT) . ' order by rand limit 1';
    $r = $pdo->query($sql);
    if ($r === false) {
        $err = $pdo->errorInfo();
        throw new Exception($err[2]);
    } else {
        $data = $r->fetch(PDO::FETCH_OBJ);
        file_put_contents('lefichierquivabien', serialize($data));
        $r->closeCursor();
    }

} catch (Exception $e) {
    echo 'boulette : ', $e->getMessage();
    echo '<br />Trace : ', $e->getTraceAsString();
}
Pour récupérer les données c'est la ligne 4 de mon code et un exemple d'utilisation ligne 6 (c'est un objet parce que j'ai utilisé FETCH_OBJ dans la requête).

ensuite pour ce qui est de l'actualisation, c'est aussi simple, tu ajoute une tache cron qui execute la commande suivante
php -f lefichierquicontientlecodequejaimiscidessus.php
info sur la crontab http://fr.wikipedia.org/wiki/Crontab il y a des exemples correspondant à ce que tu cherche afin de paramétrer ta cron tab ;)


autre solution, qui utilise plus le SGBD : dans la tabel tu ajoute une colonne permettant d'indiqué quel est le message actif.
par exemple
CREATE TABLE tata (
id
categorie
titre
message
actif int(1) check(actif in(0,1)) not null default 0
)
lorsque tu as choisis le message tu passe la colonne actif à 1 et toutes les autres a zéro.
pour cela une version bourrin tu garde l'id de la nouvelle ligne sélectionnée, un update sur toute la table (update tata set actif=0) et ensuite la mise à 1 du champ actif pour la ligne sélectionnée.
Ensuite pour afficher le message sélectionné un simple select * from tata where actif = 1.

La première solution me semble la plus performante, a tester en charge.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

10 avr. 2013, 09:33

merci moogli pour tes propositions, je vais lire la doc pour bien decider :)

Mammouth du PHP | 725 Messages

23 avr. 2013, 05:22

reBonjour,

Je me suis servis de event_scheduler sur phpmyadmin, afin d'executer mes taches:

Image
http://img37.imageshack.us/img37/8231/e ... eduler.png

que dois je mettre sur definitions

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

23 avr. 2013, 07:56

Sans regarder la doc je dirais la requête sql ;)
Donc update latable set lechamp = lechamp -5

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

23 avr. 2013, 08:56

Sans regarder la doc je dirais la requête sql ;)
Donc update latable set lechamp = lechamp -5

@+
Je peux pas mettre du code PHP, c'est purement SQL

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

23 avr. 2013, 18:24

est ce que j'ai mis du php ? :mrgreen:
Il en faut peu pour être heureux ......