2

ユーザーセッションにいくつかのオブジェクトを格納するWebアプリがあるので、サーバーにAJAXヒットが発生するたびにデータベースを呼び出し続ける必要はありません。

ユーザーがブラウザタブを閉じるか、ページから移動したときにトリガーされるクリーンアップ/保存機能をいくつか作成したいと思います。

ユーザーがページから移動した場合、セッションは「破棄」されますか(つまり、含まれているオブジェクトに対して__destructを呼び出します)、またはユーザーが移動したときにAJAXリクエストを送信するJavaScriptでこのクライアント側を処理する方がよいでしょうか?

4

4 に答える 4

3

PHPセッションはサーバー側のものです。ページから離れて移動するクライアントのブラウザーは、AJAX呼び出しなどを明示的に行わない限り、サーバー側で何もトリガーしません。

于 2012-10-13T23:12:53.800 に答える
2

要するに:いいえ。セッションを終了する必要がありますsession_destroy()

于 2012-10-13T23:17:19.787 に答える
2

セッションは PHP にあり、クラスとして定義されていません。代わりに、セッションを操作するための一連のセッション関数があります。セッションを破棄したことを確認するには、次のように明示的に呼び出す必要があります。

   session_destroy();

セッションを破棄していない場合、セッションはセッション タイムアウト後にガベージ コレクションを行います。ガベージ コレクションは、session.gc_maxlifetime、session.gc_divisor、および session.gc_probability のパラメーターに依存します。ガベージ コレクションがすべてのセッションで確実に実行されるようにするには、session.gc_probability を 100% に追加する必要があります。ただし、特にトラフィックの多いサーバーの場合は、サーバーにオーバーヘッドが確実に追加されます。

セッションを明示的に追跡せず、使用後に破棄すると、セッション管理の一部を OS に任せることになります。PHP.net のメモを参照してください。

注: デフォルトのファイルベースのセッション ハンドラを使用している場合、ファイル システムはアクセス時間 (atime) を追跡する必要があります。Windows FAT はそうではないので、atime 追跡が利用できない FAT ファイルシステムまたはその他のファイルシステムで行き詰まっている場合は、セッションのガベージ コレクションを処理する別の方法を考え出す必要があります。PHP 4.2.3 以降、atime の代わりに mtime (更新日) を使用しています。したがって、atime 追跡が利用できないファイルシステムで問題が発生することはありません。

最良の方法は、ブラウザーまたはタブが閉じられたときに Ajax 呼び出しを介してフラグを送信することです。javascript のwindow.onunloadイベントを介して検出できます 。

于 2012-10-13T23:34:38.767 に答える
0

オブジェクトをに入れる$_SESSIONと、スクリプトの終了時にそれらのデストラクタは呼び出されませんが、存在する場合は__sleep()、PHPが$_SESSIONをシリアル化するときにマジック関数が呼び出されます。次のスクリプトがセッションを再開すると、保存されていてソースコードがわかっているオブジェクト(たとえば、session_start()を呼び出す前に要求するか、自動読み込みを使用する)で、__wakeup()メソッドが呼び出されます。

PHPは、セッションが一定時間非アクティブであったことを検出すると、シリアル化ファイルを削除するだけです。

ドキュメントを参照してください:http://php.net/manual/en/language.oop5.magic.php

于 2012-10-14T00:12:05.127 に答える