0

小さなWebアプリの開発に使用したPHPは初めてです。私の設計では、最初は使いやすいと思っていた機能を頼りにしていましたが、深く掘り下げるほど、おそらくかなり根本的な問題であることがわかりました。

設定は次のとおりです。

  • データのブロックがあります。それらを data_1,...,data_n と呼びましょう

  • 任意の i について、data_i にアクセスできない場合があります

  • ユーザーが接続すると、利用可能な最初の大量のデータが取得され、アクセス不可としてマークされます

  • ユーザーが作業を停止すると、データに再びアクセスできるようになります

  • ログインはなく、セッションIDはユーザー識別に使用されます

  • データは MySQL データベースに保存されます

ここで、リクエストに応じて、ユーザーがデータでテーブルをロックし、最初に利用可能なものを見つけ、マークを設定してテーブルのロックを解除するように実装しました。

問題は、ユーザーがマークを削除しない場合です。デフォルトで、ある時点でデータを再び利用できるようにする必要があります。

JS を試しましたが、Window.onbeforeunload の実行が保証されていません (クラッシュ時など)。

接続をポーリングする PHP スクリプトを実行してみました。しかし、その間に他のスクリプトを実行する必要があり、その時点でセッション データにアクセスできるのは 1 つのスクリプトのみであり、ポーリング スクリプトが他のスクリプトの実行をブロックするため、これは不可能であることがわかりました。

ユーザーが排他的にアクセスできるデータとの各通信でタイムスタンプを保存することで問題を解決しました(そして、タイムアウトを防ぐためにウィンドウが開いている間に接続を確立するスクリプトを追加しました)。新しいユーザーが来ると、タイムスタンプをチェックし、一時停止が十分に長ければ、データを取得してタイムスタンプを保存します。

ただし、私の解決策は回避策であり、問​​題を実際に解決するものではありません。グーグルは、接続が失われた後も実行を維持する方法の問題について誰もが尋ねていることを示していますが、接続が失われるまでに実行がないため、純粋にこのケースではありません。

問題は、PHP 5.4 を使用して、接続が失われた後に実行されるスクリプトを作成するにはどうすればよいかということです。

ありがとう。

4

2 に答える 2

0
  1. ソケットを使用する必要があります。

2.「例 #1 ignore_user_abort() の例」を参照してください。

于 2013-10-17T13:50:58.360 に答える