
Limitrr PHP は、私が NodeJS 用に作成した別のライブラリである Limitrr から非常に大きな影響を受けています。そちらはこちらで確認できます。
Limitrr PHP を使用すると、アプリケーションにレート制限を簡単に統合できます。他の類似パッケージとは異なり、このユーティリティはリクエスト数だけでなく完了したアクション数(例:一定期間内に正常に作成できるアカウント数)でも制限でき、しかもカスタムオプションで制限を設定できます。さらに、カスタムディスクリミネーターも使用できるため、ユーザーの IP だけで制限する必要はもうありません。
このライブラリは、SlimPHP プロジェクト内にある様々なルートを簡単にレート制限するためのミドルウェア機能も提供します。
このプロジェクトを気に入っていただけましたら、GitHub で 🌟 を付けてください。
プルリクエストを歓迎します
ターミナルで次のコマンドラインを実行すると、limitrr-php ライブラリをインストールできます(composer がインストールされている前提です)。
composer require eddiejibson/limitrr-php "^1.0"
require "/vendor/autoload.php"; //Require composer's autoload
$options = [
//Redis keystore information
"redis" => [
"host" => "666.chae.sh",
"port" => 6379,
"password" => "supersecret",
],
"routes" => [
"default" => [
"requestsPerExpiry" => 5,
],
],
];
//Initialize the Limitrr class and pass the options defined above into it
//Note that the options are not required.
$limitrr = new \eddiejibson\limitrr\Limitrr($options);
//Various examples like this can be found further into the documentation,
//for each function.
$result = $limitrr->get(["discriminator" => $ip]);
echo $result["requests"] + " Requests";
echo $result["completed"] + " Completed";
//Note that this library is no means just for SlimPHP, it just happens to
//provide a middleware function for those who may need it.
//Usage within SlimPHP
$app = new Slim\App();
//Use the Limitrr SlimPHP middleware function, if you wish:
$app->add(new \eddiejibson\limitrr\RateLimitMiddleware($limitrr)); //Make sure to pass in the main Limitrr
//instance we defined above into the middleware function. This is mandatory.
//You can also add the get IP middleware function, it will append the user's real IP
//(behind Cloudflare or not) to the request.
$app->add(new \eddiejibson\limitrr\getIpMiddleware());
//Example usage within a route
$app->get("/hello/{name}", function ($request, $response, $args) {
$name = $args["name"];
$ip = $request->getAttribute('realip'); //Get the IP that was defined within Limitrr's get IP middleware function
return $response->getBody()->write("Hello, ${name}. Your IP is ${ip}.");
});
//You do not have to app the middleware function to every single route, globally.
//You can do it indivually, too - along with passing options into such. Like so:
$app->get("/createUser/{name}", function ($request, $response, $args) {
//Non intensive actions like simple verification will have a different limit to intensive ones.
//and will only be measured in terms of each request via the middleware.
//No further action is required.
if (strlen($args["name"]) < 5) {
//Dummy function creating user
$res = $someRandomClass->registerUser();
if ($res) {
//Intensive actions like actually registering a user should have a
//different limit to normal requests, hence the completedActionsPerExpiry option.
//and should only be added to once this task has been completed fully
//In this example, we will be limiting the amount of completed actions a certain IP can make.
//Anything can be passed in here, however. For example, a email address or user ID.
//$request->getAttribute('realip') was determined by calling the middleware earlier - getIpMiddleware()
$limitrr->complete(["discriminator"] => $ip);
}
}
})->add(new \eddiejibson\limitrr\RateLimitMiddleware($limitrr, ["route"=>"createUser"]));
//You can also pass the route name within the limitrr middleware function
$app->run();
戻り値: 配列
$limitrr->get([
"discriminator" => $discriminator, //Required
"route" => $route, //Not required, default is assumed
"type" => $type //Not required
]);
関数には配列を介して渡す必要があります
default ルートからカウントを取得します。requests または completed のいずれかを指定すると、その値のみが整数として返されます。$limitrr->get([
"discriminator" => $discriminator,
"type" => $type,
"route" => $route
]); //Besides discriminator, all parameters are optional.
//If type is not passed into the function, it will
//return both the amount of requests and completed actions
//Where discriminator is the thing being limited
//e.g x amount of completed actions/requests per discriminator
$limitrr->get(["discriminator" => $discriminator]);
//This tends to be the user's IP.
$limitrr->get(["discriminator" => $ip]);
//This will return both the amount of requests and completed actions stored under the
//discriminator provided in an object. You can handle like this:
$result = $limitrr->get(["discriminator" => $ip]);
echo $result["requests"] + " Requests";
echo $result["completed"] + " Completed";
//The above example would get the request and completed task count from the default
//route. If you would like to retrieve values from a different route, you can specify
//this as well. It can be done like this:
$result = $limitrr->get(["discriminator" => $ip, "route" => "exampleRouteName"]);
echo $result["requests"] . " Requests made through the route exampleRouteName";
echo $result["completed"] . " Completed Tasks made through the route exampleRouteName";
//You may also only fetch only one type of value - instead of both requests and completed.
$result = $limitrr->get(["discriminator" => $ip, "route" => "exampleRouteName", "type" => "completed"]);
echo $result["completed"] . " Completed tasks made through the route exampleRouteName";
戻り値: 整数
$limitrr->get([
"discriminator" => $discriminator, //Required
"route" => $route, //Not required, default is assumed
]);
関数には配列を介して渡す必要があります
default ルートからカウントを取得します。戻り値: ブール値
$limitrr->reset([
"discriminator" => $discriminator, //Required
"route" => $route, //Not required, default is assumed,
"type" => $type //Not required
]);
関数には配列を介して渡す必要があります
default ルートからカウントをリセットします。requests または completed です。設定しない場合は、両方とも削除されます。//Where discriminator is the thing being limited
//e.g x amount of completed actions/requests per discriminator
//This will remove both the amount of requests and completed action count
$limitrr->reset(["discriminator" => $discriminator]);
//This tends to be the user's IP.
$limitrr->reset(["discriminator" => $ip]);
//If you wish to reset counts from a particular route, this can be done as well.
//As the type is not specified, it will remove both the request and completed count
$result = $limitrr->reset([
"discriminator" => $ip,
"route" => "exampleRouteName"
]);
if ($result) {
echo "Requests removed from the route exampleRouteName";
} else {
//Do something else
}
//If you want to remove either one of the amount of requests or completed actions.
//but not the other, this can be done as well.
//The value passed in can either be "requests" or "completed".
//In this example, we will be removing the request count for a certain IP
$result = $limitrr->reset([
"discriminator" => $ip,
"type" => "requests"
]);
if ($result) {
echo "Request count for the specified IP were removed"
} else {
//do something else
}
必須: false
型: 配列 または 文字列
説明: Redis の接続情報。
Redis インスタンスの URI を含む文字列、または接続情報を含むオブジェクトのいずれかを渡します:
6379"127.0.0.1"""0 //Pass in a string containing a redis URI.
"redis" => "redis://127.0.0.1:6379/0"
//Alternatively, use an array with the connection information.
"redis" => [
"port" => 6379, //Redis Port. Required: false. Defaults to 6379
"host" => "127.0.0.1", //Redis hostname. required: False. Defaults to "127.0.0.1".
"password" => "mysecretpassword1234", //Redis password. Required: false. Defaults to null.
"database" => 0 //Redis database. Required: false. Defaults to 0.
]
必須: false
型: 配列
説明: Limitrr に関する各種オプション。
"limitrr"429(Too Many Requests)"options" => [
"keyName" => "myApp", //The keyname all of the requests will be stored under. Required: false. Defaults to "limitrr"
"errorStatusCode" => 429 //Should important errors such as failure to connect to the Redis keystore be caught and displayed?
]
必須: false
型: 配列
説明: ルートの制限を定義します。
routes オブジェクト内には、多数の個別ルートを定義し、それぞれにカスタムルールを設定できます。設定できるカスタムルールは次のとおりです。
100requestsPerExpiry の値、設定されていない場合は 5 です。-1 に設定すると、値は期限切れにならず、無期限にそのまま保持されるか、手動で削除する必要があります。デフォルト: 900(15 分)-1 に設定すると、そのような値は期限切れにならず、無期限にそのまま保持されるか、手動で削除する必要があります。デフォルトは expiry の値、設定されていない場合は 900(15 分)です。requests に文字列が設定されていない場合、デフォルトは "As you have made too many requests, you are being rate limited." になります。さらに、 に値が設定されていない場合は、 内の文字列が使用されます。それも設定されていない場合は、 が値になります。"routes" => [
//Overwrite default route rules - not all of the keys must be set,
//only the ones you wish to overwrite
"default" => [
"expiry": 1000
],
"exampleRoute" => [
"requestsPerExpiry" => 100,
"completedActionsPerExpiry" => 5,
"expiry" => 900,
"completedExpiry" => 900,
"errorMsgs" => [
"requests" => "As you have made too many requests, you are being rate limited.",
"completed" => "As you performed too many successful actions, you have been rate limited."
]
],
//If not all keys are set, they will revert to
//the default values
"exampleRoute2" => [
"requestsPerExpiry" => 500
]
]
completedrequests"As you performed too many successful actions, you have been rate limited."