如何评估服务器请求/数据库插入的成功


How to assess success of server request / database insert

我有一个与服务器对话的应用程序:

  1. 应用向服务器发送请求
  2. 服务器将数据插入数据库
  3. 服务器向应用程序发送一个JSON对象,其中包含各种数据

如果应用程序没有得到一个有效的JSON对象返回,它认为一定是网络错误,并创建一个计时器,试图在一段时间后重新发送请求。

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

我想也许我可以检查非OK HTTP状态,但如果我在PHP中引发致命错误,服务器仍然返回"HTTP 200 OK"状态。

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

是否有任何方法可以在崩溃或超时的PHP脚本上获得HTTP错误状态?

或者其他关于客户如何尽可能好地评估请求是否成功的建议?

如何通过网络错误获得无效的JSON对象?假设您使用HTTP,连接在传输层上由TCP管理,这是一个双向的、可靠的字节流。如果你从服务器接收到一些数据,然后用CRC32检查,副本被管理,丢失的段被GoBack-N强制再次发送。

TCP处理所有 ,所以当您在设备上发现一个无效的JSON对象时,它一定是由服务器上的一个故障进程引起的。在向设备发送响应之前,可能会在服务器上实现无效的JSON或处理错误。您必须在服务器上识别错误!只要回滚数据库操作,并向设备发送一个错误消息,这样它就可以再次启动该命令,如果它想这样做的话。

好吧。如果服务器成功处理了您的请求,并且在设备接收响应之前丢失了连接,该怎么办?必须警告设备,因为TCP无法正常关闭连接!因此,设备知道它发送了(或者可能没有)一个请求,但没有收到响应。设备不知道的是,它的请求已被成功处理或出现了错误。

太糟糕了。你在应用层,你必须处理这个问题。我将为每个请求创建一个标识并将其存储在服务器上。当设备发送带有相同标识的相同命令时,服务器只会返回类似这样的响应:"已经完成了,老板"。这是类似于 TCP如何处理这个,但在传输层。存储标识,只要你愿意,但我认为你可以删除它,如果TCP连接成功关闭:设备收到响应。

如果问题只是在执行时间上,也许你可以从php脚本中引发它。

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