1

次のようにサーバーと通信するアプリがあります。

  1. アプリがサーバーにリクエストを送信します
  2. サーバーはデータベースにデータを挿入します
  3. サーバーは、JSON オブジェクトをさまざまなデータとともにアプリに送信します

アプリが有効な JSON オブジェクトを返さない場合、アプリはネットワーク エラーが発生したと見なし、しばらくしてからリクエストの再送信を試みるタイマーを作成します。

ただし、おそらく最初のリクエストが挿入されたため、リクエストがデータベースに2回挿入されることがありますが、スクリプトはJSONオブジェクトの生成に失敗しました(おそらくスクリプトが途中でクラッシュまたはタイムアウトしたため)。次に、アプリは「リクエストが失敗しました。もう一度やり直さなければなりません」と考え、最初のリクエストが実際に挿入されたにもかかわらず、2 番目のリクエストを送信し、重複してしまいます。

OK 以外の HTTP ステータスをチェックできるのではないかと考えましたが、PHP で致命的なエラーを引き起こした場合でも、サーバーは「HTTP 200 OK」ステータスを返します。

query("insert into blah values (...");
non_existent_function();
generate_response();

PHP スクリプトがクラッシュまたはタイムアウトしたときに、HTTP エラー ステータスを取得する方法はありますか?

または、クライアントがリクエストが成功したかどうかの評価を可能な限り適切に行う方法についての他のアドバイスはありますか?

4

2 に答える 2

0

JSONネットワークエラーで無効なオブジェクトを取得するにはどうすればよいですか? HTTPを使用すると仮定すると、接続はトランスポート層でTCPによって管理されます。これは、双方向で信頼性の高いバイトストリームです。サーバーからデータを受け取った場合、CRC32 でチェックされ、重複が管理され、失われたセグメントが GoBack-N によって強制的に再送信されます。

TCP はすべてを処理するため、デバイスで無効なJSONオブジェクトが見つかった場合、サーバー上のプロセスの誤動作が原因である必要があります。JSONデバイスに応答を送信する前に、無効サーバー上のエラーを特定する必要があります。データベース操作をロールバックし、エラー メッセージをデバイスに送り返すだけで、必要に応じてコマンドを再度開始できます。

わかった。サーバーがリクエストを正常に処理し、デバイスがレスポンスを受信する前に接続が失われた場合はどうなるでしょうか。TCP が正常に接続を閉じることができなかったため、デバイスに警告する必要があります。したがって、デバイスは、要求を送信した (または送信しなかった) が、応答を受信しなかったことを認識します。デバイスが認識していないことは、その要求が正常に処理されたか、エラーが発生したことです。

残念な。あなたはアプリケーション層にいるので、これに対処する必要があります。リクエストごとに ID を作成し、サーバーに保存します。デバイスが同じ ID で同じコマンドを送信すると、サーバーは次のような応答のみを返します。これは、TCP がこれを処理する方法とていますが、トランスポート層で行われます。ID は必要な限り保存しますが、TCP 接続が正常に閉じられた場合は削除できると思います: デバイスが応答を受信しました。

于 2013-01-12T11:55:42.687 に答える
-1

問題が実行時のみにある場合は、phpスクリプトから問題を発生させることができます。

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

しかし、それでもアプリは本当に成功したかどうかを知りません。

于 2013-01-12T11:40:41.980 に答える