banniere
Ecrit par leknoppix le 6-02-2010 à 21:40:24
Amelioration du tutoriel sur twitter utilisation d'un cache

Suite au tuto sur l'interaction entre twitter et son site web, voici une petite optimisation afin d'éviter des problèmes de requêtes limitées ou des problèmes de saturation de twitter. Pour cela, nous allons créer à partir du code précédent, un système de cache qui permettra dans le cas de nombreuses visites, d'éviter de perdre de la bande passante inutile.

Un cache est un système qui permet de conserver un contenu sans devoir, à chaque fois, tout recharger. Pour des sites à haute fréquentation comme facebook ou twitter, les systèmes de cache sont indispensables car sinon, leurs serveurs et leurs bandes passantes seraient saturés continuellement. En gros, le nombre de requêtes par un tel système permet également, de diminuer considérablement le nombre de contenus à récupérer.

Reprenons donc le code du premier tutoriel que nous allons décomposer en plusieurs fonctions différentes.

<?php
$twitterUser = "login";
$twitterPassword = "pass";
if ($rawTweets = file_get_contents("http://$twitterUser:$twitterPassword@twitter.com/statuses/user_timeline.json")) {
if ($myTweets = json_decode($rawTweets)) {
echo '<ul>';
foreach ($myTweets as $tweet) {
echo "<li>".twitter(htmlspecialchars($tweet->text))."</li>";
}
}
echo '</ul>';
}
else
{
echo "Aucun post";
}
}
else {
die("Impossible de charger les données depuis Twitter");
}
?>

Le cache est en fait un fichier qui sera lu, par des fonctions php tels que fopen() ou file_get_contents .... Nous allons donc créer une première fonction qui permettra de tester si ce fichier existe d'une part et s'il date de moins de 1 minute. Pourquoi 1 minute? La réponse est simple, l'api externe de twitter est limitée en nombre de requêtes par minute. Je m'explique, si cette limite est de 100 requêtes/minutes, et que vous avez 200 visites dans une minute, il y aura donc 200 requêtes d'où dépassement de la limitation de l'application. Cette limitation à une minute permet donc de faire 1 seule requête par minute. Donc en schématique, chaque minute, il y aura 1 requête.

Nous allons tout d'abord créer une fonction init() qui testera l'existence du fichier cache.txt (fichier qui servira de cache) et contrôlera sa date de création. Si cette création date de moins de 1 minute, on utilisera le cache sinon on recréera un cache plus récent.

<?php
function init()
{
    $filename = "./cache.txt";
    $datecreation = filemtime($filename);
    $time = time();
    if( $time > ($datecreation + 60) )
    {
        creationcache();
    }
    else
    {
        affiche_tweet();
    }
}
?>

La fonction filemtime() permet de recupérer le timestamp() de la création du fichier. Ensuite, une comparaison avec le timestamp actuel permet de savoir si le fichier doit être actualisé ou non. Ici, en fonction de l'état du fichier cache.txt, soit, nous recréerons le fichier par le biais de la fonction creationcache() ou, dans le cas d'un cache datant de moins de 1 minute, nous afficherons le contenu du fichier par la fonction affiche_tweet().

Nous allons maintenant créer la fonction qui permet d'éditer le cache mais également de récupérer nos tweets. Dans cette nouvelle version de code, je vous propose d'utiliser les fonctions curl() présentes dans php5.

<?php
function creationcache()
{
    $twitterUser = "login";
    $twitterPassword = "pass";
    $twitter= curl_init();
//récupération du contenu des différents tweets postés.
    curl_setopt($twitter,CURLOPT_URL,"http://$twitterUser:$twitterPassword@twitter.com/statuses/user_timeline.json");
//limiter la durée de retour du serveur de twitter à 2 secondes pour éviter le plantage des autres scripts
    curl_setopt($twitter,CURLOPT_TIMEOUT,2);
//recupérer dans une variable le contenu du fichier user_timeline.json
    curl_setopt($twitter,CURLOPT_RETURNTRANSFER,true);
//lancer l'exécution de la récupération des tweets.
    $tweet=curl_exec($twitter);
    if($tweet)
    {
        //enregistrement du contenu dans le fichier tweet
        file_put_contents('./cache.txt',$tweet);
    }
    affiche_tweet();
}
?>

La fonction précédente me parait assez commentée pour comprendre son fonctionnement. Passons maintenant à la fonction affiche_tweet() qui permettra d'afficher les tweets.

<?php
function affiche_tweet()
{
    $rawTweets = file_get_contents('./cache.txt', true);
    $tab= json_decode($rawTweets);
    foreach($tab as $a)
    {
            echo $a->text;
            echo "<br />";
            $i++;
    }
}
?>

Comment fonctionne cette fonction? Elle récupère le contenu du fichier cache.txt, stocke le contenu dans une variable. Cette dernière étant de type json, il faut convertir cette chaine via la fonction json_decode(). Ensuite par une simple boucle foreach(), le contenu souhaité sera affiché.

Voici le script complet:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Mon titre</title>
</head>
<body>
<?php
function init()
{
    $filename = "./cache.txt";
    $datecreation = filemtime($filename);
    $time = time();
    if( $time > ($datecreation + 60) )
    {
        creationcache();
    }
    else
    {
        affiche_tweet();
    }
}
function creationcache()
{
    $twitterUser = "login";
    $twitterPassword = "pass";
    $twitter= curl_init();
    curl_setopt($twitter,CURLOPT_URL,"http://$twitterUser:$twitterPassword@twitter.com/statuses/user_timeline.json");
    curl_setopt($twitter,CURLOPT_TIMEOUT,2);
    curl_setopt($twitter,CURLOPT_RETURNTRANSFER,true);
    $tweet=curl_exec($twitter);
    if($tweet)
    {
        file_put_contents('./cache.txt',$tweet);
    }
    affiche_tweet();
}
function affiche_tweet()
{
    $rawTweets = file_get_contents('./cache.txt', true);
    $tab= json_decode($rawTweets);
    foreach($tab as $a)
    {
            echo twitter($a->text);
            echo "<br />";
    }
}
function twitter($text)
{
$search = array('|(http://[^ ]+)|', '/(^|[^a-z0-9_])@([a-z0-9_]+)/i','/(^|[^a-z0-9_])#([a-z0-9_]+)/i');
$replace = array('<a href="$1" class="lienvrai">$1</a>', '$1@<a href="http://twitter.com/$2">$2</a>','$1<a href="http://twitter.com/#search?q=%23$2">#$2</a>');
$text = preg_replace($search, $replace, $text);
return($text);
}
init();
?>
</body>
</html>

        L'appel de la fonction init() à la fin, permet de lancer la récupération de l'ensemble des informations souhaitées. Voila, cette mise à jour de tutoriel est faite, n'hésitez pas à poster des commentaires si vous voulez de l'aide ou des renseignements.

EDIT: Suite à un commentaire de Pyraah, je me suis rendu compte que cette méthode n'était plus fonctionnelle, je vous envoie donc vers ce nouveau tutoriel

Publier sur mon compte twitterPublier sur mon viadeoPublier sur mon deliciousPublier sur mon compte twitter

Ajoute ton commentaire

Pseudo : *
E-Mail : *
MSN :
Site internet :
Blog :
Note : *
Commentaire : *
Ne pas compléter :
© 2007-2017