0

私はPHPで書かれたウェブサイトを持っています。ユーザーの 1 人は、2 つの ISP との 2 つのインターネット接続を持っている建物にいますが、ネットワークは 1 つです。そのため、ネットワーク上の任意のコンピューターがいずれかの Web 接続を介して接続する可能性があり、要求の途中で切り替えが発生する場合があるようです。これにより、スクリプトで内部サーバー エラーが発生することがあります。残念ながら、私の共有ホストのログにはあまり詳細がないようです。

だから、これが私の推測です。私のスクリプトはセッションを使用します。ユーザーがインターネット接続 1 でリクエストを送信すると、セッション ファイルがロックされます。その要求が処理されているため、インターネット接続 1 が切断され、インターネット接続 2 がオンになります。Apache/PHP は、応答をインターネット接続 1 (もう存在しません) に送り返そうとし続けます。ユーザーがインターネット接続 2 経由でページをリロードしようとします。PHP は、最初のスクリプトが終了してセッション ファイルのロックが解除されるのを待ちますが、決して終了しないため、最終的に内部サーバー エラーで終了します。

それで、どうすればこれを回避できますか?セッション ファイルが最後にロックされてから時間が経過した場合に、セッション ファイルを強制的にロック解除する方法はありますか? (実行に 3 秒以上かかったスクリプトはありません。たとえば、ロックが 15 秒以上経過している場合は、古いスクリプトが間違った IP アドレスにファイルを提供するのを待っていて、強制終了される可能性があることを意味します。 ) ありがとう!

4

1 に答える 1

0

私は問題を解決したと思います。したがって、私が知る限り、問題は、要求が開始された場合にサーバーがセッションファイルのロックを解除しなかったが、ファンキーなインターネット接続が原因で失敗したことでした. そのため、ユーザーがリクエストを送信し、session_start() が呼び出されてセッション ファイルがロックされ、サーバーがクライアントへのレスポンスの送信を開始しますが、クライアントは半分消えます。クライアントは新しい IP アドレスを介して新しい要求を送信し、session_start() が呼び出されますが、セッション ファイルがロック解除されるまで待機する必要があるため、待機して待機し、最終的にタイムアウトします。しかし、私は自分のサイトでこれを解決しました。私のサイトの仕組みは次のとおりです。 1. サーバーがリクエストを取得します。2. サーバーは要求の処理を行い、ユーザーの情報を、echo-as-you-go メソッドではなく、さまざまな変数に格納します。3. 次に、template.php をインクルードします。保存したさまざまな変数が正しい場所に表示されます。したがって、私のコード フローは最初にすべての処理を行い、処理が完了した後にすべてのユーザー エコーを行います。そこで、template.php ファイルの先頭に「session_write_close();」を含めました。これにより、スクリプトが終了するまで待つのではなく、応答がユーザーに送信される前に手動でセッション ファイルが解放されます。そのため、ユーザーが転送中に姿を消した場合、セッション ファイルのロックが解除され、ユーザーは新しい要求を送信でき、ロックされたセッション ファイルにぶつかることはありません。これにより、スクリプトが終了するまで待つのではなく、応答がユーザーに送信される前に手動でセッション ファイルが解放されます。そのため、ユーザーが転送中に姿を消した場合、セッション ファイルのロックが解除され、ユーザーは新しい要求を送信でき、ロックされたセッション ファイルにぶつかることはありません。これにより、スクリプトが終了するまで待つのではなく、応答がユーザーに送信される前に手動でセッション ファイルが解放されます。そのため、ユーザーが転送中に姿を消した場合、セッション ファイルのロックが解除され、ユーザーは新しい要求を送信でき、ロックされたセッション ファイルにぶつかることはありません。

その修正を入れて以来、私はもう苦情を聞いていません. (補足として、ユーザーは他の Web サイトで問題を抱えていますが、私のサイトは標準以下のインターネット接続に対して可能な限り最善の方法で反応するようにしたいと考えています。)

于 2013-02-12T15:53:04.000 に答える