2009-08-28 2 views
1

У меня есть сценарий, который запускается каждые две минуты для приложения «Tweet-getter». В двух словах он помещает твиты в Facebook. Время от времени он икает и, несмотря на мою проверку ошибок, постоянно перечитывает старые твиты каждые две минуты (цикл его запускается как задание cron). У меня есть log.txt, который теоретически поможет мне определить, что здесь происходит, но проблема заключается в том, что он не записывается каждый раз, когда выполняется задание. Вот код:..Непредсказуемая запись файла журнала в 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 
?> 

Таким образом, в теории лог строку «в понедельник 24 августа 2009 10:41:32 PM уравнивает, так как # 3326415954. обновлен до # 3526415953. 8 пользователей Принимал 0.086057 миллисекунды . Добавлено 14 из 20 твитов. " линий. Иногда, хотя, он пропустит два или три часа за раз, и в этот период он будет «спамить» страницы людей с помощью нескольких копий одного и того же твита. Я не могу сказать, что может нарушить мой код, но мое подозрение - плохой XML из твиттера. В целом это относительно низкий трафик на моем конце, поэтому я сомневаюсь, что я перегружаю свой сервер или что-то еще. Теперь log.txt - 50 кбайт, и последний «сломался» на ~ 35 кб, поэтому это не огромный файл, замедляющий его ... Любые мысли будут оценены!

ответ

2

Первое, что я хотел бы сделать, чтобы улучшить сценарий - проверить ошибки cURL curl_errno & curl_error. Скорее всего, если что-то пойдет не так, это будет оттуда, если ваша неправильная теория XML верна. Вы также можете указать тайм-аут как для cURL, так и для PHP.

Я не использовал библиотеку SimpleXML, но выглядит так, как будто есть проверка на неправильный XML, она создаст E_WARNING, если она не была правильно сформирована.

Эти 2 бита должны уничтожать любые изворотливые данные.

Не видя других функций, немного сложно увидеть любые другие потенциальные места, где это может произойти неправильно.

0

Вы должны проверить, чтобы запрос к базе данных был успешным.

Попробуйте выбрать только $last_id_posted в вашем выборе SQL, так как вы все равно отбрасываете остальную часть строки.

$last_id_posted не имеет значения по умолчанию. Каков ожидаемый результат? From_id =

Сериализовать состояние вашего ответа db/curl & XML и сбрасывать в файл журнала.