1

我有一个与服务器对话的应用程序,如下所示:

  1. 应用程序向服务器发送请求
  2. 服务器将数据插入数据库
  3. 服务器向应用程序发送一个带有各种数据的 JSON 对象

如果应用程序没有返回有效的 JSON 对象,它会假定一定存在网络错误并创建一个计时器,该计时器会在一段时间后尝试重新发送请求。

但是,我注意到有时请求会两次插入数据库,可能是因为插入了初始请求,但随后脚本未能生成 JSON 对象(可能是因为脚本在中途崩溃或超时),并且然后应用程序认为“嘿,我的请求失败,我必须再试一次”,然后它发送第二个请求,即使实际上插入了第一个请求,并且您最终得到重复。

我想也许我可以检查一个不正常的 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 无法正常关闭连接!因此,设备知道它发送(或可能不发送)请求但没有收到响应。设备不知道的是,它的请求已成功处理或已引发错误。

太糟糕了。你在应用层,你必须处理这个。我会为每个请求创建一个标识并将其存储在服务器上。当设备发送具有相同标识的相同命令时,服务器只会发回类似这样的响应:“已经完成老板”。这类似于TCP 处理此问题的方式,但在传输层上。只要您愿意,就可以存储标识 - 但我认为如果 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 回答