티스토리 뷰

현재 전 세계적으로(...!) Graph API를 이용해 유저 프로필을 불러오는데 이슈가 있는 상태인데,

페이스북 측은 한달 넘게 대응이 없는 상태입니다... (하... 페이스북 콱 망해버리길!)

이슈의 내용을 간단하게 정리하자면

프로필이 페이스북 CDN이 아닌 페이스북 lookaside 서버에 저장되어 있는 유저들의 프로필을 불러오는 경우

1. 플래시로 서비스중인 게임은 crossdomian 정책 때문에 프로필이 불러와지지 않음
2. 서버에서 프로필을 불러오는 게임은 에러코드 429 Too Many Request 때문에 불러와지지 않음

SNG 플랫폼에서 프로필 사진이 불러와지지 않는건 꽤나 중요한 이슈입니다. 저희 게임만 해도 프로필 사진을 쓰는곳이 몇군데 있는데, 다 핵심적인 컨텐츠들이거든요.


따라서, 페이스북의 느릿느릿한 대처를 기다리느니 직접 수정하기로 했습니다..


1번의 이슈는 crossdomain 정책의 영향을 받지 않는 서버에서 프로필을 불러오기로 했고,


2번의 이슈는 서버에서 캐싱을 하여 lookaside 서버 호출을 최소한으로 줄이기로 했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
    // Client Call
    header("Content-type: image/jpeg");
    
    $fbid = $_GET['fbid'];
    
    $profileImagePath = "profileImage/".$fbid.".jpg";
    if (file_exists($profileImagePath) )
    {            
        $profileImage = fopen($profileImagePath"r");
        if (flock($profileImage, LOCK_SH))
        {
            $cachedDate = filemtime($profileImagePath);
            $expireDate = $cachedDate + (60 * 60 * 3); // 3 hour
    
            if ($expireDate > time())
            {
                return readfile($profileImagePath);
            }
        }
    }
    
    $replace = array("url=" => """amp;" => "");    
    $url = strtr($_SERVER['QUERY_STRING'], $replace);
    $url = substr($url0, strpos($url"&fbid"));
        
    //sleep(0.5); // prevent 429 error    
    
    $profileImage = file_get_contents($url);
    if ($profileImage != false)
    {
        file_put_contents($profileImagePath$profileImage);
        return readfile($profileImagePath);
    }
?>
cs



이렇게해서 라이브에 적용을 해보았는데... 음, 아무리 캐싱을 한다 해도 429 에러가 뜨긴 하더군요.


다만, 이는 서비스중인 플랫폼마다 차이가 있을 수 있습니다. (저희는 프로필 불러오는곳이 하도 많아서... 대략 초당 몇백개 이상으로 추정됩니다)


이쯤 되면 서버쪽에서 할 수 있는 방법은 끝이라고 생각하여 페이스북쪽의 대처를 기다리기로 했습니다... (수미상관...?)


해당 이슈는 이미 페이스북 개발자 페이지 Support 란에 올라와 있으니 참고하시길 바랍니다.


이슈 링크 : https://developers.facebook.com/bugs/352580345249399/



댓글