不错的讨论。我喜欢:D
@andy:太棒了,对于我来说,第一次有人能够准确地解释区别,我也理解了:D
@Marcos Dimitrio 我同意
我自己运行了一个相当可怕的线程池,用于 Twitter API 守护进程,除了来自 Facebook 的 $_POST 推送之外,如果我理解正确的话,它们完全可以做到这一点。通过 Firehose 数据流 API 监控实时推文,以获取数百 / 数千个关键字群集的数组。在我看来,这是正确的方法,否则将遭受可怕的失败:D 当然,这是两个守护进程 getTweets 和 parseTweets 的一半。
<?php
ob_start();
require_once('config/phirehose-config.php');
require_once('lib.php');
$oDB = new db;
while (true) {
$query = 'SELECT cache_id, raw_tweet ' .
'FROM json_cache';
$result = $oDB->select($query);
while($row = mysqli_fetch_assoc($result)) {
$cache_id = $row['cache_id'];
$tweet_object = json_decode($row['raw_tweet'],false);
$tweet_id = $tweet_object->id_str;
if ($oDB->in_table('tweets','tweet_id=' . $tweet_id )) {continue;}
$tweet_text = $oDB->escape($tweet_object->text);
$created_at = $oDB->date($tweet_object->created_at);
if (isset($tweet_object->geo)) {
$geo_lat = $tweet_object->geo->coordinates[0];
$geo_long = $tweet_object->geo->coordinates[1];
} else {
$geo_lat = $geo_long = 0;
}
$user_object = $tweet_object->user;
$user_id = $user_object->id_str;
$screen_name = $oDB->escape($user_object->screen_name);
$name = $oDB->escape($user_object->name);
$profile_image_url = $user_object->profile_image_url;
$field_values = 'screen_name = "' . $screen_name . '", ' .
'profile_image_url = "' . $profile_image_url . '", ' .
'user_id = ' . $user_id . ', ' .
'name = "' . $name . '", ' .
'location = "' . $oDB->escape($user_object->location) . '", ' .
'url = "' . $user_object->url . '", ' .
'description = "' . $oDB->escape($user_object->description) . '", ' .
'created_at = "' . $oDB->date($user_object->created_at) . '", ' .
'followers_count = ' . $user_object->followers_count . ', ' .
'friends_count = ' . $user_object->friends_count . ', ' .
'statuses_count = ' . $user_object->statuses_count . ', ' .
'time_zone = "' . $user_object->time_zone . '", ' .
'last_update = "' . $oDB->date($tweet_object->created_at) . '"' ;
if ($oDB->in_table('users','user_id="' . $user_id . '"')) {
$oDB->update('users',$field_values,'user_id = "' .$user_id . '"');
} else {
$oDB->insert('users',$field_values);
}
$field_values = 'tweet_id = ' . $tweet_id . ', ' ....
foreach ($entities->hashtags as $hashtag) {
$where = 'tweet_id=' . $tweet_id . ' ' .
'AND tag="' . $hashtag->text . '"';
if(! $oDB->in_table('tweet_tags',$where)) {
$field_values = 'tweet_id=' . $tweet_id . ', ' .
'tag="' . $hashtag->text . '"';
$oDB->insert('tweet_tags',$field_values);
}
}
foreach ($entities->urls as $url) {
if (empty($url->expanded_url)) {
$url = $url->url;
} else {
$url = $url->expanded_url;
}
$where = 'tweet_id=' . $tweet_id . ' ' .
'AND url="' . $url . '"';
if(! $oDB->in_table('tweet_urls',$where)) {
$field_values = 'tweet_id=' . $tweet_id . ', ' .
'url="' . $url . '"';
$oDB->insert('tweet_urls',$field_values);
}
}
}
if(DEBUG){
echo ob_get_contents();
ob_clean();
}else{
ob_clean();
}
sleep(1);
}
?>
这也非常适用于蜘蛛和爬虫,我有自己的团队来处理。如果有更好的方法,请告诉我,考虑到资源和可扩展性,作为一个持续连接的网站小部件,用于FB状态更新,就像再次使用Echelon作为电视遥控器一样。