Programmer exécution de script sans cron

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Programmer exécution de script sans cron

par cicom » 01 mai 2007, 16:14

Re,
Pour passer le temps et pour continuer sur le sujet de l'optimisation que nous avions entamé voici la dernière version de la fonction météo, je l'ai encore optimisée et j'ai rajouté un nuage différent, qu'en pensez vous?

Merci à tous, et on verra si le webcron marche cette nuit mais je suis sceptique...
function meteo ()
{
 $ndf = 2; //nombre de figures rentrées en array
 $figs = array();
 //syntaxe level x y
 //le rond
 $figs[0] = array();
 //zone noire
 $figs[0][0] = array(5, 0, 0);
 //zone bleue
 $figs[0][1] = array(4, -1, -1);
 $figs[0][2] = array(4, 0, -1);
 $figs[0][3] = array(4, -2, 0);
 $figs[0][4] = array(4, -1, 0);
 $figs[0][5] = array(4, 1, 0);
 $figs[0][6] = array(4, -2, 1);
 $figs[0][7] = array(4, -1, 1);
 $figs[0][8] = array(4, 0, 1);
 $figs[0][9] = array(4, 1, 1);
 $figs[0][10] = array(4, -1, 2);
 $figs[0][11] = array(4, 0, 2);
 //zone rouge
 $figs[0][12] = array(3, -1, -2);
 $figs[0][13] = array(3, 0, -2);
 $figs[0][14] = array(3, 1, -1);
 $figs[0][15] = array(3, 2, 0);
 $figs[0][16] = array(3, 2, 1);
 $figs[0][17] = array(3, 1, 2);
 $figs[0][18] = array(3, 0, 3);
 $figs[0][19] = array(3, -1, 3);
 $figs[0][20] = array(3, -2, 2);
 $figs[0][21] = array(3, -3, 1);
 $figs[0][22] = array(3, -3, 0);
 $figs[0][23] = array(3, -2, -1);
 //zone jaune
 $figs[0][24] = array(2, -1, -3);
 $figs[0][25] = array(2, 0, -3);
 $figs[0][26] = array(2, 1, -2);
 $figs[0][27] = array(2, 2, -1);
 $figs[0][28] = array(2, 3, 0);
 $figs[0][29] = array(2, 3, 1);
 $figs[0][30] = array(2, 2, 2);
 $figs[0][31] = array(2, 1, 3);
 $figs[0][32] = array(2, 0, 4);
 $figs[0][33] = array(2, -1, 4);
 $figs[0][34] = array(2, -2, 3);
 $figs[0][35] = array(2, -3, 2);
 $figs[0][36] = array(2, -4, 1);
 $figs[0][37] = array(2, -4, 0);
 $figs[0][38] = array(2, -3, -1);
 $figs[0][39] = array(2, -3, -2);
 //zone verte
 $figs[0][40] = array(1, -1, -4);
 $figs[0][41] = array(1, 0, -4);
 $figs[0][42] = array(1, 1, -3);
 $figs[0][43] = array(1, 2, -2);
 $figs[0][44] = array(1, 3, -1);
 $figs[0][45] = array(1, 4, 0);
 $figs[0][46] = array(1, 4, 1);
 $figs[0][47] = array(1, 3, 2);
 $figs[0][48] = array(1, 2, 3);
 $figs[0][49] = array(1, 1, 4);
 $figs[0][50] = array(1, 0, 5);
 $figs[0][51] = array(1, -1, 5);
 $figs[0][52] = array(1, -2, 4);
 $figs[0][53] = array(1, -3, 3);
 $figs[0][54] = array(1, -4, 2);
 $figs[0][55] = array(1, -5, 1);
 $figs[0][56] = array(1, -5, 0);
 $figs[0][57] = array(1, -4, -1);
 $figs[0][58] = array(1, -3, -2);
 $figs[0][59] = array(1, -2, -3);
 //le carré
 $figs[1] = array();
 //zone noire
 $figs[1][0] = array(5, 0, 0);
 //zone bleue
 $figs[1][1] = array(4, -1, -1);
 $figs[1][2] = array(4, 0, -1);
 $figs[1][3] = array(4, 1, -1);
 $figs[1][4] = array(4, 1, 0);
 $figs[1][5] = array(4, 1, 1);
 $figs[1][6] = array(4, 0, 1);
 $figs[1][7] = array(4, -1, 1);
 $figs[1][8] = array(4, -1, 0);
 //zone rouge
 $figs[1][9] = array(3, -2, -2);
 $figs[1][10] = array(3, -1, -2);
 $figs[1][11] = array(3, 0, -2);
 $figs[1][12] = array(3, 1, -2);
 $figs[1][13] = array(3, 2, -2);
 $figs[1][14] = array(3, 2, -1);
 $figs[1][15] = array(3, 2, 0);
 $figs[1][16] = array(3, 2, 1);
 $figs[1][17] = array(3, 2, 2);
 $figs[1][18] = array(3, 1, 2);
 $figs[1][19] = array(3, 0, 2);
 $figs[1][20] = array(3, -1, 2);
 $figs[1][21] = array(3, -2, 2);
 $figs[1][22] = array(3, -2, 1);
 $figs[1][23] = array(3, -2, 0);
 $figs[1][24] = array(3, -2, -1);
 //zone jaune
 $figs[1][25] = array(2, -3, -3);
 $figs[1][26] = array(2, -2, -3);
 $figs[1][27] = array(2, -1, -3);
 $figs[1][28] = array(2, 0, -3);
 $figs[1][29] = array(2, 1, -3);
 $figs[1][30] = array(2, 2, -3);
 $figs[1][31] = array(2, 3, -3);
 $figs[1][32] = array(2, 3, -2);
 $figs[1][33] = array(2, 3, -1);
 $figs[1][34] = array(2, 3, 0);
 $figs[1][35] = array(2, 3, 1);
 $figs[1][36] = array(2, 3, 2);
 $figs[1][37] = array(2, 3, 3);
 $figs[1][38] = array(2, 2, 3);
 $figs[1][39] = array(2, 1, 3);
 $figs[1][40] = array(2, 0, 3);
 $figs[1][41] = array(2, -1, 3);
 $figs[1][42] = array(2, -2, 3);
 $figs[1][43] = array(2, -3, 3);
 $figs[1][44] = array(2, -3, 2);
 $figs[1][45] = array(2, -3, 1);
 $figs[1][46] = array(2, -3, 0);
 $figs[1][47] = array(2, -3, -1);
 $figs[1][48] = array(2, -3, -2);
 //zone verte
 $figs[1][49] = array(1, -2, -4);
 $figs[1][50] = array(1, -1, -4);
 $figs[1][51] = array(1, 0, -4);
 $figs[1][52] = array(1, 1, -4);
 $figs[1][53] = array(1, 2, -4);
 $figs[1][54] = array(1, 2, 4);
 $figs[1][55] = array(1, 1, 4);
 $figs[1][56] = array(1, 0, 4);
 $figs[1][57] = array(1, -1, 4);
 $figs[1][58] = array(1, -2, 4);
 $figs[1][59] = array(1, -4, 0);
 //SUITE DEV FINIR ZONES
 $sql = mysql_query("SELECT count(*) FROM map");
 $result = mysql_result($sql, 0, 0);
 $nbact = $result?floor(($result / 60) /1.3 ):0;
 $arid = array();
 for ($curseur = 0; $curseur<$nbact; $curseur++)
 {
  $sql = mysql_query("SELECT x, y FROM meteo ORDER BY rand() LIMIT 1"); //tirage d'une météo
  $result = mysql_fetch_array($sql);
  switch(rand(0, 3)){
      case 1: $temps = 'neige'; break;
      case 2: $temps = 'pluie'; break;
      case 3: $temps = 'pluie'; break;
      default: $temps = 'brouillard'; break; //0
  }
 $rdf = rand(0, $ndf-1); //tirage d'une figure
 for($c=0; $c < 59; $c++)
  {
   $xf = $result['x'] + $figs[$rdf][$c][1];
   $yf = $result['y'] + $figs[$rdf][$c][2];
   mysql_query("UPDATE meteo SET temps = '".$temps."', level = '".$figs[$rdf][$c][0]."' WHERE y = '".$yf."' AND x = '".$xf."'");
   $arid["$yf-$xf"] = "'$yf-$xf'"; //mémorise les xy traités et évite les doublons éventuels
  }
 }
 mysql_query("UPDATE meteo SET temps = 'beau', level = '0' WHERE Concat(y,'-',x) NOT IN (".implode(",", $arid).")");
 //test fichier pour fonction nocturne, effacer si ca marche
 $fp = fopen('exec.log', 'a+');
 fputs($fp, date('d/m/Y - H:i:s')."\n");
 fclose($fp); 
}

par cicom » 01 mai 2007, 12:09

Re,
Effectivement une fois que c'est mis en 666 ca marche correctement...
Bon sinon cette nuit aucun mail reçut, aucun marqueur mis dans la bdd et la météo du jeu n'a pas bougé.
Il faut qu'on laisse encore une nuit passer pour être sûrs avec la méthode de l'écriture dans le fichier et après on verra...
Merci à tous!

par naholyr » 01 mai 2007, 08:21

Nan mais quand je t'ai donné le code c'est parce que j'avais la flemme de t'expliquer en détail le principe faut l'adapter :?
Il y a des choses importantes à savoir quand on fait du web dont la gestion des droits sur le serveur (droits Unix). C'est simple, selon que le serveur web s'exécute en tant que ton user, ton groupe, ou totalement autre chose, il va falloir donner des droit à ce user, ce groupe, ou à tout le monde.
Le plus simple en l'occurrence pour éviter de tatonner : envoie un fichier "exec.log" dans /home/getsu/public_html/akeron/, mets-lui les droits de lecture/écriture pour tout le monde (droits 666 si ton client FTP prend l'octal), et roulez jeunesse.

par thehawk » 01 mai 2007, 00:08

montre le code est le fichier (exec.log) n'est pas dans un dossier ?

par cicom » 30 avr. 2007, 23:44

Re,
j'ai fait un test avec mon fichier test et rien à faire il me renvoit tout le temps ça
Warning: fopen(exec.log) [function.fopen]: failed to open stream: Permission denied in /home/getsu/public_html/akeron/sql.php on line 5

Warning: fputs(): supplied argument is not a valid stream resource in /home/getsu/public_html/akeron/sql.php on line 6

Warning: fclose(): supplied argument is not a valid stream resource in /home/getsu/public_html/akeron/sql.php on line 7

j'ai pourtant passé les permissions du dossier en 777 et créé le exec.log
D'où ca vient?
Merci à tous!
PS je laisse le mail pour le moment mais je vais ajouter un second truc, un marqueur dans la bdd histoire d'etre sur...

par thehawk » 30 avr. 2007, 23:09

ben sa creer fichier qui recensera l'activites de ton script parce que quelque que fois avec les mails ... le facteurs peut oublier de les poster alors q'uavec le fichier de log c'est immédiat et précis et ca te permet de savoir ce qui se passe sur ton script en le mettant au debut tu sait quand il a commencer et a al fin quand il a fini et enfin il te permet de garder une trace sur plusieur jour

par cicom » 30 avr. 2007, 23:02

Re,
Désolé de poser des questions qui pourront paraitre stupides mais ca fait quoi exactement ça?
Merci!

par naholyr » 30 avr. 2007, 22:56

Plus simple et plus fiable qu'un envoi de mail :
$fp = fopen('exec.log', 'a+');
fputs($fp, date('d/m/Y - H:i:s')."\n");
fclose($fp);

par cicom » 30 avr. 2007, 20:43

Re,
Bah pourtant j'ai pas l'impression que ça marche, écoute je vais ajouter l'envoit d'un mail à moi même à cette fonction et on verra bien si cette nuit je reçois quelque chose...
Je vous tiens au courant!!

par naholyr » 30 avr. 2007, 18:36

Pourtant webcron est plutôt éprouvé, et à part quelques «évènements» il fonctionne. Tu es sûr de ton coup là ? Tu devrais leur écrire à ce moment-là pour demander ce qui peut bien se passer.

Sinon faire du cron sans cron, ça n'est pas possible ^^ il faudra bien qu'il y a un cron quelque part, c'est-à-dire une machine allumée en permanence qui toutes les X heures effectue l'action que tu veux. Que ce soit sur ton serveur ou sur un autre (webcron) ou même avec ton PC de salon, mais c'est soit ça, soit ton idée de départ.

par cicom » 30 avr. 2007, 17:54

Je relance la question de départ qui était de lancer un script tous les jours à 4h sans cron? Puisque webcron ne marche pas j'en suis sûr (les tests marchent mais le fonctionnement régulier non) il va falloir trouver une autre solution...
Merci à tous de votre aide!

par cicom » 28 avr. 2007, 14:51

Re,
Effectivement c'était le truc que j'avais mis par défaut dans le script de construction de la carte avant de m'être penché sur la fonction météo.
J'ai supprimé cette ligne et j'ai mis à jour de l'autre côté.
Voila cette fois on a fini non?
En tout cas merci beaucoup de ton aide! J'aurai appris un truc important les conctats! et pour le système de la carte ils vont pas mal me servir je pense...
Merci!

par sadeq » 28 avr. 2007, 13:53

Non, je croix que non, une dernière chose:
Le dernier Update m'intrigue

Code : Tout sélectionner

mysql_query("UPDATE meteo SET temps = 'beau', level = '0' WHERE temps = 'null'");
Je pense que si tu déclares au niveau de la table "meteo" des valeurs par défaut: "beau" pour temps et "0" pour level, tu n'auras pas à faire cet Update. A moins que tes programmes mettent des nuls explicites dans temps.

Cette fois je me tais.


:wink:

par cicom » 28 avr. 2007, 11:28

Ok merci beaucoup j'ai tout compris! :wink:
Je pense qu'on est arrivé au bout de l'optimisation non?
Merci!

par sadeq » 27 avr. 2007, 23:28

Bien sûr, j'attendais simplement ta réponse quant à l'exécution du code.
Bon alors,
  • 1. les for ont remplacé les while pour ne pas gérer l'incrémentation

    2. les variables $sql et $result sont utilisées et réutilisées pour toutes les requêtes exécutées car non imbriquées

    3. un switch remplace les if en série, car il s'agit de vérifier les valeurs d'une même variable $temps

    4. pour éviter de récupèrer l'id par un select par y et x, on remarque que ces derniers (yx) sont aussi uniques que l'id, du coups ayant y et x on n'a plus besoin de l'id pour avoir un index de recherche pour le Where de l'Update attendu plus tard.

    la forme $arid["$yf-$xf"] = "'$yf-$xf'"; mémorise y et x traité dans le tableau $arid. l'utilisation de la forme '$yf-$xf' dans l'index du tableau permet de ne pas affecter au tableau deux même yx tirés au hazard.
    C'est ce qu'on appelle un tableau associatif dont l'index est un texte aulieu d'un indice numérique.

    Par exemple:

    $t[0] est un index unique car on ne peut pas trouver un deuxième index 0 dans $t
    De même, $t["toto"] est un index unique car si on ne doit pas retrouver un autre index "toto" dans le tableau.

    Finalement la forme '$yf-$xf' est un choix pour mémoriser y et x dans une forme facilement extractable (ça peut être une autre forme) c'est pourquoi on a utilisé un concat(y, '-', x) au niveau de la requête Update pour se correspondre au yx mémorisés dans le tableau $arid.
    Je rappelle la requête Update qui retrouve ses indexes recherchés dans le tableau $arid ainsi contruit:
     "UPDATE meteo SET temps = 'beau', level = '0' WHERE Concat(y,'-',x) NOT IN (".implode(",", $arid).")"
    Concat() ici est la fonction Sql qui concaténe les mots y,- et x, contruit un couple 'y-x' de la table meteo qui est évalué dans le Where par NOT IN dans la liste des 'y-x' "implodée" du le tableau $arid
Et voilà :wink: