Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आईपी-आधारित कोल्डाउन अवधि प्रदान करने का एक पोर्टेबल तरीका?

फ़ाइल का उपयोग करके मैंने इसे अभी के लिए इस तरह हल किया।

प्रक्रिया

  1. क्लाइंट आईपी प्राप्त करें और इसे हैश करें (फ़ाइल रीडआउट को रोकने के लिए)।
  2. आईपी फ़ाइल खोलें और प्रत्येक पंक्ति को स्कैन करें
  3. वर्तमान रिकॉर्ड के समय की वर्तमान समय से तुलना करें
  4. यदि अंतर सेट टाइमआउट गोटो 5 से अधिक है, अन्यथा 7.
  5. यदि आईपी क्लाइंट से मेल खाता है, तो अपडेटेड रिकॉर्ड बनाएं, अन्यथा
  6. ड्रॉप रिकॉर्ड।
  7. यदि आईपी क्लाइंट से मेल खाता है, तो विफलता संदेश प्रदान करें, अन्यथा रिकॉर्ड कॉपी करें।

उदाहरण कोड

<?php

$sIPHash    = md5($_SERVER[REMOTE_ADDR]);
$iSecDelay  = 10;
$sPath      = "bucket.cache";
$bReqAllow  = false;
$iWait      = -1;
$sContent   = "";

if ($nFileHandle = fopen($sPath, "c+")) {
    flock($nFileHandle, LOCK_EX);
    $iCurLine = 0;
    while (($sCurLine = fgets($nFileHandle, 4096)) !== FALSE) {
        $iCurLine++;
        $bIsIPRec = strpos($sCurLine, $sIPHash);
        $iLastReq = strtok($sCurLine, '|');
        // this record expired anyway:
        if ( (time() - $iLastReq) > $iSecDelay ) {
            // is it also our IP?
            if ($bIsIPRec !== FALSE) {
                $sContent .= time()."|".$sIPHash.PHP_EOL;
                $bReqAllow = true;
            }
        } else {
            if ($bIsIPRec !== FALSE) $iWait = ($iSecDelay-(time()-$iLastReq));
            $sContent .= $sCurLine.PHP_EOL;
        }
    }
}

if ($iWait == -1 && $bReqAllow == false) {
    // no record yet, create one
    $sContent .= time()."|".$sIPHash.PHP_EOL;
    echo "Request from new user successful!";
} elseif ($bReqAllow == true) {
    echo "Request from old user successful!";
} else {
    echo "Request failed! Wait " . $iWait . " seconds!";
}

ftruncate($nFileHandle, 0);
rewind($nFileHandle);
fwrite($nFileHandle, $sContent);
flock($nFileHandle, LOCK_UN);
fclose($nFileHandle);
?>

टिप्पणी

नए उपयोगकर्ता

यदि IP हैश किसी रिकॉर्ड से मेल नहीं खाता है, तो एक नया रिकॉर्ड बनाया जाता है। ध्यान दें:यदि आपके पास ऐसा करने का अधिकार नहीं है तो एक्सेस विफल हो सकता है।

स्मृति

यदि आप अधिक ट्रैफ़िक की अपेक्षा करते हैं, तो यह सब एक साथ।

अनावश्यक कोड

"लेकिन मिनक्सोमैट", आप कह सकते हैं, "अब प्रत्येक क्लाइंट पूरी फाइल के माध्यम से लूप करता है!"। हां, वास्तव में, और इसी तरह मैं इसे अपने समाधान के लिए चाहता हूं। इस तरह, हर क्लाइंट पूरी फाइल की सफाई के लिए जिम्मेदार होता है। फिर भी, प्रदर्शन प्रभाव कम रखा जाता है, क्योंकि यदि प्रत्येक ग्राहक सफाई कर रहा है, तो फ़ाइल का आकार पूर्ण न्यूनतम रखा जाएगा। इसे बदलें, अगर यह तरीका आपके लिए काम नहीं करता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पायथन के लिए MySQL कनेक्टर

  2. ज़ेबरा स्ट्राइप PHP MYSQL टेबल

  3. क्वेरी का चयन करें लेकिन रिकॉर्ड संख्या 3 से परिणाम दिखाएं

  4. अन्य फ़ील्ड के मान के रूप में MySQL डिफ़ॉल्ट मान

  5. फिल्मों को 2 चीजों के आधार पर छाँटना