2009-08-28 11 views
1

"Tweet-getter"アプリケーションで2分ごとに実行されるスクリプトがあります。一言で言えば、Facebookにつぶやく。毎回、そしてそれはしゃっくりと私のエラーチェックにもかかわらず、2分ごとに連続して古いツイートを再投稿します(そのサイクルは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 
?> 

だから理論的にログが2009年8月十時41分32秒PMの月曜日の24日」の文字列である#3526415953. 8のユーザーに更新しました#3326415954.ので、すべての呼び出さ0.086057ミリ秒を奪いました。 。20のつぶやきのうち14を掲示してください。ライン。しかし時々、それは一度に2〜3時間をスキップし、その時間帯には同じツイートの複数のコピーで人々のFacebookページを「迷惑メール」するでしょう。私は自分のコードを壊しているかも知れませんが、私の疑惑はTwitterからの悪いXMLです。全体的に私の終わりにはトラフィックが比較的少ないので、私は自分のサーバーや何かを過負荷にしているのではないかと疑います。 log.txtは現在50kbで、最終的に〜35kbで "壊れました"ので、それはそれを遅くする大きなファイルではありません...どんな考えも高く評価されます!

答えて

2

スクリプトを改善するためにまず行うべきことは、cURLエラーを確認することです。curl_errno & curl_error誤ったことが起こった場合は、不正な形式のXML理論が正しいかどうかが原因です。 cURLとPHPの両方にタイムアウトを指定することもできます。

私はSimpleXMLライブラリを使用していませんが、不正な形式のXMLのチェックがあるかのように見えます。正しく構成されていないと、E_WARNINGが生成されます。

これらの2ビットは、あらゆる不正なデータを削除する必要があります。

他の機能を見ることなく、間違っている可能性のある他の場所を見るのは少し難しいです。

0

データベースクエリが成功したかどうかをテストする必要があります。

SQLのselectで$last_id_postedのみを選択してみてください。これは、残りの行を無視しているからです。

$last_id_postedにはデフォルト値はありません。 since_id =

db/curl応答& XMLの状態をシリアル化してログファイルにダンプします。

関連する問題