POC: Design website accéléré par TokyoCabinet (part 2)
Bon je continue avec beanstalked. J'avais lu brievement ce que c'était, et j'avais pas bien compris qu'il s'agissait d'une messaging queue. Je m'attendais à ce qu'il soit possible que beanstalk lance lui même du code; ce qui change pas grand chose à vrai dire, juste les flèches de mon schéma d'origine ;)
J'ai donc téléchargé la version 1.3, installé libevent avec macports, j'ai cherché un peu pour trouver les headers de cette lib et voila pour le compiler :
* ./configure --with-event=/opt/local/var/macports/software/libevent/1.4.9_0/opt/local * make * sudo make install
magnifique, encore un soft sans encombres qu'on peut lancer comme ceci :
* beanstalkd -p 60606
Pour le client php j'ai pris celui de sourceforge, il a l'air plus a jour ... faudrait tester les deux !
Pour compatibilité avec le ZendFramework j'ai renommé le fichier en Lib/BeanStalk.php et la classe en Lib_BeanStalk ainsi que ligne 132 le new dans la function open, et toutes les occurences de BeanStalk::. J'aurai pu la laisser comme ça mais j'aime bien que tout soit rangé ;) je me suis retenu de splitter leur fichier en plusieurs classes nommée comme il faut... le but n'étant pas la, j'ai laissé comme ça !
Mais à mon avis il faudrait un peu patcher leur lib... Si on ne register qu'un serveur et qu'il est down ça part dans des boucles infinies qui plombent apache, pareil si on a plus de jobs et qu'on fait un reserve sans timeout.
Bref voici un fichier d'exemple pour utiliser beanstalkd :
<?php
set_include_path('/Users/lez/Workspaces/www/ZendFramework/ZendFramework-1.8.0/library' . PATH_SEPARATOR . get_include_path());
ini_set('display_errors', true);
ini_set('error_reporting', E_ALL);
require_once('Zend/Loader/AutoLoader.php');
Zend_Loader_AutoLoader::getInstance()
->registerNamespace('Lib');
$bs = Lib_BeanStalk::open(array('servers' => array('127.0.0.1:60606')));
# priority, delay, ttr, job
$bs->put(5, 0, 1, 'Hello');
$j = $bs->reserve_with_timeout(1);
if ($j) {
var_dump($j);
var_dump($j->get());
$j->delete();
} else {
echo "No process inqueue";
}
?>
Pour garder une certaine cohérence avec ce que je fais déja sur Jamendo et pour que ça soit plus fun, je vais aussi et majoritairement utiliser python pour le backend. J'utiliserai donc la version simpliste du client python, encore une fois il faudrait tester les 2.
* git clone git://github.com/earl/beanstalkc.git && mv beanstalkc/beanstalkc.py .
et on a la lib, voila un fichier d'exemple :
#!/usr/bin/python
import beanstalkc
bs = beanstalkc.Connection(host='127.0.0.1', port=60606, decode_yaml=False)
bs.put('Hello')
j = bs.reserve(timeout=1)
if j is not None:
print j.body
j.delete()
else:
print "No jobs inqueue"
Très simple, et j'ai testé, il ne part pas dans des boucles infinies pour les deux cas cités avant ;) peut être que pour le reserve sans timeout si, mais il ne plombe pas la machine au moins !
Je pensais aller plus loin cette fois ci mais je continuerai ce soir avec mysql.

Comments
la suite, la suite, la suite !!!
Pour la suite va falloir attendre une semaine ou deux encore ... trop de choses en ce moment j'arrive plus a me mettre sérieusement devant le PC le soir ;)
J'ai essayé vos conseils sur le haricot magique et j'ai vraiment apprécié. Je pense que c'est l'outil le plus simple et fiable pour la conception du site magnifique.
he passed the night moving his joints up and down to make sure they
kept in good working order. The Lion would have preferred a bed of
dried leaves in the forest,