2016-05-03 9 views
2

サイトのログインとログアウト時に、自分のデータベースにユーザーアクティビティを記録しようとしています。これはうまくいきますが、タブやブラウザからページを閉じると、ログアウトクエリを実行する方法がないため、ユーザーはレコードを使用してサイトからログアウトしません。セッションの破棄またはgarabgeコレクションの前に関数を呼び出すPHP

方法1: 私はonbeforeunloadを試してみましたが、これはページが閉じる前にトリガしていないようです。

方法2: 私はPHPに送信されたAJAXキープアライブ・トークンを使用する方法をしようとするだろうが、これは1分ごとに実行する必要があるだろうと高トラフィック負荷を引き起こす可能性があります。

方法3: 私はalterantiveが​​1分を設定し、破壊するセッションコールバックを経由してログアウトクエリへの呼び出しを追加することです期待していました。

これはどれが最良の方法でしょうか、これを達成するより良い方法はありますか?

phpのセッションまたはphpガベージコレクションが行われる前にカスタム関数(クエリ)をトリガする方法はありますか?

UPDATE

みんなのアドバイスを取り、 '方法1' を試みることにしました。今のところ、これは私の試みが、そのまだ完全に機能していないです:

var isClosePage = true; 

    //detect f5 and backspace page navigation 
    $(document).on('keypress', function(e) 
    { 
     if (e.keyCode == 116) 
     { 
      alert('f5'); 
      isClosePage = false; 
     } 
     if (e.keyCode == 8) 
     { 
      alert('backspace'); 
      isClosePage = false; 
     } 
    }); 

    //detect back and forward buttons 
    $(window).bind('statechange',function() 
    { 
     alert('back'); 
     isClosePage = false; 
    }); 

    //detect page button press 
    $('html').on('mouseenter', function() 
    { 
     console.log('mouse has enetered!'); 
     isClosePage = false; 
    }); 

    //detect browser buttons press 
    $('html').on('mouseleave', function() 
    { 
     console.log('mouse has left!'); 
     isClosePage = true; 
    }); 

    //make ajax call (logout) to server if above events not triggered 
    $(window).on('beforeunload', function(e) 
    { 
     if(isClosePage) 
     { 
      $.ajax(
      { 
        url:'php/function/active-user.php?logout=ajax', 
        dataType: 'jsonp', 
        crossDomain: true, 
        async: false 
      }); 

      //return 'some default message'; 
     } 
     else 
     { 
      isClosePage = true; 
     } 
    }); 

誰もが、私はよくこの作業を行うことができますどのようにどんなも改善を提案することはできますか?

答えて

0

の方法1について話しているときは、クライアント側で正しく処理していますか?
インタフェースはwindow.onbeforeunloadであり、これは使用例です:ページが(閉じたタブ/ウィンドウ/ブラウザ)をアンロードされる前に

window.onbeforeunload = function(e) { 
    // call server script to log the user activity to database ... 
}; 

イベントwindow.onbeforeunloadがトリガされます。

0

私はMarcoSの答えを少し拡張したいと思います。 window.onbeforeunloadは動作するはずですが、これはイベントのハンドラを設定するための推奨方法ではありません。これはプロパティなので、このイベントに付随する他のスクリプトはリスナーを上書きし、関数が呼び出されることはありません。

次のようにこのイベントに登録する好ましい方法は次のとおりです。

window.addEventListener('beforeunload', function (evt) { 

}, false); 

またunload

window.addEventListener('unload', function (evt) { 

}, false); 

希望にイベントリスナーを付けることができ、これは、私はjQueryのを持っていた

+0

Orginally役立ちますこれは大変だった。私はあなたの最初の例を試して、内部にアラートを追加しましたが、同じ結果を得ています(ページはアラートポップアップなしで閉じます)。このアラートは、ブラウザタブでページが閉じられる前にポップアップする必要がありますか? – Orbitall

+0

私が知っている限り、ページがアンロードされたときに 'alert()'を呼び出すことはできません。しかし、あなたのコードに 'event.returnValue'を設定することで警告ボックスを表示することは可能です。私は[jsfiddle](https://jsfiddle.net/u6kzwmov/1/)を作成しました。これを実証するあなたのために。 –

+0

ええ、私はこのアンロードを使用してアンロードする前に(非常にハッキーです)、クローズされているページを検出しようと何度も試みました。ユーザーがブラウザを閉じたというメッセージをサーバーに送信する必要があるどのようにこれを行うにはどのような提案? – Orbitall

関連する問題