JeuWeb - Crée ton jeu par navigateur
[PHP] Resque ou Rediska et Redis : je rame complétement... - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Resque ou Rediska et Redis : je rame complétement... (/showthread.php?tid=5821)

Pages : 1 2 3 4 5 6 7 8 9


[PHP] Resque ou Rediska et Redis : je rame complétement... - php_addict - 24-11-2011

Bonsoir

j'ai intallé redis-server, un simple apt-get install redis-server doit suffir, enfin je pense

je rame complétement avec redis et php, j'ai essayé php-resque et rediska, bilan:

php-resque: je trouve la doc imbuvable et peu de code source exemples
rediska: doc bien foutu mais peu de sources codes en exemples

j'ai vraiment l'impression que c'est une technologie complétement inaccessible, peu documentée, un truc fais par des geeks destinés à des geeks avertis...

je suis très surpris qu'il n'y ai aucun tuto digne de ce nom sur le sujet (destiné à des programmeurs php amateur)

ce soir c'est la déprime totale sur le sujet, complétement paumé...c'est la 1ere fois que cela me fais ca en informatique, à côté l'assembleur (16bit et win32) me paraissaient ultra simple, c'est pour dire...:cogne:

si parmi vous connaissent des tutos, exemples simples, en php car j'ai lu des trucs en ruby mais c'est comme si je lisais du mandarin ou du russe

galère...:triste: pour vous dire, j'vais allez directement me coucher...pff...même pas 23h00...


RE: [php] resque ou rediska et redis : je rame complétement... - niahoo - 25-11-2011

faut attendre que le déclic se fasse, ensuite à mon avis c'est plutot simple.

peux tu poster du code php que tu as écrit et qui fasse l'interface avec redis ?


RE: [php] resque ou rediska et redis : je rame complétement... - Sephi-Chan - 25-11-2011

Déjà, il faut que tu fasses la part des choses entre Resque et Redis.
  • Redis, c'est un système de stockage en RAM qui tourne sur un serveur.
  • Resque, c'est une library Ruby en 2 parties : une partie permet d'insérer des données dans Redis (mettre en queue) et une partie qui permet de lancer des processus qui vont consommer ces données depuis Redis (les workers).
  • PHP Resque, c'est un portage de Resque en PHP. Il inclut un driver pour parler avec un serveur Redis.


Prenons un exemple d'utilisation. Tu as un jeu qui envoie un mail à chaque membre d'une alliance quand un territoire de cette alliance subit une attaque. Pour éviter que le joueur qui lance l'attaque n'attende une plombe le chargement de la page (le temps qu'elle envoie tous les mails), on effectue ce travail en tâche de fond.

Du coup, quand un joueur va attaquer un territoire, on va dire à Resque de stocker quelques données dans Redis pour que les processus effectuent cette tâche dès qu'ils sont libres. On dit alors qu'on met un job dans la queue. Voici le code pour faire ça :


$arguments = array(
"attacked_territory_id" => $attacked_territory->getId(),
"alliance_id" => $attacked_territory->getAlliance()->getId(),
"timestamp" => time()
);
Resque::enqueue('important_emails', 'SendAttackNotificationToAllianceJob', $arguments);

Cela permet d'ajouter à la queue "important_emails" une tâche qu'on identifie par le nom d'une classe et en lui transmettant quelques informations utiles.

L'avantage d'avoir plusieurs queues, c'est qu'un pourra lancer plusieurs workers, et les dédier (ou non) à une queue spécifique (comme la caisse "femmes enceintes" dans les magasins). Par défaut les workers consomment toutes les queues.

Il faut maintenant définir la classe job pour cette tâche. C'est simplement une classe qui dispose d'une méthode perform.


class SendAttackNotificationToAllianceJob {
public function perform(){
$alliance = Alliance::find($arguments["alliance_id"]);
$territory = Territory::find($arguments["attacked_territory_id"]);
$timestamp = $arguments["timestamp"];

AllianceMailer::deliverNotifyAttackOnTerritory($alliance, $territory, $timestamp);
}
}

Et voilà ! Maintenant les workers savent quoi faire !

Pour démarrer un worker (et il faut bien penser à le relancer quand on modifie le code source d'une classe qu'il utilise !), il suffit de lancer une petite commande :


$ QUEUE=* APP_INCLUDE=./config/init_worker.php php resque.php

Ici, la ligne définie deux variables d'environnement (qui seront seulement définies le temps de la commande) puis demande ensuite à l'intérpréteur PHP d'exécuter le fichier resque.php fourni avec Resque PHP. Ça va lancer un processus qu'on pourra kill quand on en aura marre.

La variable QUEUE permet d'indiquer la ou les queues à traiter : toutes, dans notre cas.
La variable APP_INCLUDE permet d'inclure un fichier. En l'occurrence, ce fichier fera des include des classes qu'on utilise dans notre tâche, établira la connexion à la base de données, etc.

Dès lors, dès que tu mettra un job en queue, un worker le traitera dès qu'il sera libre.


Voilà, voilà. Je peux difficilement être plus clair et concret. Partant de là, essaye de décrire ce que tu ne comprends pas et à partir de quand tu commences à être largué. En formulant clairement ce qui ne va pas, tu feras déjà un pas en avant.



S'il y a peu d'articles sur le sujet, c'est parce que l'utilisation de tâche de fond est une pratique un peu avancée et qui n'est visiblement pas très répandue dans la communauté PHP (malgré sa part de marché). On compte sur toi pour remédier à ça quand tu auras réussi. Smile

Voici les solutions disponibles pour PHP dont j'ai entendu parler (je n'en ai utilisé aucune) :



RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - php_addict - 26-11-2011

Merci pour tes conseils...ca y est je suis parvenu à lancer une tache assynchrone...c'est assez simple en effet finalement...

faut que je teste encore plein de trucs, genre la configuration de resque et resque shedulding..., etc...
edit: ah ba merde, je crois qu'il n'y a pas de librairie php pour resque-scheduler


RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - Sephi-Chan - 26-11-2011

Je ne sais pas s'il existe un équivalent à Resque scheduler en PHP.


RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - Angelblade - 26-11-2011

Je crois avoir compris ton explication sephi je poserais juste quelques question pour être sur.

Lorsque j'ai fini d'écrire (et à chaque changement du code de) la classe qui est appelé par resque, je dois éxécuter cette commande:

$ QUEUE=* APP_INCLUDE=./config/init_worker.php php resque.php

Si j'ai bien compris cette commande permet à resque de récupèrer la classe qui effectue le travail demandé.

Dans init_worker.php se trouve ma classe, ce fichier peut-il contenir des includes?
Toute mes classe qui effectue des taches doivent donc se trouver dans ce fichier?




RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - Sephi-Chan - 26-11-2011

(26-11-2011, 09:32 PM)Angelblade a écrit : Je crois avoir compris ton explication sephi je poserais juste quelques question pour être sur.

Lorsque j'ai fini d'écrire (et à chaque changement du code de) la classe qui est appelé par resque, je dois éxécuter cette commande:

$ QUEUE=* APP_INCLUDE=./config/init_worker.php php resque.php

Si j'ai bien compris cette commande permet à resque de récupèrer la classe qui effectue le travail demandé.

Dans init_worker.php se trouve ma classe, ce fichier peut-il contenir des includes?
Toute mes classe qui effectue des taches doivent donc se trouver dans ce fichier?

La commande en question lance une processus sans le détacher en background. Donc quand tu modifies tes classes, tu as juste a arrêter le worker (avec Ctrl + C) et à le relancer aussitôt.

Effectivement, le fichier init_worker.php ne devrait contenir que des include d'autres classes. Et tes différentes classes de job devraient être dans un répertoire dédié.





RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - php_addict - 27-11-2011

ok ok, il y n'y a pas de solution en php pour faire des job queue en tâche planifiées dans le temps ?

Pour la résolution des actions d'un webgame php comment font "les grands" alors? autrement que de déclencher la résolution des actions lors d'un rafraichissement de la page web ou par cron ?

si je prends 3 grands webgame genre ogame, travian, tribalwar, ils font comment pour résoudre les actions des joueurs (attaques, pillages, constructions, etc...) ? a t on une idée de la technologie utilisée ?


RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - Hideaki - 27-11-2011

Peut-être des Jobs en sql, un moyen simple de savoir comment ils font en php c'est d'installer XNova ( la version actuelle d'ogame est une version parent ) et de regarder comment il gère cela.


RE: [PHP] Resque ou Rediska et Redis : je rame complétement... - Hideaki - 27-11-2011

Pour le coup, je vais faire un double poste Smile
Malgré que je sois du même avis que Sephi-chan sur le php, j'ai voulu disséqué la manière de gestion des queues en php.

Pour ma petite étude j'ai pris comme base XGproyect qui se nomme comme le successeur du projet XNova qui est lui même basé sur Ogame ( ou peut-être l'inverse j'en sais rien).

Avec XGproyect le résultat est simple, à chaque appel de page ou d'appel ajax l'ensemble des actions sont calculés. Le fichier common.php crée n objets (n étant le nombre de tâche à effectuer) exemple class.FlyingFleetHandler.php celui-ci met un verrou à la base de donnée fait ce qu'il a faire, supprime le contenu et déverrouille.

J'ai tout de même regarder sur XNova et le résultat est le même.

Cependant il faut tempéré XNova est assez vieux et XGproyect souhaite être très léger. Tous les 2 sont issus de la communauté et ont sans doute moins de contrainte de performance que les jeux a très grande influence.

J'ai effectué une recherche complémentaire pour tes queues et il y a plusieurs solutions possibles : AMQPQueue, Gearman, cette article http://kore-nordmann.de/blog/0098_native_job_queue.html etc

Voici les 2 recherches que j'ai faite en tapant sur le gogole :
How to make a queue php
How to create a queue php