私のウェブサイトのショップでは、商品がショッピング バスケットに追加または削除されると、商品の数量が調整されます。ただし、誰かがサイトにアクセスして 1 つのアイテムを 10 個ショッピング バスケットに追加し、それらの 10 個のアイテムを削除せずにサイトを離れた場合、そのアイテムはデータベースに戻されません。
誰かがバスケットからアイテムを削除する前にサイトを離れた場合、アイテムの数量が補充されるようにするにはどうすればよいですか? おそらくクロン?
ユーザーが商品をバスケットに入れたらすぐに商品を「予約」する必要がありますか?
ユーザーがアイテムを予約すると、予約された時刻がテーブルに格納されます。商品の在庫数を計算するときは、現在予約されている商品の数を差し引きます。
ユーザーがアイテムの代金を支払うとき/場合は、アイテムを予約済みテーブルから削除し、購入済みとしてマークします。
次に、cron を使用して、時間の経過後に予約済みテーブルに残っているすべてのアイテムを削除しますx
。
これの欠点は、ユーザーのバスケットが時間が経つと空になることx
です。そのため、アイテムの支払いにどれだけ時間が残っているかをユーザーに通知する必要があります。
これは、支払いが行われる前に在庫切れになる可能性が高い、需要の高いアイテムに適しています。例えばイベントチケット。
ユーザーが商品をバスケットに入れるときに予約済みとしてマークしないでください。また、ユーザーが商品の支払いをするときに在庫を再度確認してください。商品をカートに入れてから商品が在庫切れになっている場合は、エラーを表示します。
これはより簡単で、需要の少ない製品により適しています。
アイテムがカートに入れられてから X 時間ごとにクライアントのカートから要素を自動的に削除する cron ジョブを作成できますが、アクティブなユーザーがまだ使用しているカートからアイテムを削除する可能性があるため、見下される可能性があります。
また、JavaScript を使用して、ユーザーが Web サイトを閉じたり、X 時間 afk を行ったりするのをキャッチすることもできます。いずれかの要素がトリガーされたら、AJAX 呼び出しを行ってカートからアイテムを削除し、それに応じて Web サイトを更新できます。これは、「サイトを離れたとき」という質問に対する最も簡単な解決策のように思えますが、Cookie がクライアント自体によって破棄された場合、問題は実際には解決されません。
いずれにせよ、クライアント側のデータ、セッション、およびデータベースが同期され、アイテムが「孤立」せず、存在しないアイテムが購入されないようにする方法を検討する必要があります。
古いバケツ (たとえば、2 時間以上前に最後にアクセスされたもの) をクリーンアップし、それを cron で呼び出すスクリプトを作成します。
第 1 に、ユーザーがサイトを離れて戻ってこない時期を特定するのは非常に困難です。多くの方法がありますが、すべてが絶対確実というわけではありません。私が以下に詳述している私によると最高のもの:
訪問者は、登録ユーザーまたはまだサインアップしていない新規ユーザーです。コードは、カートの内容を、追加された時刻とともにデータベース テーブルに保存する必要があります。レコードは、登録済みまたは未登録のユーザーで識別される必要があります。登録すると、登録したユーザーのIDをカートテーブルに保存するだけなので簡単です。未登録ユーザーの場合は、Cookie を使用して、カート テーブルと Cookie の両方に ID を保存する必要があります。
ユーザーが特定の期間 (たとえば 1 時間) に出入りして戻ってきた場合、ユーザーはカートの内容をそのまま見ることができます。
それまでの間、1 時間以上経過したカートの中身を見つけて削除し、在庫を在庫に戻すスクリプトをコーディングする必要があります。このスクリプトを数分ごとに実行する cron をセットアップできます (例: 15 分など)。
このプロセスの実行後にユーザーが戻ってきた場合、カートには追加されたアイテムが含まれておらず、ユーザーはアイテムを再度追加する必要があります。
購入が完全に完了するまで、在庫から数量を削除しないでください。
これにはクッキーを使用してください。私はクライアントのショップでこの方法を使用しています。例: http://magazinsvarki.ru/