我有一个与服务器对话的应用程序:
如果应用程序没有获得有效的JSON对象,则会假定必须存在网络错误并创建一个计时器,该计时器会在一段时间后重新发送请求。
但是,我注意到有时请求会被插入数据库两次,可能是因为插入了初始请求,但是脚本无法生成JSON对象(可能是因为脚本在中途崩溃或超时) ),然后应用程序认为“嘿,我的请求失败,我必须再试一次”,然后它发送第二个请求,即使第一个请求实际插入,你最终得到重复。
我想也许我可以检查一个不正常的HTTP状态,但如果我在PHP中引发致命错误,服务器仍然会返回“HTTP 200 OK”状态。
query("insert into blah values (...");
non_existent_function();
generate_response();
有什么办法可以在崩溃或超时的PHP脚本上恢复HTTP错误状态吗?
关于客户如何尽可能好地评估请求是否成功的其他建议?
答案 0 :(得分:0)
如何通过网络错误获取无效的JSON
对象?假设您使用 HTTP ,则通过 TCP 在传输层上管理连接,这是一个双向,可靠的字节流。如果您从服务器收到一些数据,而不是通过CRC32检查,则会管理重复数据,并且GoBack-N会强制重新发送丢失的数据段。
TCP处理所有内容 ,因此当您在设备上发现无效的JSON
对象时,必须由服务器上的故障进程引起。在将响应发送到设备之前,可以在服务器上实现无效的JSON
或处理错误。您必须在服务器上识别错误!只需回滚数据库操作,然后将错误消息发送回设备,这样就可以再次启动命令。如果愿意的话。
好。如果服务器成功处理了您的请求并且连接在设备收到响应之前丢失,该怎么办?必须对此设备发出警告,因为TCP无法正常关闭连接!因此,设备知道它发送(或可能不是)请求但没有收到响应。设备不知道的是,它的请求已经成功处理或者出现了错误。
太糟糕了。您位于应用层,您必须处理此问题。我会为每个请求创建一个标识并将其存储在服务器上。当设备发送具有相同标识的相同命令时,服务器只会发回类似这样的响应:“已经完成的老板”。这与类似 TCP如何处理此问题,但在传输层上。只要您愿意,就可以存储标识 - 但我认为如果TCP连接成功关闭,您可以将其删除:设备收到响应。
答案 1 :(得分:-1)
如果问题只出现在执行时间,也许你可以从php脚本中提出它。
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
然而,该应用程序仍然不知道它是否真的成功。