用PHP编写不可预知的日志文件

时间:2009-08-28 16:02:30

标签: php facebook twitter cron

我有一个脚本,每两分钟运行一次“Tweet-getter”应用程序。简而言之,它将推文发布到Facebook上。我们时不时地打嗝,尽管我的错误检查,每两分钟(它作为一个cron作业运行的循环)不断地重新发布旧推文。我有一个log.txt,理论上可以帮助我确定这里发生了什么,但问题是它并没有写入每次作业运行。这是代码:

<?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月24日星期一10:41:32 PM。自#3326415954以来全部被调用。更新为#3526415953. 8位用户。收到0.086057毫秒。发布了20条推文中的14条。 “线。有时候,它会一次跳过两三个小时,在那段时间内,它会用同一条推文的多个副本“垃圾”人们的Facebook页面。我不知道是什么可能会破坏我的代码,但我怀疑是来自twitter的糟糕XML。总而言之,我的流量相对较低,所以我怀疑我的服务器或任何东西都在超载。 log.txt现在是50kb,最后“打破”~35kb,所以它不是一个大文件减慢它...任何想法将不胜感激!

2 个答案:

答案 0 :(得分:2)

我要做的第一件事就是检查cURL错误curl_errno&amp; curl_error。如果你的格式错误的XML理论是正确的,那么如果出现任何问题,可能会出现问题。您可能还想为cURL和PHP指定超时。

我没有使用SimpleXML库,但看起来好像检查格式错误的XML,如果格式不正确,它会产生E_WARNING。

这2位应该消除任何狡猾的数据。

如果没有看到其他功能,就很难看到任何其他可能出错的地方。

答案 1 :(得分:0)

您应该进行测试以确保数据库查询成功。

尝试仅选择SQL选择中的$last_id_posted,因为无论如何都要丢弃行的其余部分。

$last_id_posted没有默认值。什么是?since_id =

的预期结果

序列化db / curl响应的状态&amp; XML并转储到您的日志文件中。