Ich schreibe eine Menge API, um Daten abzurufen und zu speichern.
Ich mag die Standardeinstellung throttle
Möglichkeit:
protected $middlewareGroups = [
'api' => [
'throttle:60,1',
'bindings',
],
];
die Anfrage auf 60 pro Minute zu begrenzen; aber für einige Strecken (zB: POST
), möchte ich diesen Wert erhöhen.
Ich habe versucht einzustellen 'throttle:500,1'
auf Route Middleware wie unten:
Route::group(function () {
Route::get('semaphore/1', ['uses' => 'App\Api\V1\DBs\SemaphoreController@index']);
Route::post('semaphore/1', ['uses' => 'App\Api\V1\DBs\SemaphoreController@store', 'middleware' => 'WriteToDatabaseMiddleware', 'throttle:500,1']);
});
aber es funktioniert nicht.
Irgendeine Idee?
Vielen Dank.
AKTUALISIEREN:
Mir ist aufgefallen, dass die 'throttle:500,1'
verwendet in der api.php
Die Route wird NACH der Standardeinstellung festgelegt 'throttle:60,1'
angegeben in Kernel.php
Datei; dann, Es funktioniert nicht.
Protokollierung der Prozessausführung, der erste Aufruf lautet:
Illuminate\Routing\Middleware\ThrottleRequests -> handle
aus Kernel.php
hat maxAttempts=60
.
Der zweite Aufruf lautet dann:
Illuminate\Routing\Middleware\ThrottleRequests -> handle
aus api.php
hat maxAttempts=500
.
Mit anderen Worten, die throttle:500,1
in dem api.php
Datei nicht überschreiben throttle:60,1
in dem Kernel.php
Datei.
Aktuelle Antwort
Entsprechend dieses GitHub-Problemdie Throttle-Middleware sollte nicht “zweimal” verwendet werden (wie Sie das tun möchten). Es gibt nur zwei Möglichkeiten, Ihr aktuelles Problem „richtig“ zu lösen:
- Schreiben ein eigenes Drosselung von Middleware
oder
- Definieren Sie die Throttle-Middleware separat für jede Strecke (Gruppe)
Alte Antwort
Sie haben den Middleware-Schlüssel falsch eingestellt! Wenn Sie mehrere Middleware zur Verwendung deklarieren, erstellen Sie ein neues Array für sie
['middleware' => ['WriteToDatabaseMiddleware','throttle:500,1']]
BEARBEITEN: Aufgrund der Middleware-Reihenfolge sollten Sie Ihre Kernel-Drosselung auf setzen Höchster Wert Sie verwenden möchten, und alle anderen Routen, die eine haben sollten unteren Drosselwert zu den entsprechenden.
In Laravel 6 können Sie Präfix verwenden, um mit globaler Drosselung zu verhindern. verwenden 'throttle:5,1,prefix'
Route::group(['prefix' => 'contact-us', 'middleware' => 'throttle:5,1,contact-form',], function () {
Route::post("https://stackoverflow.com/", 'ContactUsController@store');
});
Erlauben Sie mehrere Drosseln durch Benennung
Keine der aktuellen Antworten erklärt das Verhalten von Laravel 5.x. In dieser Version verwendet jede Instanz von “throttle” denselben Bucket. Wenn Sie also einen Gasbefehl an zwei verschiedenen Stellen platzieren, wirkt sich dies auf jede Instanz aus.
In Betracht ziehen:
// User can email 5 times an hour
Route::post('/email', 'Ctrl@email')->middleware('throttle:5,60');
// User can search 100 times an hour
Route::get('/search', 'Ctrl@search')->middleware('throttle:100,60);
Wenn ein Benutzer innerhalb von 5 Minuten fünfmal sucht, kann er in der nächsten Stunde keine E-Mail senden.
In Laravel 5.x führt kein Weg daran vorbei. Ab Laravel 6 Sie haben die Möglichkeit hinzugefügt, Drosseln zu benennenihnen getrennte Eimer gebend.