5

したがって、これは言語固有の質問と同じくらい理論的な質問ですが、これを考慮してください。

バックグラウンドで実行される(PHPを使用して)かなりシステム集約的なプロセスを実行するためにPHPが必要ですexec();が、ユーザーがその特定のページを離れると、プロセスは強制終了されます。

セッション変数やその他のサーバー側変数を使用していないため、デッドマンスイッチがこれを実装する簡単な方法であることにすぐに気付きました。

if($_SERVER['REQUEST_URI'] !== 'page_with_session.php'){
    //Instead of 'session_destroy();' this would be used to kill said process
}

いずれにせよ、PHPでwhileループを実行したり、Pythonスクリプトでタイマーをリセットしたり、15秒ごとにスクリプトを再呼び出ししたりして、スクリプトが終了してプロセスを強制終了しないようにします。ただし、ユーザーがページを離れると、スクリプトは呼び出されますが、プロセスを強制終了する前にリセットすることはできません。

このアイデアにギャップのある穴はありますか?そうでない場合、PHP / JSでの実装はどのようになりますか?私がそれが機能しているのを見る順序は次のようになります:

  1. ページがユーザーによってヒットされた
  2. <?php exec('killer.py') ?>
  3. killer.py:
    1. 20秒間聞きます-応答がない場合...
    2. os.system('pkill process')
  4. <?php while(true){sleep(15); exec('killer.py no_wait_dont');} ?>

皆さんの考えは大歓迎です!

石工

4

2 に答える 2

3

Javascriptははるかに簡単で、ほぼ同じくらい安全です(つまり、それほど安全ではありません)。

10秒ごとに1回(ajax経由で)ping.phpに何かを投稿するjavascriptping関数を作成するだけです。このping.phpは、ユーザーセッションで最後のpingが受信されたときにログに記録されます(たとえば、$_SESSION['last_ping']

$_SESSION['last_ping']現在の時刻と比較することで、他のページからのユーザーアクティビティを確認できます。実行時間のかかるページにこれを追加する必要がありますが、確かに機能します。

于 2012-08-02T22:05:51.767 に答える
2

JSでハートビートを実装します。一定時間以上停止した場合は、サブプロセスを強制終了します。

  • jsはリクエストを送信します
  • php / pythonはバックグラウンドでサブプロセスを開始し、pidをjsに返します
  • jsは、指定されたpidでphp/pythonにpingを実行します
  • php / pythonは、たとえばSIGUSR1を送信することにより、IPCを介してpidに対応するサブプロセスに信号を送ります。
  • サブプロセスが時間内に信号を受信しない場合。それは死にます、すなわち、サブプロセスで一定の自己破壊カウントダウンがあります

サブプロセスに自己破壊メカニズムを追加できない場合は、シグナルを受信して​​サブプロセスを強制終了するウォッチャープロセスが必要です。ウォッチャープロセスが実行されていることを確認する必要があるため、信頼性は低くなります。

于 2012-08-02T22:18:55.430 に答える