0

私は最近ここで尋ねました:どのウェブサイトがphpによって提供される外部画像を要求するかを知る方法は?

サードパーティのWebサイトは、次のような画像を要求します。

<img src="http://www.myserver.com/mypage.php?api=APIKEY&text=some-text-here" alt=""/>

特定のAPIキーへのアクセスを1時間ごとおよび1日ごとに制限する必要があります。

今、私はmysqlDBにいくつかのデータを保存しました:

id、apikey、limit_ip、limit_referer、limit_hour、limit_day

1、JFKHJSDLGHUFIE、127.0.0.1、*、250、10000

<?php

//Verify Referer
if(
    !isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == "" ||
    !isset($_GET['apik']) || $_GET['apik'] == "" ||
    !isset($_SERVER['REMOTE_ADDR']) || $_SERVER['REMOTE_ADDR'] == "") {
        exit("API error, your referer informations aren't set");
} else {
    //Site referer
    $site = $_SERVER['HTTP_REFERER'];
    //Ip referer
    $ip = $_SERVER['REMOTE_ADDR'];
    //Get api key
    $apik = htmlentities($_GET['apik']);
    
    try
    {
        $options = array(
            PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8"
        );
        //MySQL connection
        $bdd = new PDO('mysql:host=localhost;dbname=apitest', 'root', '', $options);
    }
    catch(Exception $e)
    {
        //If error, die
        die('Error: '.$e->getMessage());
    }
    
    
    //Lookup for the apikey in the database
    $answer = $bdd->query('SELECT * FROM apiCode WHERE apikey = "'.$apik.'" LIMIT 0,1');
    //Fetch settings for this api key
    while ($data = $answer->fetch()) {
        $limit_ip = $data['limit_ip'];
        $limit_referer = $data['limit_referer'];
        $limit_hour = $data['limit_hour'];
        $limit_day = $data['limit_day'];
    }
    
    //Verify API limits
    //Cookie, session, database? 
    
    
    //Return content
    echo "Api : Success!";
    
}

最善の方法は、データベースに次のようなテーブルを作成することだと思います。

id、access_hour、access_day

cronジョブなどを使用して1時間ごとにaccess_hourフィールドをリセットしますが、MySQLは非常に低速であり、高速である方がよいため、コンテンツの提供にははるかに時間がかかります:)。

Cookieはリモートコンピュータに保存されるため、信頼性は低くなります。

セッションの継続時間は15分です...したがって、アクセスを保存および制限するには短すぎます。

上記のすべてのステートメントは、私の観点からのみです。

私の質問は、提供速度に影響を与えることなく、特定のAPIキーへのアクセス数を1時間ごとおよび1日ごとに保存および制限する方法です。

  • なし:高速で信頼性が高い必要があります。
4

1 に答える 1

2

私はこのデータをmysqlに入れません。この種の情報には、耐久性や永続性は必要ありません。memcachedを使用し、次のようなアルゴリズムを使用することをお勧めします。

http://en.wikipedia.org/wiki/Leaky_bucket

于 2012-10-06T06:06:14.313 に答える