


Exemple d'utilisation de la classe de limite de fréquence php
Le contenu de cet article concerne les exemples d'utilisation de la classe de limite de fréquence PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Par exemple :
Atteindre une limite d'adresse IP unique d'une fois toutes les 60 secondes
Un seul mot-clé, tel qu'un numéro de téléphone mobile, est limité à une fois toutes les 60 secondes, et 10 fois toutes les 3600 secondes
<?php class Sina_Mail_WebAntispam { const PREFIX_WHITELIST = 'w:'; const PREFIX_KILL = 'k:'; const PREFIX_VERIFYCODE = 'c:'; const PREFIX_VERIFIED = 'v:'; const STATUS_UPDATE = '[U]'; private $mc = null; private $config = null; private $whitelist = array(); private $keyPrefix = ''; private $intervals = array(); private $updates = array(); private $status = array(); public function __construct($mc, $config) { $this->mc = $mc; $this->config = $config; if (isset($this->config->prefix)) { $this->keyPrefix = $this->config->prefix; } if (isset($this->config->whitelistKey)) { $wls = $this->mc->get($this->config->whitelistKey); if (!empty($wls)) { $this->whitelist = & $wls; } } } public function setWhitelist(&$whitelist) { $this->whitelist = & $whitelist; } /*验证限制规则*/ public function check($ip = null, $key = null) { if (!$ip && !$key) { return false; } if ($key) { if (!is_array($key)) { $keys = array($key); } else { $keys = $key; } } // first filter by whitelist if (!empty($this->whitelist)) { if ($ip && $this->filterByWhitelist($ip, 'ip')) { $this->status[self::PREFIX_WHITELIST . $ip] = 1; return true; } if ($keys) { foreach ($keys as $key) { if ($this->filterByWhitelist($key, 'key')) { $this->status[self::PREFIX_WHITELIST . $key] = 1; return true; } } } } if ($ip) { $ip = $this->keyPrefix . $ip; } // second, check verified ok if (!empty($this->config->verified)) { if ($ip && $this->mc->get(self::PREFIX_VERIFIED . $ip)) { $this->status[self::PREFIX_VERIFIED . $ip] = 1; return true; } if ($keys) { foreach ($keys as $key) { $verifiedKey = self::PREFIX_VERIFIED . $this->keyPrefix . $key; if ($this->mc->get($verifiedKey)) { $this->status[$verifiedKey] = 1; return true; } } } } $kos = !empty($this->config->kill); // check killed if ($kos) { if ($ip && $this->mc->get(self::PREFIX_KILL . $ip)) { $this->status[self::PREFIX_KILL . $ip] = 1; return false; } if ($keys) { foreach ($keys as $key) { $killKey = self::PREFIX_KILL . $this->keyPrefix . $key; if ($this->mc->get($killKey)) { $this->status[$killKey] = 1; return false; } } } } // check ip rule if ($ip && isset($this->config->ip)) { if (!$this->checkRule($ip, $this->config->ip)) { if ($kos && $this->mc->set(self::PREFIX_KILL . $ip, 1, intval($this->config->kill))) { $this->status[self::PREFIX_KILL . $ip] = 1; } return false; } } // check keys rule if ($keys && isset($this->config->key)) { foreach ($keys as $key) { if (!$this->checkRule($this->keyPrefix . $key, $this->config->key)) { $killKey = self::PREFIX_KILL . $this->keyPrefix . $key; if ($kos && $this->mc->set($killKey, 1, intval($this->config->kill))) { $this->status[$killKey] = 1; } return false; } } } return true; } /*更新限制规则*/ public function update($c = 1, $ip = null, $key = null) { if (is_null($ip) && is_null($key)) { if (!empty($this->updates)) { foreach ($this->updates as $k => $v) { if (!$v && isset($this->intervals[$k])) { if ($this->mc->add($k, $c, false,$this->intervals[$k])) { $this->status[self::STATUS_UPDATE . $k] = $c; continue; } } $r = $this->mc->increment($k, $c); $this->status[self::STATUS_UPDATE . $k] = $r; } } } else { if (!is_null($ip) && isset($this->config->ip)) { $rule = $this->config->ip; foreach ($rule as $interval => $limit) { $k = $this->keyPrefix . $ip . '_' . $interval; if ($this->mc->add($k, $c,false,$interval)) { $this->status[self::STATUS_UPDATE . $k] = true; continue; } $r = $this->mc->increment($k, $c); $this->status[self::STATUS_UPDATE . $k] = $r; } } if (!is_null($key) && isset($this->config->key)) { $rule = $this->config->key; if (!is_array($key)) { $keys = array($key); } else { $keys = $key; } foreach ($keys as $key) { foreach ($rule as $interval => $limit) { $k = $this->keyPrefix . $key . '_' . $interval; if ($this->mc->add($k, $c,false,$interval)) { $this->status[self::STATUS_UPDATE . $k] = true; continue; } $r = $this->mc->increment($k, $c); $this->status[self::STATUS_UPDATE . $k] = $r; } } } } } public function checkVerifyCode($key, $code) { $servcode = $this->mc->get(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key); if (strcasecmp($servcode, $code) == 0) { $verified = intval($this->config->verified); if ($verified > 0) { $r = $this->mc->set(self::PREFIX_VERIFIED . $this->keyPrefix . $key, 1, false, $verified); } else { $r = true; } if ($r) { $this->mc->delete(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key); } return $r; } return false; } public function isVerified($key) { $r = $this->mc->get(self::PREFIX_VERIFIED . $this->keyPrefix . $key); if (!empty($r)) { return true; } else { return false; } } public function setVerifyCode($key, $code) { $verifytime = intval($this->config->verifytime); if ($verifytime < 1) { return false; } return $this->mc->set(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key, $code, false, $verifytime); } public function getStatus() { return $this->status; } private function filterByWhitelist($value, $key) { // if (empty($this->whitelist[$key])) { // return false; // } // $ls = & $this->whitelist[$key]; $ls = & $this->whitelist; foreach ($ls as $i) { if ($i[strlen($i) - 1] == '.') { // ip segment if (strpos($value, $i) === 0) { return true; } } else { if (strcmp($i, $value) === 0) { return true; } } } return false; } private function checkRule($key, $rule) { $flag = true; if (!empty($rule)) { foreach ($rule as $interval => $limit) { $k = $key . '_' . $interval; $c = $this->mc->get($k); if (!$c) { $this->updates[$k] = 0; $this->intervals[$k] = $interval; $this->status[$k] = 0; } else { $this->updates[$k] = $c; $this->status[$k] = $c; if ($c >= $limit) { $flag = false; } } } } return $flag; } public static function getInstance($conf) { $mc = new Memcache(); $mc->connect("115.159.28.112"); $conf=json_decode(json_encode($conf)); return new self($mc, $conf); } } /* 单个ip限制60秒1次 单个关键字,比如手机号,限制60秒1次,3600秒10次 */ $conf=array( 'prefix' => 'selfservice:', 'key' => array(60 => 1,3600=>10), 'ip' => array(60 => 1), ); $spam=Sina_Mail_WebAntispam::getInstance($conf); if(!$spam->check('127.25.12.123',17610725730)){ echo "limit..."; exit; } //更新频率限制 $spam->update();
La clé de stockage finale dans memache
[Recommandé cours : Tutoriel vidéo PHP】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds









Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contrôler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plutôt que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de tâches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les coûts de communication et améliorer l'efficacité de la maintenance du code.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

La clé pour écrire de bons commentaires est d'expliquer "pourquoi" plutôt que "ce qui a été fait" pour améliorer la lisibilité du code. 1. Les commentaires devraient expliquer des raisons logiques, telles que les considérations derrière la sélection de la valeur ou le traitement; 2. Utilisez des annotations de paragraphe pour une logique complexe pour résumer l'idée globale des fonctions ou des algorithmes; 3. Maintenir régulièrement des commentaires pour garantir la cohérence avec le code, éviter les tromperies et supprimer le contenu obsolète si nécessaire; 4. Vérifiez de manière synchrone les commentaires lors de l'examen du code et enregistrez la logique publique via des documents pour réduire le fardeau des commentaires du code.

Les commentaires ne peuvent pas être négligents car ils veulent expliquer les raisons de l'existence du code plutôt que des fonctions, telles que la compatibilité avec les anciennes interfaces ou les restrictions tierces, sinon les personnes qui lisent le code ne peuvent s'appuyer que sur de la devinettes. Les zones qui doivent être commentées comprennent des jugements conditionnels complexes, une logique spéciale de gestion des erreurs et des restrictions de dérivation temporaires. Une façon plus pratique d'écrire des commentaires consiste à sélectionner des commentaires en une seule ligne ou à bloquer les commentaires en fonction de la scène. Utilisez des commentaires sur le bloc de documents pour expliquer les paramètres et les valeurs de retour au début des fonctions, des classes et des fichiers, et gardez les commentaires à jour. Pour une logique complexe, vous pouvez ajouter une ligne à la précédente pour résumer l'intention globale. En même temps, n'utilisez pas de commentaires pour sceller le code, mais utilisez des outils de contrôle de version.

PhpBlockComments est en train de faire en sorte

La première étape consiste à sélectionner le package d'environnement intégré XAMPP ou MAMP pour créer un serveur local; La deuxième étape consiste à sélectionner la version PHP appropriée en fonction des besoins du projet et de configurer la commutation de la version multiple; La troisième étape consiste à sélectionner VScode ou PhpStorm comme éditeur et déboguer avec xdebug; De plus, vous devez installer Composer, PHP_CODESNIFFER, PHPUNIT et d'autres outils pour aider au développement.
