2010-04-03 2 views
6

친구들에게 비교 다음PHP 모든 트위터 팔로워를 가져 내가 할 수있는 확장 성있는 방법을 찾고 있어요

  • 사용자 로그인
  • 트위터
  • 에서 모든 친구를 가져 오기 트위터
  • 에서 모든 호응을 가져 오기
  • 친구가 아닌 모든 친구를 표시합니다.

문제 : 어떻게 확장 가능한 방식으로이 작업을 수행 할 수 있습니까? 사용자는 최대 2 백만 명의 친구 또는 팔로어를 가질 수 있습니다. 현재 SQLite 테이블 내부에 저장하고있어 루프를 통해 비교합니다. 사용자가 다시 돌아 오면 테이블이 지워지고 프로세스가 다시 시작됩니다.

이 작품은 100-1000 명의 친구에게 적합하지만 500000 명의 친구에게는 까다로울 것입니다. 모든 순간을 바꿀 수 있기 때문에 목록을 캐시 할 수 없습니다 ..

누구든지 이러한 큰 양의 데이터를 처리하는 좋은 방법을 알고 있습니까?

+2

누군가가 500,000 명의 친구를 갖게 될 것이 현실적입니까? –

답변

0

귀하의 데이터베이스가 어떻게 생겼는지 모르겠지만, 어떻게 설정했는지 알 수 있습니다.

CREATE TABLE twitter_users (
    user_id INTEGER PRIMARY KEY NOT NULL, 
    screen_name VARCHAR(20) NOT NULL 
); 

CREATE TABLE friends (
    friend_id INTEGER PRIMARY KEY NOT NULL 
); 

CREATE TABLE followers (
    follower_id INTEGER PRIMARY KEY NOT NULL 
); 

그러면이 SQL을 사용하여 추종자가 아닌 친구를 얻을 수 있습니다.

SELECT friend_id, screen_name 
FROM friends 
LEFT JOIN followers ON follower_id = friend_id 
LEFT JOIN twitter_users ON user_id = friend_id 
WHERE follower_id IS NULL 

화면 이름 인 경우

NULL 그들이 당신의 twitter_users 테이블에없는 것을 의미한다. 누락 된 사용자를 찾아 나중에 저장할 수 있습니다. 스크린 이름은 테이블을 주기적으로 업데이트해야 할 수도 있으므로 변경 될 수 있습니다.

friends/idsfollowers/ids API를 사용하여 한 번에 친구 및 팔로어 ID 5,000 개 목록을 가져옵니다. 화면 이름을 최대 100 개까지 가져 오려면 users/lookup API를 사용하십시오. 사용자의 친구가 2,000,000 명인 경우 ID 목록을 가져 오기 위해 400 회의 API 호출이 필요하므로 적어도 인기있는 사용자의 경우에도 목록을 캐싱해야합니다.

0

다른 점은 한 번에 추종자가 아닌 모든 명의 친구를 표시해야합니까? 한 번에 제한된 수 (예 : 20) 만 표시해야하는 경우 20 개를 계산하면됩니다. 그들이 더 많은 것을 요구하면 플라이에서 더 많은 것을 계산하십시오 (또는 그들이 사이트를 탐색 할 때 백그라운드에서 수행하십시오; 각 요청마다 몇 가지 더 생성하십시오).

이론상의 한계 일지라도 한 페이지에 2 천만 개의 결과를 표시해야하는 상황을 상상할 수 없습니다.

그래서, (자신의 API 문서에서 간단한 찾아보기 않아도) 일 수있는 방법은

  • 잡아 자신의 친구의 덩어리 (당신이 어쨌든 요청에 ​​따라 100을 얻을 것으로 보인다)를 사용하는 것 당신이 충분한 결과를 가지고있어 각 검색 친구 statuses/friends API
    • 사이의 추종자 상태를 확인하기 위해 friendships/show를 사용 (예 : 20) 다음, 당신이 완료 휴식

100 2000000 친구들과 사용자의 전체 친구 목록을 받고, 다시 트위터의 rate limiting 정책에 의해 허용하지만,보다 서버로 더 많은 요청을 필요로 않습니다 이러한 접근 방식 요청 당 친구 수는 한도를 초과하기 전에 모두 초과됩니다 (150 요청 × 요청 당 100 = 15,000). 이 문제를 어떻게 해결할 계획입니까?

+0

당신은 항상 사용자가 자신의 추종자 피드를 내보내고 시작 프로세스의 일부로 제출할 수 있습니다 ... 호기심이 제 3 자 프로세서 (dobutful)로 전달할 수있는 안전한 방법이 있다면, – jcolebrand

0

이렇게하는 것이 유일한 방법은 아니지만 효과적입니다. crontab을 실행하여 공개 목록 (또는 트위터 자체)이있는 사이트에서 매일 트위터 사용자 목록을 다운로드 한 다음 해당 친구의 색인을 생성합니다. 일). 그런 다음 cUrl을 사용하여 PHP를 통해 트위터 API에 액세스하여 친구들의 목록을 검색하고 배열을 일치시킵니다. 위와 같이 제한 정책을 사용하면 다른 작업을 수행 할 수 없게되므로 알고리즘을 향상시킬 수 있기 때문에 이는 잘 작동합니다. 행운을 빕니다! =)

관련 문제