ユーザー名/ログインのないカートデータを保持するeコマースサイトでは、PHP $ _SESSION変数またはブラウザーCookieを使用してショッピングカート内のアイテムを保持する方が良いでしょうか?クッキーは無効にできるため、$ _ SESSIONに傾いていますが、あなたからの意見を聞きたいと思っています。
よろしくお願いします。
大規模なサイトでは、ユーザーのカートをセッションやCookieに保存することはありません。そのデータは貴重なものです。
顧客が購入しているもの、アイテムを選択したとき、購入した数、チェックアウトを完了しなかった理由など。すべてvery、veryあなたのビジネスにとって重要です。
データベーステーブルを使用してこの情報を保存し、ユーザーのセッションにリンクします。そうすれば、情報を失うことなく、ユーザーのカートに基づいて戻って統計を作成したり、チェックアウトプロセスの問題を解決したりできます。
可能なすべてをログに記録します。
以下は、これがデータベースレベルでどのように見えるかの簡単な例です。
user {
id
email
}
product {
id
name
price
}
cart {
id
product_id
user_id
quantity
timestamp (when was it created?)
expired (is this cart still active?)
}
また、カートテーブルを複数のテーブルに分割して、カートのリビジョンを追跡することもできます。
通常PHPセッションは2つの部分で構成されます
したがって、それは$_SESSION
vs $_COOKIE
ではなく、$_SESSION
+$_COOKIE
= "session"です。ただし、データを含む単一の暗号化されたCookieを使用してこれを変更する方法があります(したがって、データを見つけるために識別子は必要ありません)。別の一般的なアプローチは、データを複数のサーバーがアクセスできるように、ファイルシステムではなくmemcachedまたはデータベースに保存することです。
@ Travesty3が言っているのは、two Cookie-セッション用のものと、「ログイン状態を維持する」Cookie(セッションCookieよりも長く存在するもの)、または個別のCookie内のデータのコピー。
Xeoncrossが指摘したように、分析のために可能な情報を保存することは非常に重要です。したがって、セッションとCookieに完全に依存するべきではありません。
可能なアプローチは
ログインしていない場合はセッションを使用
ユーザーがログインしていない場合、PHPの$_SESSION
を使用して、セッションからカートアイテムとウィッシュリストアイテムを保存および取得できます。
ログイン時にデータベースを使用
ユーザーがログインしている場合、2つのオプションのいずれかを検討できます-
ユーザーがログインするとき
ユーザーがログインしたら、すべてのカートアイテムとウィッシュリストアイテムをセッションから取得し、データベースに保存します。
これにより、ユーザーがログアウトまたはマシンを変更してもデータは永続的になりますが、ユーザーがログインしない限り、情報を永続的に保存する方法がないため、永続的ではありません。
必要なデータの取得
カートまたはウィッシュリストにアクセスしようとするたびに、次のチェックを行います-
セッションに保存します。私のウィッシュリストはかなり長く、COOKIEが占有する4Kストレージに収まらないのではないかと心配しています。セッションのタイムアウトをより長い期間に設定する必要があります。
注:Cookieについて非常に厳しいポリシーを設定している国(オランダなど)がいくつかあります。法律によってセッションの使用を強制される場合があります。
役立ついくつかのポイント:
Cookie:
セッション:
私は個人的にはセッションに参加します。これは、中小規模のオーディエンスページであると想定しているためです。大きくなった場合は、単純なDB構造を使用してこのデータを保存し、不要なデータの山を取得するメンテナンスプラン(たとえば、一部の製品を選択したがチェックアウトを行わないクライアント)を使用することをお勧めします。
両方の使用を検討してください。
$_SESSION
の欠点は、ブラウザーを閉じるとセッションがクリアされることです。
セッションを使用しますが、利用可能な場合はCookieから$ _SESSIONデータを入力しようとします。
セッションを使用します。ユーザーのCookieが無効になっている場合、セッションIDはユーザーのマシンのCookieに保存されるため、セッションは開始できません。
セッションをより長く維持しようとするために、見たい設定がいくつかあります。
ユーザーがブラウザを閉じるときに、lifetime
パラメーターを設定して session_set_cookie_params()
を実行することにより、セッションCookieが削除されないようにします。この関数は session_start()
の前に実行する必要があります
セッションガベージコレクションの設定を変更して、サーバーからセッションがクリアされる頻度を拡張することもできます _session.gc_probability, session.gc_divisor, session.gc_maxlifetime
_ php.iniで、または ini_set()
を使用して
サーバーで他のWebサイトを実行しており、上記のガベージコレクション設定を変更する場合、すべてのWebサイトに適用されるようにphp.iniで設定する必要があります。またはini_set()
を使用している場合は、 session_save_path()
を変更して、これらのセッションを他のWebサイトとは異なるディレクトリに保存します。繰り返しますが、これはsession_start()
の前に実行されます。これにより、他のWebサイトのガベージコレクションによって、特定のサイトの拡張セッションがクリアされるのを防ぎます。
Php.ini _session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512
_で次のセッション設定を設定することもお勧めします。これにより、非常に小さな衝突の可能性を持つ暗号的に強力なセッションIDが得られます。
また、セッションIDに対する中間者攻撃を防ぐために、サイトにSSL証明書があることを確認してください。
明らかに、ユーザーはセッションID Cookieを使用するすべてのCookieを手動でクリアすることを決定できますが、それは私が準備するリスクです。ショッピングカートシステムの途中でチェックアウトしていなかった場合、Cookieを消去しません。セッションはプレーンCookieを使用するよりも優れていると考えています。
セッションディレクトリにアクセスできる唯一のWebサイトであり、セッションIDが強力である限り、データは十分に安全です。また、サーバーのセッションストレージ時間を延長することにより、データをサーバーに保持できます。
セッションをさらに強化するために使用できる手段がさらにあります。 20分ごとにセッションIDを再生成し、データをコピーします。また、データベースのIPアドレスに対するセッションIDを記録し、特定のIPアドレスがセッションIDをブルートフォースしようとするのを防ぐために、特定の時間内にXを超えるセッションIDを送信しようとするかどうかを確認します。
サーバー上のセッションファイルではなく、セッションIDでリンクされたデータベースにデータを保存することもできます。ただし、これはまだCookieに保存されているセッションIDに依存しており、いつでも消える可能性があります。ユーザーがカートを紛失しないことを確実に保証する唯一の方法は、最初にログインしてデータベースに保存することです。