並行性の高いシナリオでは、ユーザーは頻繁にボタンをクリックしたり、フォームを送信したりすることがあります。これにより、サーバーは複数の同一のリクエストを受信し、データの提出が繰り返される可能性があります。この問題を効果的に解決するために、「アンチシェイク」と呼ばれるテクノロジーを使用できます。このテクノロジーは、ユーザーによる繰り返しトリガーイベントによって引き起こされる重複の提出問題を回避するのに役立ちます。
アンチシェイクテクノロジーは、イベント処理メカニズムであり、主に遅延時間を設定し、その間にイベントが再びトリガーされた場合にタイミングが再び開始されます。対応する操作は、イベントが一定期間再び発砲しない場合にのみ実行されます。データの提出のシナリオでは、このテクノロジーは、ボタンをクリックしたり、フォームを複数回提出したりするときに、ユーザーによって引き起こされる繰り返しのデータ送信の問題を効果的に回避できます。
PHPでは、セッションやRedisなどのキャッシュメカニズムを介してアンチシェイクステータスを記録して、指定された時間間隔内で重複した提出が発生しないようにします。セッションを使用したアンチシェイク処理のサンプルコードは次のとおりです。
<?php
// アンチシェイク時間間隔,秒単位のユニット
$debounceInterval = 5;
// キー名をキャッシュします
$cacheKey = 'submit_debounce_key';
// アンチシェイクマークを確認してください
if (!isset($_SESSION[$cacheKey])) {
// 存在しない場合,アンチシェイクマークを設定します,有効期限を設定します
$_SESSION[$cacheKey] = 1;
$_SESSION[$cacheKey . '_expire'] = time() + $debounceInterval;
// 対応する操作を実行します
// TODO: フォームの送信ロジックの処理
// クリアアンチシェイクマーク
unset($_SESSION[$cacheKey], $_SESSION[$cacheKey . '_expire']);
} else {
// アンチシェイクマークが存在します,有効期限が切れているかどうかを判断します
if ($_SESSION[$cacheKey . '_expire'] <= time()) {
// 有効期限が切れたアンチシェイクマーク,リセット
unset($_SESSION[$cacheKey], $_SESSION[$cacheKey . '_expire']);
$_SESSION[$cacheKey] = 1;
$_SESSION[$cacheKey . '_expire'] = time() + $debounceInterval;
// 対応する操作を実行します
// TODO: フォームの送信ロジックの処理
// クリアアンチシェイクマーク
unset($_SESSION[$cacheKey], $_SESSION[$cacheKey . '_expire']);
} else {
// 期限切れにならない場合,これは、このリクエストが繰り返される提出であることを意味します,処理を行うことはできません,または、対応するプロンプト情報を返します
echo '提出を繰り返さないでください';
exit;
}
}
?>
このコードの例では、最初にアンチシェイク時間間隔「$ debounceInterval」を定義し、キャッシュキー名「$ cachekey」を設定します。フォームを初めて送信すると、システムはセッションでアンチシェイクマークを設定し、マークの有効期限を設定します。次にフォームが送信されると、システムはアンチシェイクマークが存在し、期限切れになったかどうかを確認します。有効期限が切れた場合は、マークをリセットしてフォーム送信ロジックを実行します。有効期限が切れていない場合、プロンプトの「繰り返し提出しない」が返されます。
アンチシェイクテクノロジーは、高い並行性シナリオでの繰り返しデータ提出の問題を効果的に解決でき、合理的なキャッシュメカニズムはシステムの安定性とユーザーエクスペリエンスを大幅に改善できます。 PHPは、アンチシェイクテクノロジーを実装するためのシンプルで使いやすい方法を提供し、開発者はプロジェクトのニーズに応じて柔軟に調整することができます。