Непредсказуемая запись файла журнала в PHP - PullRequest
1 голос
/ 28 августа 2009

У меня есть скрипт, который запускается каждые две минуты для приложения "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
?>

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

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

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

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

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

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

0 голосов
/ 29 августа 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...