2009-08-28 9 views
1

J'ai un script qui s'exécute toutes les deux minutes pour une application "Tweet-getter". En un mot, il met des tweets sur Facebook. De temps en temps, il hoquet et, malgré ma vérification d'erreur, relance les anciens tweets en continu, toutes les deux minutes (le cycle de celui-ci étant exécuté comme un travail cron). J'ai un log.txt qui en théorie m'aiderait à déterminer ce qui se passe ici, mais le problème est qu'il n'est pas écrit à chaque fois que le travail se déroule. Voici le code:..Écriture de fichier journal imprévisible en PHP

<?php 
$start_time = microtime(); 
require_once //a library and config 
$facebook = new Facebook($api_key, $secret); 
get_db_conn(); //returns $conn 

$hold_me = mysql_fetch_array(mysql_query("SELECT * FROM `stats`")); 
$last_id_posted = $hold_me[0]; //the status # of the most recently posted tweet 

$me = "mytwittername"; 
$ch = curl_init("http://twitter.com/statuses/friends_timeline.xml?since_id=$last_id_posted"); 
curl_setopt($ch, CURLOPT_USERPWD, $me.":".$pw);     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$xs = curl_exec($ch); 
$data = new SimpleXMLElement($xs); 
$latest_tweet_id = $last_id_posted; 
$uid = get_uid(); //returns an array of facebookID->twittername 
$user_count = count($uid); 
curl_close($ch); 

$total_tweets = 0; 
$posted_tweets = 0; 
foreach ($data->status as $tweet) { 
$name = strtolower($tweet->user->screen_name); 

if (array_key_exists($name, $uid)) { 
     $total_tweets += 1; 
     // $name = Twitter Name 
     $message = $tweet->text; 
     $fbid = $uid[$name]; 
     theposting($name,$message,$fbid); //posts tweet to facebook 
     $this_id = $tweet->id; 
     if ($this_id > $latest_tweet_id) { 
      $latest_tweet_id = $this_id; 
     } 
    } 
} 
mysql_query("UPDATE stats SET lasttweet='$latest_tweet_id'"); 
commit_log(); //logs to a txt file how many tweets posted, how many users, execution duration, and time of execution 
?> 

Donc, en théorie, le journal est une chaîne de « Lundi 24 Août 2009 d'22:41:32 a tous appelés depuis # 3326415954. à jour # 3526415953. 8 utilisateurs A pris 0.086057 millisecondes Publié 14 sur 20 tweets. " lignes. Parfois, cependant, il va sauter deux ou trois heures à la fois, et dans ce laps de temps il va "spammer" les pages facebook des gens avec plusieurs copies du même tweet. Je ne peux pas dire ce qui pourrait casser mon code, mais ma suspicion est mauvaise XML de Twitter. Dans l'ensemble, il est relativement faible trafic de ma part, donc je doute que je surcharge mon serveur ou quoi que ce soit. Le log.txt est 50kb en ce moment, et le dernier "cassé" à ~ 35kb, donc ce n'est pas un énorme fichier qui le ralentit ... Toutes les pensées seraient appréciées!

Répondre

2

La première chose que je voudrais faire pour améliorer le script est de vérifier les erreurs cURL curl_errno & curl_error. Les chances sont que si quelque chose ne va pas, il sera de là si votre théorie XML malformée est correcte. Vous pouvez également spécifier un délai d'attente pour cURL et PHP.

Je n'ai pas utilisé la bibliothèque SimpleXML, mais il semblerait qu'il y ait une vérification de XML mal formé, cela produira un E_WARNING s'il n'est pas bien formé.

Ces 2 bits doivent éliminer toutes les données douteuses.

Sans voir les autres fonctions, il est un peu difficile de voir d'autres endroits potentiels où il pourrait se tromper.

0

Vous devez tester pour vous assurer que votre requête de base de données a réussi. Essayez de sélectionner uniquement le $last_id_posted dans votre sélection SQL, puisque vous jetez le reste de la ligne de toute façon.

$last_id_posted n'a pas de valeur par défaut. Quel est le résultat attendu de? Since_id =

Sérialiser l'état de votre réponse db/curl & XML et de vider dans votre fichier journal.

Questions connexes