매주 랭킹을 초기화 해야한다.
좋은 방법이 없을까

- 일단 페이스북에서 제공하는 API가 있다.

앱의 모든 점수 삭제

해당 앱의 앱 access_token으로 /APP_ID/scores에 대한 HTTP DELETE 요청을 실행하여 앱의 모든 점수를 삭제할 수 있습니다.
그러면 앱의 점수를 재설정합니다. 게임 점수 및 리더보드를 주기적으로 재설정하려 할 때 사용하세요.

응답은 다음과 같습니다.

설명
유형

삭제 성공 여부에 따라 true 또는 error

boolean


이 API를 이용하면 될 것 같은데 일주일에 한 번 서버자체로 해당 코드를 실행 시키도록 해야할 것 같다. 
해당 기능은 스케줄러를 이용해서 구현할 수 있다고 하여 관련 포스트를 찾아 보았다. 출처: http://webinformation.tistory.com/6 [끄적끄적]

Crontab

[분] [시] [일] [월] [요일] [실행하고자 하는 명령어]

분(0~59), 시(0~23), 일(1~31), 요일 (1~7{월~일})

위와 같은 구조로 실행하고자 하는 명령어를 예약할 수 가 있으며, crontab 을 사용하는 방법에는 두가지가 있습니다.

vim /etc/crontab 을 이용해서 예약하기

[root@localhost ~]# vim /etc/crontab


* 01 */1 * * /usr/local/bin/php -f /home/user/sync.php


위 명령어는 매일 새벽 1시에 sync.php 파일이 실행되도록 한 것입니다.

:wq 명령어를 이용해서 저장하고 나오시면 끝!

해당 방법은 별도의 추가 작업이 필요없으며 그냥 저장하고 나오시면 자동으로 적용이 됩니다.

crontab -e 를 이용해서 예약하기

[root@localhost ~]# crontab -e


* 01 * * 1 /usr/local/bin/php -f /home/user/sync.php


위 명령어는 월요일 새벽 1시에 sync.php 파일이 실행되도록 한 것입니다.

:wq 명령어를 이용해서 저장하고 나오시면 끝!

해당 방법은 아래와 같은 실행 및 재 시작의 명령어를 추가로 수행해야 합니다.

실행, 종료, 재 시작 명령어

[root@localhost ~]# /etc/rc.d/init.d/crond start
[root@localhost ~]# /etc/rc.d/init.d/crond stop
[root@localhost ~]# /etc/rc.d/init.d/crond restart

위의 내용을 참고하여 일단 테스트로 * * * * * sh /game/project/test.sh  라고 
저장하였다. test.sh엔 
echo "Hello World" > hello.txt
가 저장되어있다.

예상대로라면 1분마다 Hello World라고 hello.txt 에 저장해야하는데 아무런 변화가 없다.
crontab -l 을 실행해보니 “no crontab for root” 라고 나온다. 

서치결과 "crontab -u root -e” 명령어로 새로운 크론탭을 적용했다.
다시 crontab -l 을 실행하니 제대로 * * * * * sh /game/project/test.sh 가 나왔다. 

cat /var/log/cron을 실행해보니 뭔가 1분마다 동작하고 있었지만 
여전히 hello.txt파일은 존재하지 않았다. 경로가 잘못된 듯하여 home을 기준으로 절대 경로를 삽입하였다.

* * * * * sh home/user/game/project/test.sh  잘된다.

이어서 일요일에 1번 실행시키기 위해 59 23 * * * php /home/user/game/project/resetRanking.php 를 설정했다.
이제 페이스북 랭킹을 초기화하는 로직만 작성하면된다.


랭킹 초기화하는 페이스북 API 호출하기

먼저 페이스북 PHP SDK를 깔아야한다. 안에 있는 src폴더를 서버에 복사한다.
그리고 mbstring 이라는 php모듈? 을 설치한다. (sudo yum install php56-mbstring) php 버전에 따라 다르게 설치한다. 이것때문에 한참을 해맸다.

이후에 유저 전체의 스코어를 모두 초기화 하는 스크립트를 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    error_reporting(E_ALL);
 
    ini_set("display_errors"1);
 
    require_once __DIR__ . '/php-graph-sdk-5.0.0/src/Facebook/autoload.php';
 
    $fb = new Facebook\Facebook(['app_id' => ‘xxx',
                                'app_secret' => ‘xxx',
                                'default_graph_version' => ‘xxx']);
    $fbApp = $fb->getApp();
    $fb->delete('/app/scores/', [], $fbApp->getAccessToken());
cs
 

사실 위의 app accesstoken을 어디서 어떻게 가져와야 할지 몰라 한참을 해맸다.
결국 잘되는 것을 확인했다.

이제 웹에서  경로를 통해 php를 실행하는 것을 막아야한다. ( 웹에서 누구나 접근하여 게임의 스코어를 날릴수 있다면 큰일이다. )
여러 방법이 있겠지만  
웹에서 접근하지 못하는 경로에 추가하였다.


'All > Project' 카테고리의 다른 글

지금까지 개발된 내용  (0) 2017.04.08
Laviah  (0) 2017.04.08
UI_ HealthBarUI  (0) 2016.04.12
UI_ MyButton  (0) 2016.04.12
별게임의 상태트리  (0) 2016.04.12

+ Recent posts